using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityAsync; using System; using System.Threading; public class DynamicLine : MonoBehaviour { // Start is called before the first frame update public LineRenderer lineRenderer; public int splitNum = 60; public Action OnTouchIndex; private CancellationTokenSource cancellationTokenSource; // 用于取消上一个任务 private void Start() { lineRenderer = GetComponent(); } public async void SetDynamicPoint(List pos) { // 如果有正在进行的操作,取消它 //if (cancellationTokenSource != null) //{ // cancellationTokenSource.Cancel(); //} //// 创建一个新的 CancellationTokenSource 用于新的操作 //cancellationTokenSource = new CancellationTokenSource(); //CancellationToken token = cancellationTokenSource.Token; if (pos.Count > 0) { int currentIndex = 0; //await new UnityAsync.WaitForSeconds(1.0f); //OnTouchIndex?.Invoke(currentIndex); // 遍历点,检查是否被取消 for (currentIndex = 0; currentIndex < pos.Count - 1; currentIndex++) { lineRenderer.positionCount = currentIndex + 2; Vector3 startPos = pos[currentIndex]; Vector3 endPos = pos[currentIndex + 1]; Vector3 delta = endPos - startPos; Vector3 eachDelta = delta / splitNum; for (int i = 0; i < splitNum; i++) { //// 检查是否取消了当前操作 //if (token.IsCancellationRequested) //{ // return; // 取消操作,退出方法 //} lineRenderer.SetPosition(currentIndex, startPos); lineRenderer.SetPosition(currentIndex + 1, startPos + eachDelta * i); //await new WaitForEndOfFrame(); //await new WaitForEndOfFrame(); //await new WaitForEndOfFrame(); //await new WaitForEndOfFrame(); //await new WaitForEndOfFrame(); } //OnTouchIndex?.Invoke(currentIndex + 1); } } } }