一、需求及效果
显示运动轨迹的时候,要把轨迹逐步显示出来。
比如:这个圆是一个轨迹,要让它逐步显示
备注:圆的轨迹点已知【下图为提前预设好的点】
二、设置点的注意事项
- 步骤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();
}
}