【Unity3D日常开发】Unity3D中实现箭头指向目标点的效果
推荐阅读
- 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中实现箭头指向目标点的效果相关推荐
- 【Unity3D日常开发】Unity3D中实现计时器工具类-正计时、倒计时、暂停计时、加速计时
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...
- 【Unity3D日常开发】Unity3D中打包WEBGL后读取本地文件数据
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...
- 【Unity3D】在Unity中实现UI指向箭头
本问转载自http://ghostyii.com/uiarrow/,为什么转载呢,怕以后找不到了! ps:博主写到超级详细,复制粘贴即可使用,超赞的! 0x0.引言 屏幕UI指示箭头,非常常见的游戏U ...
- 【Unity3D日常开发】Unity3D打包PC窗口化打包设置
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...
- 【Unity3D日常开发】解析Txt文档,赋值给Text案例
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 有小伙伴跟我说,公司现在需要解析JSON,但是百度的解析JSON的 ...
- 【Unity3D自学记录】 Unity3D游戏开发之键盘选取、切换目标
▇ 知识点 GameObject.FindObjectsWithTag:获取带有指定Tag的多个游戏物体: Input.GetKeyDown:检测指定按键是否按下: (GameObject insta ...
- 【Unity3D日常开发】Unity中的资源加载与文件路径
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...
- 【Unity3D日常开发】Unity3D中实现屏幕坐标和3维空间坐标的转化
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...
- 【Unity3d日常开发】Unity3D中实现热力图、风向图、温度图效果
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...
- 【Unity3D日常开发】Unity中Destroy()函数 和 DestroyImmediate()函数的区别
推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...
最新文章
- Unity 简单示例代码和向导/Unity Aplication Block
- 关于dataTables 的排序问题
- python主要运用于-python主要应用领域有哪些?看这一篇就够了
- Caffe 训练时loss等于87.3365且保持不变的原因及解决方法
- 用于读、写、删除、比较Session中的用户信息的类库。
- c语言中调整颜色的函数_C语言中的输入输出函数
- Vmware 虚拟机提示:无法打开磁盘***.vmdk 无法启动虚拟机 解决办法
- yolov4 开发环境搭建_YOLOv4 的各种新实现、配置、测试、训练资源汇总
- 服务器之后加码存储,浪潮信息重磅发布新一代 G6 存储平台
- 程序员教你如何用 13 种模型预测天气预报 | 原力计划
- 使用内部(com.android.internal)和隐藏(@hide)API手记
- (译)如何优化cocos2d程序的内存使用和程序大小:第一部分
- 管家婆支持mysql_开放多接口,支持对接管家婆等第三方应用
- 如何通过iPad云编译C语言,在iOS(iphone、ipad)上编辑、编译和运行c/c++(包括iPhone6和iOS8)...
- Ubuntu20.04 安装微信
- jsonrpc java_jsonrpc环境搭建和简单实例
- 映泰主板G31安装centos系统启动不了解决办法
- 浏览器兼容性及调试插件
- gzip already installed and latest version解决方法
- Linux程序设计-3-Linux编程准备知识
热门文章
- GoLang之什么是workstealing(5)
- C++几个常用的排序
- Phyton安装MySQL驱动
- ICCV 2017 论文解读集锦
- Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day6】 —— 网络编程1
- ios开发学习--按钮(Button)效果源码分享--系列教程3
- 资源管理器 右键 反应慢 现象解决方案
- python处理页眉_python批量替换页眉页脚实例代码
- oracle 11g不能启动,[求助]oracle 11g无法启动
- [数据库+python] 定时爬取B站日榜与微博热搜榜信息并保存至数据库