Unity3D_導航路徑_在地面上畫一條引導路徑


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

6. 將腳本掛載到 Capsule

7. 給腳本的公共變量賦值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM