文章

使用 Instantiate() 函數生成物件

在Unity中,Instantiate() 函數是用來生成新的遊戲物件的。這個方法通常用於動態創建物件,例如敵人、道具、特效或其他在遊戲運行期間需要生成的內容。

1. Instantiate() 函數的基本用法

Instantiate() 函數可以用來複製現有的物件或預製物(Prefab)。你可以指定生成物件的位置、旋轉角度以及其父物件。

語法

1
2
Object Instantiate(Object original, Vector3 position, Quaternion rotation);
Object Instantiate(Object original, Vector3 position, Quaternion rotation, Transform parent);
  • original:要複製的物件或預製物(Prefab)。
  • position:生成物件的位置(Vector3)。
  • rotation:生成物件的旋轉(Quaternion)。
  • parent(可選):指定生成物件的父物件。

2. 創建一個簡單的生成腳本

以下是一個簡單的腳本示例,展示如何使用 Instantiate() 函數動態生成物件。

步驟

  1. 創建一個預製物(Prefab)
    • Hierarchy 中創建一個 3D 物件,例如 Cube
    • 調整物件的屬性(例如顏色、材質、大小等)。
    • 將該物件從 Hierarchy 拖放到 Assets 資料夾中,創建一個預製物(Prefab)。
  2. 創建一個生成腳本
    • Assets 資料夾中,右鍵單擊並選擇 Create > C# Script,將其命名為 ObjectSpawner
    • 打開腳本並編寫以下代碼:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    using UnityEngine;
    
    public class ObjectSpawner : MonoBehaviour
    {
        public GameObject prefab; // 參考要生成的預製物
        public Transform spawnPoint; // 生成的位置
    
        void Update()
        {
            // 當玩家按下空格鍵時生成物件
            if (Input.GetKeyDown(KeyCode.Space))
            {
                Instantiate(prefab, spawnPoint.position, spawnPoint.rotation);
            }
        }
    }
    
  3. 將腳本掛載到遊戲物件上
    • ObjectSpawner 腳本掛載到任意遊戲物件(例如 Empty Object)上。
    • Inspector 視圖中,將你的預製物拖放到 prefab 欄位,並設置 spawnPoint(可以使用主攝影機的位置或其他遊戲物件的位置)。
  4. 測試物件生成
    • 點擊 Play,按下 空格鍵,你將看到新的遊戲物件在指定位置生成。

3. 進一步的用法:設置父物件

你可以指定生成物件的父物件,使新生成的物件成為該父物件的子物件。

修改腳本以設置父物件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using UnityEngine;

public class ObjectSpawnerWithParent : MonoBehaviour
{
    public GameObject prefab; // 參考要生成的預製物
    public Transform spawnPoint; // 生成的位置
    public Transform parentObject; // 父物件

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            GameObject newObject = Instantiate(prefab, spawnPoint.position, spawnPoint.rotation, parentObject);
            // 將新生成的物件設置為指定父物件的子物件
        }
    }
}

測試設置父物件

  • 將腳本掛載到場景中的任意物件。
  • Inspector 視圖中,將 parentObject 設置為你想要的新物件的父物件(例如,場景中的另一個物件)。

4. 動態生成和自動刪除

你還可以動態生成物件並設置其自動刪除。例如,生成一個爆炸效果或臨時物件,並在幾秒鐘後自動刪除。

範例:自動刪除生成的物件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using UnityEngine;

public class TimedObjectSpawner : MonoBehaviour
{
    public GameObject prefab; // 參考要生成的預製物
    public Transform spawnPoint; // 生成的位置
    public float destroyDelay = 5f; // 刪除延遲時間

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            GameObject newObject = Instantiate(prefab, spawnPoint.position, spawnPoint.rotation);
            Destroy(newObject, destroyDelay); // 在指定時間後自動刪除生成的物件
        }
    }
}

測試自動刪除物件

  • 按下 空格鍵,新物件生成後,經過指定時間(例如5秒)將自動刪除。

5. 小結

  • Instantiate() 函數 允許你動態生成遊戲物件,並能夠指定其位置、旋轉和父物件。
  • 可以結合 Destroy() 函數 來自動刪除生成的物件,以實現動態效果。
  • 掌握這些方法後,你可以靈活控制遊戲中的各種物件生成邏輯,為遊戲添加更多動態和互動的內容。
本文章以 CC BY 4.0 授權