U3D利用LineRender制作移动引导

效果图

要实现这个功能,需要用到网格导航,因为射线的点是通过读取网格导航的相关数据获取的,当然,为了得到更好的视觉效果,你还需要修改射线的材质
*材质球属性
箭头素材

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);
            }
        }

    }


猜你喜欢

转载自blog.csdn.net/weixin_38764837/article/details/90749548