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); } } } }