Unity 实用教程之 简单地图导航循环长箭头实现

2025-09-29 03:35:01

1、打开Unity,新建一个空工程,具体如下图

Unity 实用教程之 简单地图导航循环长箭头实现

2、在场景中,新建一个Shader,并打开编辑代码,具体如下图

Unity 实用教程之 简单地图导航循环长箭头实现

Unity 实用教程之 简单地图导航循环长箭头实现

3、Shader的具体代码如下:

Shader"Custom/TransparentOverlay"   

{    

    Properties    

    {    

        _MainTex ("MainTex(RGBA)",2D) = "white" {}    

    }  

    SubShader    

    {    

        LOD 100  

        Cull Off Lighting Off ZWrite Off ZTest Always  

        Blend SrcAlpha OneMinusSrcAlpha  

        Tags  

        {  

            "Queue" ="Overlay"  

            "IgnoreProjector" ="True"  

            "RenderType" ="Transparent"  

        }  

        Pass  

        {  

            SetTexture[_MainTex]  

        }  

    }  

}  

4、在工程中,导入一张箭头图片,并新建一个Material,把Material的Shader改成刚才新建的Shader,贴图设置为导入的箭头图片,具体如下图

Unity 实用教程之 简单地图导航循环长箭头实现

5、在场景中新建一个“Plane”,设置如下图,并且把刚才新建的Material,赋给“Plane”,具体如下图

Unity 实用教程之 简单地图导航循环长箭头实现

6、在场景中新建一个脚本,并打开进行编辑,具体如下图

Unity 实用教程之 简单地图导航循环长箭头实现

Unity 实用教程之 简单地图导航循环长箭头实现

Unity 实用教程之 简单地图导航循环长箭头实现

7、脚本具体代码如下:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class MapLine : MonoBehaviour {

    private Vector3 startPos = Vector3.one;  

    private Vector3 endPos = Vector3.one;  

    private Vector3 rotation = Vector3.zero;  

    private Material material;  

    private bool isMove;  

    private Vector2 moveDir;  

    private Vector2 resetOffset;  

    void Awake()  

    {  

        isMove = false;  

        moveDir = new Vector2(0, 0.01f);  

        resetOffset = new Vector2(0, 100);  

        material =GetComponent<Renderer>().material;  

    } 

    /// <summary>  

    /// 设置材质的Offset的属性,让箭头移动起来  

    /// </summary>  

    private void Update()  

   {  

        if(isMove)  

        {  

            if (material.mainTextureOffset ==resetOffset)  

                material.mainTextureOffset =moveDir;  

            material.mainTextureOffset += -moveDir;  

        }  

        if(Input.GetKeyDown (KeyCode.A)){

            SetLine (new Vector3 (0, 0, 0), new Vector3 (5,0,5));

        }

    }  

    public void SetLine(Vector3 startPos,Vector3 endPos)  

    {  

        this.startPos = startPos;  

        this.endPos = endPos;  

        transform.localScale = Vector3.one *0.05f;  

        transform.position = startPos;  

        transform.eulerAngles = Vector3.zero;  

        var scale = transform.localScale;  

        var lineLong = CalLineLong() * 2;  

        scale.z = scale.z * lineLong;  

        transform.localScale = scale;  

        rotation.y = CalLineAngle() ;  

        transform.eulerAngles = rotation;  

        material.mainTextureScale = new Vector2(1, lineLong);  

        transform.Translate(0,0,lineLong / 4,Space.Self); 

        //因为贴图箭头的方向不对,这里角度纠正,刚刚好 Y + 180

        transform.eulerAngles += new Vector3(0, 180, 0); 

        isMove = true;  

    } 

    /// <summary>  

    /// 计算行军路线长度  

    /// </summary>  

    private float CalLineLong()  

    {  

        return Mathf.Sqrt(Mathf.Pow(startPos.x- endPos.x, 2) + Mathf.Pow(startPos.z - endPos.z, 2));  

    } 

    /// <summary>  

    /// 计算行军路线角度  

    /// </summary>  

    private float CalLineAngle()  

    {  

        //斜边长度  

        float length = Mathf.Sqrt(Mathf.Pow((startPos.x- endPos.x), 2) + Mathf.Pow((startPos.z - endPos.z), 2));  

        //对边比斜边 sin  

        float hudu =Mathf.Asin(Mathf.Abs(startPos.z - endPos.z) / length);  

        float ag = hudu * 180 / Mathf.PI;  

        //第一象限  

        if ((endPos.x - startPos.x) >= 0&& (endPos.z - startPos.z >= 0))  

            ag = -ag + 90;  

        //第二象限  

        else if ((endPos.x - startPos.x) <=0 && (endPos.z - startPos.z >= 0)) 

            ag = ag - 90;  

        //第三象限  

        else if ((endPos.x - startPos.x) <=0 && (endPos.z - startPos.z) <= 0) 

            ag = -ag +270;  

        //第四象限  

        else if ((endPos.x - startPos.x) >=0 && (endPos.z - startPos.z) <= 0) 

            ag = ag + 90;  

        return ag;  

    }  

}

8、脚本编译正确,回到Unity界面,把脚本赋给“Plane”,具体如下图

Unity 实用教程之 简单地图导航循环长箭头实现

9、运行场景,结果如下图

Unity 实用教程之 简单地图导航循环长箭头实现

10、到此,《Unity 实用教程之 简单地图导航循环长箭头实现》讲解结束,谢谢

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢