Instantiate 函式為物件實例化的方法,白話一點就是在遊戲場景中生成物件,當你需要在遊戲中生成原本不存在的物件時,就可以呼叫這個方法來達成。
Instantiate可以生成場景中不存在的物件,而該物件通常我們會將它做成預製物件 (Prefeb),當然我們也能夠生成場景中已經存在的物件,做一個複製的動作,它的屬性預設會和母體一樣,除非有去做屬性值的更動。
Instantiate 支援多載,以下來看看它的定義:
● 定義:
參數說明:● original:要生成的物件,可以是場景中的物件,也可以是 Prefeb 物件。 生成的位置在於 original 物件的值。
參數說明:● original:要生成的物件,可以是場景中的物件,也可以是 Prefeb 物件。● parent:指定的父物件,original 的位置、旋轉和大小受 parent 物件影響。 original 物件預設會在 parent 的相對位置 (0,0,0) 上。
3. public static Object Instantiate(Object original, Transform parent, bool instantiateInWorldSpace);
參數說明:● original:要生成的物件,可以是場景中的物件,也可以是 Prefeb 物件。● parent:指定的父物件,original 的位置、旋轉和大小受 parent 物件影響。● instantiateInWorldSpace:布林值,生成的物件座標是要參考父物件座標或是世界座標。 true 表示參考世界座標,false 則是依循父物件座標。
參數說明:● original:要生成的物件,可以是場景中的物件,也可以是 Prefeb 物件。● position:指定生成的三維位置座標,用 new Vector3(x,y,z) 來指定。● rotation:指定生成的三維旋轉角度,用 Quaternion.Euler(x,y,z) 來指定。
參數說明:● original:要生成的物件,可以是場景中的物件,也可以是 Prefeb 物件。● position:生成的三維位置座標,是 parent 的相對位置。● rotation:生成的三維旋轉角度,是 parent 的相對角度。● parent:指定的父物件,original 的位置、旋轉和大小受 parent 物件影響。
● 用法:
//生成一個 prefebInstantiate(prefeb); //生成子彈在槍管的位置 Instantiate(bullet,gun.trnasform); //生成圖片在 Canvas 容器中,使用相對座標Instantiate(image,canvas.transform,false); //生成一個 Cube 在 世界座標(10,10,10)、角度(90,0,0)Instantiate(Cube,new Vector3(10,10,10),Quaternion.Euler(90,0,0)); //生成一個 Cube 在 CubeParent 的相對座標(10,10,10)、角度(90,90,90)Instantiate(Cube,new Vector3(10,10,10),Quaternion.Euler(90,0,0),CubeParent.trnasform);
● 實做(一):射擊遊戲的子彈發射
using UnityEngine;using System.Collections; public class Shoot: MonoBehaviour{ public GameObject gunPoint; //槍口 public GameObject bullet; //子彈 Prefeb void Update() { if (Input.GetMouseButtonDown(0)) //偵測滑鼠左鍵被按下 { Instantiate(bullet,gunPoint.transform); } }}
● 實做(二):打開背包的 UI 物件,存在螢幕中央
using UnityEngine;using System.Collections;using UnityEngine.UI; public class OpenBag: MonoBehaviour{ public GameObject UIBag; //背包 UI 物件 public Canvas canvas; //UI 容器 Vector3 pos = new Vector3(Screen.Width/2,Screen.Height/2); //螢幕正中央位置 Quaternion rot = Quaternion.Euler(0,0,0); //旋轉角度(0,0,0) void Update() { if (Input.GetKeyDown(KeyCode.B)) //偵測鍵盤的B鍵被按下 { Instantiate(UIBag,pos,rot,canvas.transform); } }}
------------------------------------------------說明--------------------------------------------------
- 注意 parent 參數是 Transform 型態,常發生放了 GameObject 型別物件的錯誤。
- Instantiate 物件的座標,做沒有給 parent 物件當參數,它會以世界座標軸去定位,反之若有給 parent 物件做為參數,它就會以 parent 物件的相對位置去定位,當然你也可以用布林值來指定是否參照父物件的 Transform。
- 參考父物件的 Transform 時,也會受到生成的物件自身的 Transform 和對齊方式 (Anchors 和 Pivot) 影響到生成的位置。
生成物件之後,往往會要消除,詳情請見 Destroy 方法。
Try it and have fun!
全站熱搜
留言列表