最近朋友問我如何在Unity 中透過 Line 來構成一條路徑,這讓我想起之前有使用過 Unity 本身自戴的 LineRenderer 建構 Line 的類別。所以今天將會去說明如何在Unity 中有效的將點與點之間連線,或是每當生成新的物件時系統會自動連線到下一個物件上。
今天就來示範幾個簡單建構Line 的方法,也方便未來對需要使用 LineRenderer 的人有初步的了解。
同樣的我們建構一個簡單的環境,兩個 Sphere 在環境中,一個為目標點,另外一個為起始點。這邊 黑色就是我們的起始點,紅色就是我們的終點。
接下來新增一個空白物件,取名為 LineManagement,內部新增一個 LineConrol.cs 的文本。
我們新增一個元素 LineRenderer,一開始我們看到環境中的 Line 是沒有任何 Material 材質的情況,所以我們要回到LineRenderer 中的 Material 點進去選擇 Default-Line 材質。
接下來我們要調整該Line 的寬度,可以到這邊做調整,設定成最大 0.05。當然我們也可以透過程式處理Line 的寬度。
我們可見到目前環境裡面已經有該 Line 顯示於環境內。
開始撰寫文本。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LineControl : MonoBehaviour
{
public LineRenderer line;
public Transform startPoint;
public Transform endPoint;
void Start()
{
line.positionCount = 2;
}
void Update()
{
line.SetPosition(0, startPoint.position);
line.SetPosition(1, endPoint.position);
}
}
回到 Unity 中將各物件拉至 Scripts 文本中。
最後執行就可以看到兩個物件彼此連接著對方沒有停止。我們改變該 EndPoint 的位置兩者仍持續連接著。
void Start()
{
line = GetComponent<LineRenderer>();
if(line == null)
{
line = gameObject.AddComponent<LineRenderer>();
}
line.positionCount = 3;
line.endWidth = 0.05f;
line.startWidth = 0.05f;
line.startColor = Color.yellow;
line.endColor = Color.yellow;
}
[SerializeField]
private List<GameObject> MultiObjList = new List<GameObject>();
當然若你想宣告為 Array 也不是問題 ><。
private GameObject[] arr = new GameObject[10];
回到 Unity 將我們需要連線的物件放入到我們先行設定的 GameObject List 當中。當然這種方式很沒有效率,之後會說明如何自動生成物件的方法。
接下來撰寫程式碼,首先我們要知道兩個點連線的方式是知道起點與終點,所以我們每次設定的物件將會是前一個物件與下一個要連結的物件。這時候我們先撰寫一個簡單的方法 void connectionLine( ) 。 我們會知道該每個點連接的起始,同時設定該Line 的編號 i。
void connectLine(int i, GameObject ob1, GameObject ob2)
{
line.SetPosition(i, ob1.transform.position);
line.SetPosition((i+1), ob2.transform.position);
}
void Update()
{
for(int i = 0; i <= MultiObjList.Count-2 ; i++)
{
connectLine(i, MultiObjList[i], MultiObjList[i+1]);
}
}
最後回到 Unity 欣賞一下結果 ><。你可以隨意改變每一個物件的位置,仍會互相的連接著形成一條路徑,當然後續我會記錄如何隨機生成固定距離不同角度的路徑規劃,會比今天的方法更有效率。
完整程式碼
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LineControl : MonoBehaviour
{
private LineRenderer line;
[SerializeField]
private List<GameObject> MultiObjList = new List<GameObject>();
// [SerializeField]
// private GameObject[] arr = new GameObject[10];
void Start()
{
line = GetComponent<LineRenderer>();
if(line == null)
{
line = gameObject.AddComponent<LineRenderer>();
}
line.positionCount = MultiObjList.Count;
line.endWidth = 0.05f;
line.startWidth = 0.05f;
line.startColor = Color.yellow;
line.endColor = Color.yellow;
}
void Update()
{
for(int i = 0; i <= MultiObjList.Count-2 ; i++)
{
connectLine(i, MultiObjList[i], MultiObjList[i+1]);
}
}
void connectLine(int i, GameObject ob1, GameObject ob2)
{
line.SetPosition(i, ob1.transform.position);
line.SetPosition((i+1), ob2.transform.position);
}
}