【Unity3D日常開發】Unity3D中實現箭頭指向目標點的效果

      網友投稿 1729 2025-03-31

      推薦閱讀


      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

      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(); } } }

      【Unity3D日常開發】Unity3D中實現箭頭指向目標點的效果

      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小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:聯邦學習專欄丨序言(深度好文)
      下一篇:什么幻燈片發過去別人看不了
      相關文章
      亚洲乱码国产一区网址| 亚洲综合精品网站| 国产亚洲精AA在线观看SEE| 亚洲成a人在线看天堂无码| 亚洲国产高清国产拍精品| 亚洲一区二区三区乱码在线欧洲| 亚洲蜜芽在线精品一区| 亚洲电影唐人社一区二区| 亚洲精品第一国产综合精品| 亚洲成a人片77777群色| 亚洲电影在线免费观看| 亚洲一卡二卡三卡| 亚洲色成人网站WWW永久四虎| 中文字幕亚洲综合久久综合| 亚洲欧美日本韩国| 国产精品亚洲专区无码唯爱网| 美国毛片亚洲社区在线观看| 亚洲成A人片在线观看无码3D| 亚洲国产中文v高清在线观看| 国产精品亚洲αv天堂无码| 亚洲综合精品香蕉久久网| 亚洲日韩中文无码久久| 亚洲ⅴ国产v天堂a无码二区| 亚洲国产二区三区久久| 亚洲黄色网址大全| 亚洲另类春色校园小说| 伊人久久亚洲综合影院首页| 亚洲国产AV无码一区二区三区 | 午夜亚洲WWW湿好爽| 婷婷亚洲天堂影院| 国产亚洲精品国看不卡| 亚洲av永久无码精品国产精品| 亚洲精选在线观看| 亚洲一卡2卡4卡5卡6卡在线99| 亚洲一区二区无码偷拍| 一本久久综合亚洲鲁鲁五月天| 在线观看亚洲av每日更新| 亚洲av色福利天堂| 亚洲av永久无码嘿嘿嘿| 亚洲AV无码一区二区三区性色| 亚洲色一色噜一噜噜噜|