1. 程式人生 > >使用Line Renderer只顯示路徑不移動效果

使用Line Renderer只顯示路徑不移動效果

首先建立一個烘焙過後的場景,這個比較容易,簡單說一下

建立需要的場景,我這裡是測試 

設定為Static型別

點選 Bake

 

接下來給Player掛指令碼 MoveCube

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class MoveCube : MonoBehaviour {

    NavMeshAgent m_nav;
    LineRenderer m_line;
    Ray ray;
    RaycastHit hit;
    Vector3 vector3;

    private void Awake()
    {
        m_nav = GetComponent<NavMeshAgent>();
        m_line = GetComponent<LineRenderer>();
        m_line.enabled = false;
    }
    private void Start()
    {
        StartCoroutine(OnMouseDown());

    }
    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            
                //啟用線性渲染元件
                m_line.enabled = true;
                ray = Camera.main.ScreenPointToRay(Input.mousePosition);//從攝像機發射射線到螢幕,並返回這條射線。
                if (Physics.Raycast(ray, out hit))
                {
                    vector3 = hit.point;
                    NavMeshPath path = new NavMeshPath();//設定路徑的點
                    m_nav.CalculatePath(vector3, path);//路徑,導航
                                                       //m_line.SetVertexCount(path.corners.Length);  過時的,API查詢
                    m_line.positionCount = path.corners.Length;//線性渲染設定拐點數。陣列型別的
                    m_line.SetPositions(path.corners);
                    //m_nav.SetDestination(vector3);
                }
            
           
        }
    }
    IEnumerator OnMouseDown()
    {
        //將物體由世界座標系轉換為螢幕座標系
        Vector3 screenSpace = Camera.main.WorldToScreenPoint(transform.position);//三維物體座標轉螢幕座標
        //完成兩個步驟 1.由於滑鼠的座標系是2維,需要轉換成3維的世界座標系 
        //    //             2.只有3維座標情況下才能來計算滑鼠位置與物理的距離,offset即是距離
        //將滑鼠螢幕座標轉為三維座標,再算出物體位置與滑鼠之間的距離
        Vector3 offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));
        while (Input.GetMouseButton(0))
        {
            //得到現在滑鼠的2維座標系位置
            Vector3 curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);
            //將當前滑鼠的2維位置轉換成3維位置,再加上滑鼠的移動量
            Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
            //curPosition就是物體應該的移動向量賦給transform的position屬性
            transform.position = curPosition;
            yield return new WaitForFixedUpdate(); //這個很重要,迴圈執行
        }
    }
}

 

接下來給Player新增元件。

這裡LineRenderer在設定的時候有個坑,預設設定LineRenderer----->Positions

這樣的話,在場景執行時,不會顯示LineRenderer初始的那小段 

執行。

效果如下

這裡有一個問題,就是再次移動Plyer的時候,射線會穿透Plyer在地面上留下一個點,如下圖:

解決辦法:有待解決,各位大佬,有解決方案留下你的思路,謝謝

等我想出來辦法在來更新