最近在做大地图,行军导航过程中会试用到导向箭头,这里整理下实现的过程。
最终效果

箭头实例图

思路分解
1 地图上会有很多这种指向的箭头,同时长度是不固定的,需要根据不同的起始点和终点进行计算角度和方向
2 长度在Unity中可以通过scale进行控制
3 需要重复的箭头,要实现图片平铺的效果,这里就有一个Tiling的概念
4 如果需要移动,可以使用材质的Offset属性
5 选择角度计算过程中,需要考虑到四个象限的不同情况
6 箭头显示要在最上层,不能被地表的物体遮挡
看到这些思路你们能实现的出来吗?不卖官司,接着往下看。
具体实现
原料:
Plane一只,做2D的时候用Sprite原理也是一样的;
箭头图片一张;
Shader文件一个;
材质球一枚;
CS文件一个;

操作步骤:
1 先处理材质球,新建一个Shader,命名为TransparentOverlay,具体代码如下:

[Shell] 纯文本查看 复制代码
?
Shader"Custom/TransparentOverlay" 
    Properties 
    
        _MainTex ("MainTex(RGBA)",2D) = "white" {} 
    }
    SubShader 
    
        LOD 100
        Cull Off Lighting Off ZWrite Off ZTestAlways
        Blend SrcAlpha OneMinusSrcAlpha
        Tags
        {
            "Queue" ="Overlay"
            "IgnoreProjector" ="True"
            "RenderType" ="Transparent"
        }
        Pass
        {
            SetTexture[_MainTex]
        }
    }
}

2 利用该Shader创建一个材质球,将箭头图片赋给材质球

箭头和对应的材质球

3 在场景中新建一个Plane,将材质球赋个Plane,调整Plane到你需要的尺寸,做成预制件

我所用的参数,根据场景自行修改

4 新建一个C#脚本,代码有点长,直接看注释咯,需要额外说的是,计算长度和角度公式大致如下,在其他地方使用的时候还是要根据当前场景的相机,地图大小等等进行相应的微调。

[C#] 纯文本查看 复制代码
?
usingUnityEngine;
///<summary>
/// 行军路线
///</summary>
public classMapLine : 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;
        }
    }
    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 = newVector2(1, lineLong);
        transform.Translate(0,0,lineLong / 4,Space.Self);
        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;
    }
}

5 将脚本附加到预制件中,通过设置SetLine方法设置起点和终点就可以在地图上画箭头了。

行军导航过程中导向箭头相关推荐

  1. 同一肢体不同关节的运动想象过程中的多通道脑电图记录

    ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 导读 代表自己周围环境的认知地图对于空间导航是必需的.但是,与其构成要素(例如各个地标)相比,由各个要素之间的关系构成的相干空间信息的神经基质在很大程度上仍然 ...

  2. 高速公路导航提示中IC、JC、SA、PA等字样的含义

    高速公路导航提示中IC.JC.SA等字样的含义 经常在导航过程中见到IC.JC.SA等字样,很多人都不知道它们的含义是什么.下面我们就逐一的做出解释. IC : Inter Change 英文缩写,意 ...

  3. 利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录)

    利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录)   作者:王可利(Star·星星) 总结: 今天学习的jQ类库的使用,代码重复的比较多需要完善.严格区分大小写,在 $(" ...

  4. vue,uniapp带有导航栏的轮播图swiper组件,滑动的同时点击导航栏切换,使异步滑动过程中位置发生改变,不能正常展示的问题解决(这里用uiniapp的swiper组件)

    <!-- 顶部tabs切换 --><view v-show="totalListArr.length>1" class="comp-tabs&qu ...

  5. Web浏览过程中涉及到的协议

    当你要访问一个网页时,首先要在浏览器中输入网址,假如我们在xx校园网内,访问http://www.cfca.com.cn/chanpin/chanpin.htm,它的各部分含义如下: http:// ...

  6. 营销型网站的概念及设计制作过程中的注意事项

    营销型网站的提出: 1. 企业网站在国内发展从技术角度经历了两大发展阶段,第一阶段是以静态HTML为代表的企业网站建设,这个阶段ASP技术尚未发展到全面普及应用的程度,更多的企业网站建设在满足企业信息 ...

  7. Science:Knight组发表尸体降解过程中的微生物组

    Metcalf, J. L., et al. (2016). "Microbial community assembly and metabolic function during mamm ...

  8. Sciences:Knight组发表尸体降解过程中的微生物组

    Metcalf, J. L., et al. (2016). "Microbial community assembly and metabolic function during mamm ...

  9. 16S+功能预测发Sciences:尸体降解过程中的微生物组

    Metcalf, J. L., et al. (2016). "Microbial community assembly and metabolic function during mamm ...

  10. 16S+功能预测也能发Sciences:尸体降解过程中的微生物组

    Metcalf, J. L., et al. (2016). "Microbial community assembly and metabolic function during mamm ...

最新文章

  1. 修改tomcat7默认首页,将tomcat7默认目录指向自己的项目目录
  2. objective-C 中使用@Class和 #import区别
  3. LaTeX入门第三集!LaTeX的几个应用!
  4. C++primer第十一章 关联容器 11.3关联容器操作 11.4 无序容器
  5. 268G+训练好的word2vec模型(中文词向量)
  6. day19_java基础加强_动态代理+注解+类加载器
  7. 13万张表+数亿行代码,迁移只需数小时,还是异构数据库
  8. Netty空闲心跳检测机制
  9. 中兴通讯午后复牌:A股涨停 港股盘中涨逾53%
  10. 虚拟化技术(1)——介绍
  11. 此刻心情--我为什么不找女朋友
  12. scala 单例对象 伴生对象
  13. 摄影测量学习总结(较全面易懂)
  14. 小米路由器显示DNS服务器设置错误,小米路由器dns地址怎么设置
  15. div垂直居中和水平居中的多种方式
  16. 浅谈Clean Code
  17. 安卓电子书格式_好学习、求向上 | 转换各类文件格式?一个网站就够了
  18. 网站收录有很多为什么没排名?解决办法
  19. 关于营销自动化,30个惊人的事实
  20. kafka tool 2.1连接kerberos的kafka(cdh6.3.2)集群。

热门文章

  1. 深度复盘 | 蚂蚁集团万级规模 k8s 集群基建之路
  2. 当我讲容灾交付前,我先说点啥?
  3. 蚂蚁金服副总裁刘伟光:浅析银行数字化转型之二「打造金融敏捷中心」
  4. 登录emc磁阵提示java版本低_安装完打开 eclipse 提示 JVM 版本较低
  5. 【单目标优化求解】基于matlab混沌算法求解单目标问题【含Matlab源码 1410期】
  6. 【路径规划】基于matlab A_star算法机器人走迷宫路径规划【含Matlab源码 1332期】
  7. 【数字信号处理】基于matlab GUI正选信号时域+频域分析【含Matlab源码 887期】
  8. 机器学习--线性回归1_线性回归-进入迷人世界的第一步
  9. 创建dqn的深度神经网络_深度Q网络(DQN)-III
  10. linux脚本编写乘法口诀,shell脚本编写乘法口诀