要实现这个功能,需要用到网格导航,因为射线的点是通过读取网格导航的相关数据获取的,当然,为了得到更好的视觉效果,你还需要修改射线的材质
*
public class MoveGuide : MonoBehaviour
{
NavMeshAgent Nav;
public LineRenderer lineRenderer;
Vector3 endPoint;
public bool Draw;
public Vector3 Target;
private Material material;
public static MoveGuide instence;
private void Awake()
{
instence = this;
}
// Use this for initialization
void Start()
{
Nav = transform.GetComponent<NavMeshAgent>();
lineRenderer.startWidth = 0.1f;
lineRenderer.endWidth = 0.1f;
lineRenderer.enabled = false;
material = lineRenderer.materials[0];
}
/// <summary>
/// 开启目标指引(其他脚本通过调用这个方法来实现功能)
/// </summary>
public void DrawClick( Vector3 v3)
{
Draw = true;
Nav.SetDestination(v3);
lineRenderer.enabled = true;
}
void FixedUpdate()
{
if (Draw)
{
DrawLine(Target);
}
}
/// <summary>
/// 画线
/// </summary>
private void DrawLine(Vector3 target)
{
//时刻检测路线的点,当大于1的时候,把这些点赋予给LineRenderer来绘制出线条
if (lineRenderer==null)
{
return;
}
if (Nav.path.corners.Length > 1)
{
//根据距离调整Tiling.x,尽量使视觉效果更加美观(转向时射线会有翻转现象,暂时未想到解决方案(也许多创建几个LineRender分段渲染可以解决))
double TilingX = Math.Abs(Math.Pow(Nav.remainingDistance,1.5) - 20);
if (TilingX<8)
{
TilingX = 8;
}
if (TilingX>200)
{
TilingX = 200;
}
material.SetTextureScale("_MainTex", new Vector2((float)TilingX, 1));
//把导航的点实时赋给射线点,并适当调节y轴,避免在部分区域射线被地面覆盖的情况
lineRenderer.positionCount = Nav.path.corners.Length;
Vector3[] path = Nav.path.corners;
for (int i = 0; i < path.Length; i++)
{
path[i] = new Vector3(path[i].x, path[i].y + 0.25f, path[i].z);
}
lineRenderer.SetPositions(path);
}
}
}