iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0
自我挑戰組

Unity 基本功能實作與日常紀錄系列 第 5

Day5: Understand Line Renderer

  • 分享至 

  • xImage
  •  

最近朋友問我如何在Unity 中透過 Line 來構成一條路徑,這讓我想起之前有使用過 Unity 本身自戴的 LineRenderer 建構 Line 的類別。所以今天將會去說明如何在Unity 中有效的將點與點之間連線,或是每當生成新的物件時系統會自動連線到下一個物件上。

今天就來示範幾個簡單建構Line 的方法,也方便未來對需要使用 LineRenderer 的人有初步的了解。

環境建置

  1. 同樣的我們建構一個簡單的環境,兩個 Sphere 在環境中,一個為目標點,另外一個為起始點。這邊 黑色就是我們的起始點,紅色就是我們的終點。

  2. 接下來新增一個空白物件,取名為 LineManagement,內部新增一個 LineConrol.cs 的文本。

  3. 我們新增一個元素 LineRenderer,一開始我們看到環境中的 Line 是沒有任何 Material 材質的情況,所以我們要回到LineRenderer 中的 Material 點進去選擇 Default-Line 材質。

  4. 接下來我們要調整該Line 的寬度,可以到這邊做調整,設定成最大 0.05。當然我們也可以透過程式處理Line 的寬度。

  5. 我們可見到目前環境裡面已經有該 Line 顯示於環境內。

  6. 開始撰寫文本。

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);
    }
}
  • LineRenderer 為指定該 Line 的物件
  • startPoint, endPoint 為起始與終點。
  • ine.positionCount 設定 line 最大連數量有多少條。
  1. 回到 Unity 中將各物件拉至 Scripts 文本中。

  2. 最後執行就可以看到兩個物件彼此連接著對方沒有停止。我們改變該 EndPoint 的位置兩者仍持續連接著。

多物件的連線

  1. 首先我們更改一下程式碼中 void Start( ) 內部的程式碼,讓我們系統自己尋找該 LineRenderer 元素是否在 LineManagement 並找尋物件,且若該LineRenderer 元素沒有在 LineManagement 的話就自行生成該元素。 我們也去調整該線材的顏色、寬度,這樣我們就可以不需要再到 Unity 中調整。最重要的還是該線的數量 positionCount 。
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;
    }
  1. 我們知道 C# 中有強大的 List 函數讓我們能利用如同 Array 進行存取每一筆資料。這邊我們可以先用 List 宣告有 10 個GameObject 需要儲存。這邊 SerializeField 可以幫我們顯示 Unity 中儘管我們宣告為 private 變數。
[SerializeField]
private List<GameObject> MultiObjList = new List<GameObject>();

當然若你想宣告為 Array 也不是問題 ><。

private GameObject[] arr = new GameObject[10];
  1. 回到 Unity 將我們需要連線的物件放入到我們先行設定的 GameObject List 當中。當然這種方式很沒有效率,之後會說明如何自動生成物件的方法。

  2. 接下來撰寫程式碼,首先我們要知道兩個點連線的方式是知道起點與終點,所以我們每次設定的物件將會是前一個物件與下一個要連結的物件。這時候我們先撰寫一個簡單的方法 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);
    }
  1. 後續我們將該 List 的物件放進該 fuction 使用,因為我們List 是從 0 開始, 0~9作為 Index 編號,而我們最後串接到8 , 9 就結束。如下結果,放進在 Update 中代表該持續進行。
void Update()
    {
        for(int i = 0; i <= MultiObjList.Count-2 ; i++)
        {
            connectLine(i, MultiObjList[i], MultiObjList[i+1]);
        }
        
    }
  1. 最後回到 Unity 欣賞一下結果 ><。你可以隨意改變每一個物件的位置,仍會互相的連接著形成一條路徑,當然後續我會記錄如何隨機生成固定距離不同角度的路徑規劃,會比今天的方法更有效率。

  2. 完整程式碼

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

總結

  1. 今天說明使用 LineRenderer 將物件彼此串聯的方法。
  2. Line 要注意到的地方就是要設定起點與終點,讓 Line 能夠進行連線。
  3. 若需要串連的物件大於兩個,就需要注意到一開始 Line 的 positionCount 需要設定大於你需串連的物件數量,避免報錯。
  4. List 是很強大的儲存資料型別,幫助我們很方便的存值取值。List 不像 Array 會有空間限制。而是可以透過 Add 不斷新增資料與Remove刪除資料,大幅增加使用上的方便性。

上一篇
Day4: Understand RaycastHit
下一篇
Day6: Combination with RaycastHit and Line Renderer
系列文
Unity 基本功能實作與日常紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言