最近项目要用LineRenderer做人员的轨迹,并且需要给出人员的行进方向,想着直接用个箭头的贴图材质放到LineRenderer上,但是有个问题,人员的轨迹是不固定的,贴图的tile数量就没办法事先确定,想了下,在脚本中根据LineRenderer的长度动态的修改材质的平铺数量,废话不多数,上代码。
为了代码简洁,我这里就用两个点测试下;
void Start()
{
//给LineRenderer两个点
lineRenderer = GetComponent<LineRenderer>();
lineRenderer.positionCount = 2;
Vector3 pos2 = transform.position + Vector3.forward * 10;
Vector3[] tempPoints = new Vector3[2] { transform.position, pos2};
lineRenderer.SetPositions(tempPoints);
}
然后计算下绘制的线段的长度;
Vector3 start = lineRenderer.GetPosition(0);
for (int i = 1; i < lineRenderer.positionCount; i++)
{
length += Vector3.Distance(start,lineRenderer.GetPosition(i));
start = lineRenderer.GetPosition(i);
}
向下取整获得贴图的平铺数;
tileCount = Mathf.FloorToInt(length);
设置LineRenderer;
lineRenderer.material.mainTextureScale = new Vector2(tileCount, 1) * tilingFactor;
这样就可以呢,完整代码如下;
using UnityEngine;
public class LineRenderTest : MonoBehaviour
{
public Vector2 tilingFactor = new Vector2(1f, 1f); // 初始平铺块数
private LineRenderer lineRenderer;
private float length;
private int tileCount;
// Start is called before the first frame update
void Start()
{
//给LineRenderer两个点
lineRenderer = GetComponent<LineRenderer>();
lineRenderer.positionCount = 2;
Vector3 pos2 = transform.position + Vector3.forward * 10;
Vector3[] tempPoints = new Vector3[2] { transform.position, pos2};
lineRenderer.SetPositions(tempPoints);
Vector3 start = lineRenderer.GetPosition(0);
for (int i = 1; i < lineRenderer.positionCount; i++)
{
length += Vector3.Distance(start,lineRenderer.GetPosition(i));
start = lineRenderer.GetPosition(i);
}
tileCount = Mathf.FloorToInt(length);
lineRenderer.material.mainTextureScale = new Vector2(tileCount, 1) * tilingFactor;
}
}
效果如下图。