1. 搭建如圖場景
2. 創建一個空物體,在該物體上添加組件“LineRenderer”
3. 附加材質球,材質球貼圖如下
4. 調整顏色漸變效果
5. 創建腳本 ArrowFindPath
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class ArrowFindPath : MonoBehaviour { // 移動到的目標點 public Transform moveEndPoint; // 畫線組件 public LineRenderer lineGameObject; // 畫線路徑點的集合(用於計算 UV ) private List<Vector3> arrowList = new List<Vector3>(); // 增量(一個點與下一個的距離) private Vector3 pointNumber; // 起點到終點分成多少份(在 LineRenderer 組件中添加的 position 數目) private float num; private void Start() { lineGameObject.transform.eulerAngles = new Vector3(90f, 0f, 0f); lineGameObject.startWidth = 0.5f; lineGameObject.endWidth = 0.5f; lineGameObject.alignment = LineAlignment.TransformZ; } void Update() { // 計算點數(除數為:lineGameObject.startWidth,可以避免 1:1 的材質球被拉伸) num = Vector3.Distance(moveEndPoint.position, transform.position) / lineGameObject.startWidth; // 計算增量 pointNumber = (moveEndPoint.position - transform.position) / num; // 給 LineRender 組件的 Position 賦值 for (int i = 0; i < num; i++) { // 從 Ray ray = new Ray((transform.position + i * pointNumber) + Vector3.up * 10f,Vector3.down); RaycastHit hit; if(Physics.Raycast(ray,out hit)){ lineGameObject.positionCount = i + 1; lineGameObject.SetPosition(i, hit.point + (Vector3.up * 0.1f)); arrowList.Add(hit.point + (Vector3.up * 0.1f)); } } // 使 LineRenderer 的前四個值等於第四個值 for (int i = 0; i < 4; i++) { lineGameObject.SetPosition(i, lineGameObject.GetPosition(4)); arrowList[i] = lineGameObject.GetPosition(4); } // 使 LineRenderer 的后四個值等於倒數第四個值 for (int i = 1; i <= 4; i++) { lineGameObject.SetPosition(lineGameObject.positionCount - i, lineGameObject.GetPosition(lineGameObject.positionCount - 4)); arrowList[lineGameObject.positionCount - i] = lineGameObject.GetPosition(lineGameObject.positionCount - 4); } lineGameObject.material.SetTextureScale("_MainTex", new Vector2(UVTiling(arrowList.ToArray(), lineGameObject.startWidth), 1f)); arrowList.Clear(); // 移動效果 lineGameObject.material.SetTextureOffset("_MainTex", new Vector2(UVOffset(lineGameObject.material.GetTextureOffset("_MainTex")), 1f)); } // 計算 UV 值 private float UVTiling(Vector3[] lineNumber,float lineWidth) { float f = 0f; for (int i = 0; i < lineNumber.Length - 1; i++) { f += Vector3.Distance(lineNumber[i], lineNumber[i + 1]); } return f / lineWidth; } private float UVOffset(Vector2 offset) { float f = offset.x; return f -= 0.05f; } // 創建一個游戲物體 private GameObject CreateGameObject(Vector3 position) { GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Sphere); obj.transform.position = position; obj.transform.localScale = Vector3.one * 0.1f; obj.GetComponent<MeshRenderer>().material.color = Color.blue; return obj; } }