Unity3D中GameObject 詳細介紹
阿新 • • 發佈:2019-01-07
通訊,動態建立,Prefab,銷燬
通過Hierarchy面板下的Create選單可以手動地建立一個GameObject,它可以是一個相機,一個燈光,或者一個簡單的模型,當我們要在程式裡面動態地建立一個相機的時候,可以new一個GameObject,然後把Camera元件Add給它就可以了,建立燈光,GUI等也類似,但要建立簡單模型的時候,我發現並沒有類似Cube,Sphere這樣的元件可供新增,後面知道,通過GameObject這個類的一個靜態方法可以達到這個目的
static GameObject CreatePrimitive(PrimitiveType type);
可以根據PrimitiveType建立五種型別的基礎模型
PrimitiveType.Plane,PrimitiveType.Cube,PrimitiveType.Sphere,PrimitiveType.Capsule,PrimitiveType.Cylinder
Unity3D提供一種被稱為Prefab的預置物件,它是以檔案的形式儲存在硬碟上的一個GameObject,它裡面可能包含了各種設定,元件,還有一些指令碼。Prefab允許我們在不同的Scene,甚至Project中使用同一個物件,例如我實現了一個子彈,通過打包成Prefab,我可以在另外一個遊戲裡面直接使用它。
當一個Prefab物件被修改的時候,它的所有例項都會相應地被修改
在程式碼裡面動態地例項化一個Prefab物件
public GameObject obj;
obj = Instantiate( obj );
要先建立一個公有變數,然後把這個Prefab拖到這個變數上,然後才可以用它來例項化物件(我感到一種蛋蛋的憂傷,能不拖嗎)
通過Resources這個類的靜態方法可以將Prefab物件動態載入進來,建立GameObject
GameObject之間的通訊,在遊戲中,我們往往需要知道其他物件的一些資訊,所以我們經常需要動態地查詢另外一個GameObject
1. 查詢父節點 transform.parent
2. 查詢子節點 transform.Find("name"); transform.Find("Arm/Hand/Finger"); 沒有找到會返回null,名字如果包含"/"字元將像路徑一樣穿越層次
3. 查詢場景中的其他GameObject
GameObject.Find 從Scene下開始查詢,根據GameObject的名字進行查詢,允許使用"/"穿越層次查詢,
GameObject.FindWithTag根據Tag查詢一個GameObject,
GameObject.FindGameObjectsWithTag 根據Tag批量查詢GameObject
GameObject的name和Tag可以直接設定,但Tag需要在標籤管理器先定義一個Tag,這個Tag才可用,你不能將一個未定義的Tag賦給GameObject的Tag變數
最後還有一種搓搓的通訊方法,通過Message來呼叫其他GameObject,預設是垃圾簡訊群發,也可以將一個Object穿進去,然後調它的方法
methodName為方法名,value為方法的引數,options表示是否必須有物件接收該訊息(如果是,且沒有物件接受,u3d報錯)
//呼叫本級別所有的GameObject上所有指令碼的methodName方法
void SendMessage(string methodName, object value = null, SendMessageOptions options = SendMessageOptions.RequireReceiver);
//朝本級別和上級父節點發送呼叫命令
void SendMessageUpwards(...)
//目標是本級別和全部子節點...
void BroadcastMessage(...)
呼叫Object的Destroy方法可以銷燬一個GameObject,元件,或者資源。這是一個靜態方法,函式的原型為 static void Destroy(Object obj, float t = 0.0F );
可以通過將this傳入,銷燬自己。
GameObject的成員變數很多
通過Hierarchy面板下的Create選單可以手動地建立一個GameObject,它可以是一個相機,一個燈光,或者一個簡單的模型,當我們要在程式裡面動態地建立一個相機的時候,可以new一個GameObject,然後把Camera元件Add給它就可以了,建立燈光,GUI等也類似,但要建立簡單模型的時候,我發現並沒有類似Cube,Sphere這樣的元件可供新增,後面知道,通過GameObject這個類的一個靜態方法可以達到這個目的
static GameObject CreatePrimitive(PrimitiveType type);
可以根據PrimitiveType建立五種型別的基礎模型
PrimitiveType.Plane,PrimitiveType.Cube,PrimitiveType.Sphere,PrimitiveType.Capsule,PrimitiveType.Cylinder
Unity3D提供一種被稱為Prefab的預置物件,它是以檔案的形式儲存在硬碟上的一個GameObject,它裡面可能包含了各種設定,元件,還有一些指令碼。Prefab允許我們在不同的Scene,甚至Project中使用同一個物件,例如我實現了一個子彈,通過打包成Prefab,我可以在另外一個遊戲裡面直接使用它。
當一個Prefab物件被修改的時候,它的所有例項都會相應地被修改
在程式碼裡面動態地例項化一個Prefab物件
public GameObject obj;
obj = Instantiate( obj );
要先建立一個公有變數,然後把這個Prefab拖到這個變數上,然後才可以用它來例項化物件(我感到一種蛋蛋的憂傷,能不拖嗎)
通過Resources這個類的靜態方法可以將Prefab物件動態載入進來,建立GameObject
GameObject之間的通訊,在遊戲中,我們往往需要知道其他物件的一些資訊,所以我們經常需要動態地查詢另外一個GameObject
1. 查詢父節點 transform.parent
2. 查詢子節點 transform.Find("name"); transform.Find("Arm/Hand/Finger"); 沒有找到會返回null,名字如果包含"/"字元將像路徑一樣穿越層次
3. 查詢場景中的其他GameObject
GameObject.Find 從Scene下開始查詢,根據GameObject的名字進行查詢,允許使用"/"穿越層次查詢,
GameObject.FindWithTag根據Tag查詢一個GameObject,
GameObject.FindGameObjectsWithTag 根據Tag批量查詢GameObject
GameObject的name和Tag可以直接設定,但Tag需要在標籤管理器先定義一個Tag,這個Tag才可用,你不能將一個未定義的Tag賦給GameObject的Tag變數
最後還有一種搓搓的通訊方法,通過Message來呼叫其他GameObject,預設是垃圾簡訊群發,也可以將一個Object穿進去,然後調它的方法
methodName為方法名,value為方法的引數,options表示是否必須有物件接收該訊息(如果是,且沒有物件接受,u3d報錯)
//呼叫本級別所有的GameObject上所有指令碼的methodName方法
void SendMessage(string methodName, object value = null, SendMessageOptions options = SendMessageOptions.RequireReceiver);
//朝本級別和上級父節點發送呼叫命令
void SendMessageUpwards(...)
//目標是本級別和全部子節點...
void BroadcastMessage(...)
呼叫Object的Destroy方法可以銷燬一個GameObject,元件,或者資源。這是一個靜態方法,函式的原型為 static void Destroy(Object obj, float t = 0.0F );
可以通過將this傳入,銷燬自己。
GameObject的成員變數很多