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

网友投稿 1439 2022-05-29

推荐阅读

CSDN主页

GitHub开源地址

Unity3D插件分享

简书地址

我的个人博客

QQ群:1040082875

大家好,我是佛系工程师

☆恬静的小魔龙☆

,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

最近开发的时候遇到了箭头指向的需求,本来想用我这篇文章中的代码来着:

【Unity3D日常开发】Unity中实现箭头指向效果实现

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

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

效果图:

二、正文

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 OneMinusSrcAlpha Pass { 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 } } }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

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; ///

/// 导航箭头 /// public class NavPathArrow : MonoBehaviour { public MeshRenderer meshRenderer;//箭头3D对象Quad public List points = new List();//路径点 private List lines = new List();//显示的路径 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; //指向end tran.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(); } } }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

2-5、实现功能

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

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

运行程序:

三、后记

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

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

5G游戏 unity

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《MXNet深度学习实战》—1.3 关于MXNet
下一篇:Springfox swagger2 源码解析
相关文章