Unity LineRender
之前我也关于linrender划线写过一篇博客 这个是最近项目中使用到的功能就研究了下 当然也欢迎大佬帮忙优化代码
闲话不多说 先上划线的代码
//画线的端点
public GameObject[] AllPosition;
//移动的点
public Transform MoveCube;
//移动的坐标
public Vector3[] VecValue;
int num = 0;
//LineRenderer
private LineRenderer lineRenderer;
void Start()
{
//画线
//添加LineRenderer组件
lineRenderer = gameObject.GetComponent<LineRenderer>();
//设置颜色
lineRenderer.startColor = new Color32(198, 171, 118, 255);
lineRenderer.endColor = new Color32(198, 171, 118, 255);
//设置宽度
//lineRenderer.SetWidth(0.02f, 0.02f);
lineRenderer.startWidth = 0.03f;
lineRenderer.endWidth = 0.03f;
}
VecValue = new Vector3[AllPosition.Length];
for (int i = 0; i < AllPosition.Length; i++)
{
VecValue[i] = AllPosition[i].transform.localPosition;
}
相比较之前的划线 多了一个需要移动的点跟目标点位 划线方法 跟随移动的Transform来不断移动坐标 目标坐标就是设置的数组点 当然这个方法还需要在update中调用 并且 如果前面的节点不显示 后面的节点也不画线 由于是触摸屏 所以要根据节点是否显示 控制划线 所以要有结点显示与否的判定
//检测数组中是否包含某些数据
public bool DetectionData(int num)
{
if (num == 0)
{
return true;
}
//如果包含
for (int i = 0; i < num + 1; i++)
{
if (!Number.Contains(i))
{
return false;
}
}
return true;
}
public List<int> Number = new List<int>();
public void LineMove()
{
for (int i = 0; i < AllPosition.Length; i++)
{
if (AllPosition[i].activeSelf)
{
if (!Number.Contains(i))
{
Number.Add(i);
Maxnums = i;
NumberValueSet();
}
}
else
{
if (Number.Count > i)
{
Number.RemoveAt(i);
Maxnums = i - 1;
}
}
}
}
根据这样的方法去判断 前面的结点是否显示 如果显示 在开始划线 划线结束 将所有划线的点坐标跟随物体的点坐标 这样移动的时候线条也跟着移动
public int Maxnums = 0;
bool IsValue = true;
bool IsLine = false;
void Update()
{
LineMove();
if (DetectionData(Maxnums) && Maxnums > 0)
{
AllActive(Maxnums + 1);
}
}
//画线方法
public void AllActive(int MaxNum)
{
if (IsValue)
{
VecValue = new Vector3[MaxNum];
for (int i = 0; i < MaxNum; i++)
{
VecValue[i] = AllPosition[i].transform.position;
}
MoveCube.position = VecValue[0];
IsValue = false;
IsLine = true;
}
if (IsLine)
{
//画线
lineRenderer.positionCount = MaxNum;
MoveCube.position = Vector3.MoveTowards(MoveCube.position, VecValue[num], 5f * Time.deltaTime);
for (int i = num; i < MaxNum; i++)
{
lineRenderer.SetPosition(i, MoveCube.position);
}
lineRenderer.SetPosition(num, MoveCube.position);
if (MoveCube.position == VecValue[num])
{
num++;
if (num > MaxNum - 1)
{
num = MaxNum - 1;
IsLine = false;
}
}
}
if (!IsLine)
{
if (lineRenderer.positionCount != MaxNum)
{
lineRenderer.positionCount = MaxNum;
}
for (int i = 0; i < MaxNum; i++)
{
lineRenderer.SetPosition(i, AllPosition[i].transform.position);
}
}
}
在update 中调用方法 并且判断结点 显示在开始划线
当然还有另外一种方法 就是将判断结点是否显示 放在单个结点上检测 用一个控制器 控制这些划线动画 当然也更合理一些 不需要重新开始绘制线条
实现的效果