推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • 简书地址
  • 我的个人博客
  • QQ群:1040082875

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

最近开发的时候遇到了箭头指向的需求,本来想用我这篇文章中的代码来着:
【Unity3D日常开发】Unity中实现箭头指向效果实现

但是想到这个代码是在Update里面运行,对效率影响比较大,正好看到这个同学给我留言:


我看了一下他这个是通过Shader和MeshRenderer进行实现的,效率应该会更好。但是文章的步骤就我来说有点简单了,可能不知道怎么用,所以就将他的内容再细分一下。

效果图:

原文链接:http://www.devacg.com/?post=1415
作者:追风剑情
首发于:个人博客http://www.devacg.com/

二、正文

2-1、制作Shader

(1)首先,将我们的图片导入:

右键另存为,保存到项目中。

(2)新建Shader,在Project视图中选择Create→Shader→Standard Surface Shader

将代码复制粘贴进去:

Shader "Custom/NavPathArrow"
{Properties{_MainTex("Texture", 2D) = "white" {}_ScrollYSpeed("Y Scroll Speed", Range(-20, 20)) = 2}SubShader{Tags { "Queue" = "Transparent" "RenderType" = "Transparent" }LOD 100//双面渲染Cull Off//Alpha混合Blend SrcAlpha OneMinusSrcAlphaPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};sampler2D _MainTex;float4 _MainTex_ST;fixed _ScrollYSpeed;v2f vert(appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}fixed4 frag(v2f i) : SV_Target{fixed2 uv = i.uv;uv.y += _ScrollYSpeed * _Time;fixed4 col = tex2D(_MainTex, uv);return col;}ENDCG}}
}

2-2、制作材质球

新建材质球,在Project视图中选择Create→Material,命名为NavPathArrow

设置材质球的属性,将Shader设置为Custom/NavPathArrow,将贴图拖进去:

2-3、制作预制体

(1)新建一个Quad对象,在Hierarchy视图,右击选择Create→Quad


将它的材质球换成刚才我们制作的材质球:

拖到Project视图,做成预制体:

2-4、实现代码

新建脚本NavPathArrow.cs,双击打开脚本,编写代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 导航箭头
/// </summary>
public class NavPathArrow : MonoBehaviour
{public MeshRenderer meshRenderer;//箭头3D对象Quadpublic List<Transform> points = new List<Transform>();//路径点private List<MeshRenderer> lines = new List<MeshRenderer>();//显示的路径public float xscale = 1f;//缩放比例public float yscale = 1f;void Start(){//箭头宽度缩放值xscale = meshRenderer.transform.localScale.x;//箭头长度缩放值yscale = meshRenderer.transform.localScale.y;}//画路径public void DrawPath(){if (points == null || points.Count <= 1)return;for (int i = 0; i < points.Count - 1; i++){DrawLine(points[i].position, points[i + 1].position, i);}}//画路径 参数为路径点数组public void DrawPath(Vector3[] points){if (points == null || points.Length <= 1)return;for (int i = 0; i < points.Length - 1; i++){DrawLine(points[i], points[i + 1], i);}}//隐藏路径public void HidePath(){for (int i = 0; i < lines.Count; i++)lines[i].gameObject.SetActive(false);}//画路径private void DrawLine(Vector3 start, Vector3 end, int index){Debug.Log(transform.gameObject.name);MeshRenderer mr;if (index >= lines.Count){mr = Instantiate(meshRenderer);lines.Add(mr);}else{mr = lines[index];}var tran = mr.transform;var length = Vector3.Distance(start, end);tran.localScale = new Vector3(xscale, length, 1);tran.position = (start + end) / 2;//指向endtran.LookAt(end);//旋转偏移tran.Rotate(90, 0, 0);mr.material.mainTextureScale = new Vector2(1, length * yscale);mr.gameObject.SetActive(true);}void OnGUI(){if (GUI.Button(new Rect(20, 40, 80, 20), "显示路径")){DrawPath();}if (GUI.Button(new Rect(20, 80, 80, 20), "隐藏路径")){HidePath();}}
}

2-5、实现功能

新建三个Cube作为路径点,一个Plane作为地板,摄像机直接使用命令Ctrl+Shift+F对齐到窗口就行:

把脚本附给Plane,然后把路径点也就是三个Cube,然后预制体Quad拖进去:

运行程序:

三、后记

看评论说实现的效果跟我的不一样,特意将源代码分享出来:

源代码下载:
https://download.csdn.net/download/q764424567/85140181

你的点赞就是对博主的支持,有问题记得留言:

博主还有跟多宝藏文章等待你的发掘哦:

专栏 方向 简介
Unity3D开发小游戏 小游戏开发教程 分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶 入门 从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUI UGUI Unity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据 文件读取 使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合 数据集合 数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发 虚拟仿真 总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件 插件 主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发 日常记录 主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG 日常记录 记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。

【Unity3D日常开发】Unity3D中实现箭头指向目标点的效果相关推荐

  1. 【Unity3D日常开发】Unity3D中实现计时器工具类-正计时、倒计时、暂停计时、加速计时

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  2. 【Unity3D日常开发】Unity3D中打包WEBGL后读取本地文件数据

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  3. 【Unity3D】在Unity中实现UI指向箭头

    本问转载自http://ghostyii.com/uiarrow/,为什么转载呢,怕以后找不到了! ps:博主写到超级详细,复制粘贴即可使用,超赞的! 0x0.引言 屏幕UI指示箭头,非常常见的游戏U ...

  4. 【Unity3D日常开发】Unity3D打包PC窗口化打包设置

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  5. 【Unity3D日常开发】解析Txt文档,赋值给Text案例

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 有小伙伴跟我说,公司现在需要解析JSON,但是百度的解析JSON的 ...

  6. 【Unity3D自学记录】 Unity3D游戏开发之键盘选取、切换目标

    ▇ 知识点 GameObject.FindObjectsWithTag:获取带有指定Tag的多个游戏物体: Input.GetKeyDown:检测指定按键是否按下: (GameObject insta ...

  7. 【Unity3D日常开发】Unity中的资源加载与文件路径

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  8. 【Unity3D日常开发】Unity3D中实现屏幕坐标和3维空间坐标的转化

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  9. 【Unity3d日常开发】Unity3D中实现热力图、风向图、温度图效果

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  10. 【Unity3D日常开发】Unity中Destroy()函数 和 DestroyImmediate()函数的区别

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

最新文章

  1. Unity 简单示例代码和向导/Unity Aplication Block
  2. 关于dataTables 的排序问题
  3. python主要运用于-python主要应用领域有哪些?看这一篇就够了
  4. Caffe 训练时loss等于87.3365且保持不变的原因及解决方法
  5. 用于读、写、删除、比较Session中的用户信息的类库。
  6. c语言中调整颜色的函数_C语言中的输入输出函数
  7. Vmware 虚拟机提示:无法打开磁盘***.vmdk 无法启动虚拟机 解决办法
  8. yolov4 开发环境搭建_YOLOv4 的各种新实现、配置、测试、训练资源汇总
  9. 服务器之后加码存储,浪潮信息重磅发布新一代 G6 存储平台
  10. 程序员教你如何用 13 种模型预测天气预报 | 原力计划
  11. 使用内部(com.android.internal)和隐藏(@hide)API手记
  12. (译)如何优化cocos2d程序的内存使用和程序大小:第一部分
  13. 管家婆支持mysql_开放多接口,支持对接管家婆等第三方应用
  14. 如何通过iPad云编译C语言,在iOS(iphone、ipad)上编辑、编译和运行c/c++(包括iPhone6和iOS8)...
  15. Ubuntu20.04 安装微信
  16. jsonrpc java_jsonrpc环境搭建和简单实例
  17. 映泰主板G31安装centos系统启动不了解决办法
  18. 浏览器兼容性及调试插件
  19. gzip already installed and latest version解决方法
  20. Linux程序设计-3-Linux编程准备知识

热门文章

  1. GoLang之什么是workstealing(5)
  2. C++几个常用的排序
  3. Phyton安装MySQL驱动
  4. ICCV 2017 论文解读集锦
  5. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day6】 —— 网络编程1
  6. ios开发学习--按钮(Button)效果源码分享--系列教程3
  7. 资源管理器 右键 反应慢 现象解决方案
  8. python处理页眉_python批量替换页眉页脚实例代码
  9. oracle 11g不能启动,[求助]oracle 11g无法启动
  10. [数据库+python] 定时爬取B站日榜与微博热搜榜信息并保存至数据库