用LineRenderer组件逐步显示一条线

一、需求及效果

显示运动轨迹的时候,要把轨迹逐步显示出来。
比如:这个圆是一个轨迹,要让它逐步显示
请添加图片描述

备注:圆的轨迹点已知【下图为提前预设好的点】
在这里插入图片描述

二、设置点的注意事项

  • 步骤1:设置点的数量:线条包含多少个点
myLineRenderer.positionCount = 2;
  • 步骤2:设置具体的点:用一个Vector3数组进行设置
var ary = new Vector3[2]{
    
    Vector3.one,Vector3.up};//仅作举例之用
myLineRenderer.SetPositions(ary);

三、逐点显示线条

组成圆的所有点:

/// <summary>
/// 构成线条的点
/// </summary>
private List<Vector3> points = new List<Vector3>();
//"动画"逐点显示线条
for (int i = 0; i < points.Count; i++)
{
    
    
    myLineRenderer.positionCount = i + 1;                      //设置点的数量***必须设置***
    var ary = new Vector3[2]{
    
    Vector3.one,Vector3.up};
    myLineRenderer.SetPositions(points.Take(i+1).ToArray());   //设置构成的点
    await UniTask.Delay(20);                                   //20毫秒间隔现实下一个点
}

四、附录代码

using System;
using System.Collections.Generic;
using System.Linq;
using Cysharp.Threading.Tasks;//第三方包
using UnityEngine;

/// <summary>
/// 把一条线按点逐步显示
/// </summary>
public class DisplayLine : MonoBehaviour
{
    
    
    /// <summary>
    /// 要处理的线条
    /// </summary>
    public LineRenderer myLineRenderer;

    /// <summary>
    /// 构成线条的点
    /// </summary>
    private List<Vector3> points = new List<Vector3>();
  
    // Start is called before the first frame update
    void Start()
    {
    
    
        //获取line的Vector3数组
        int count = myLineRenderer.positionCount;
        Vector3[] vec3Ary = new Vector3[count];
        myLineRenderer.GetPositions(vec3Ary);
        points.Clear();
        points.AddRange(vec3Ary.ToList());
        
        //清空线条
        myLineRenderer.positionCount = 0;
    }
    
#if UNITY_EDITOR
    [ContextMenu("测试显示线条")]
#endif
    void test()
    {
    
    
        Func<UniTask> fn = async () =>
        {
    
    
            //动画逐点显示线条
            for (int i = 0; i < points.Count; i++)
            {
    
    
                myLineRenderer.positionCount = i + 1;                      //设置点的数量***必须设置***
                var ary = new Vector3[2]{
    
    Vector3.one,Vector3.up};
                myLineRenderer.SetPositions(points.Take(i+1).ToArray());   //设置构成的点
                await UniTask.Delay(20);                     //20毫秒间隔现实下一个点
            }
        };

        fn().Forget();
    }
}