第65節 - Unity: GameObject, Class Object, New & Instantiate
這一節我會介紹Unity: GameObject, Class Object, New & Instantiate的用法和分別,主要分為以下部分:
1) Create C# Class Object
2) Create Unity MonoBehaviour Class Object
3) Create GameObject in Script by Instantiate() with FindObjectofType<T>()
4) Create GameObject in Script by Instantiate() with FindWithTag()
5) Create GameObject in Script by Instantiate() with Drag & Drop GameObject
6) Create GameObject in Script by Instantiate() with Drag & Drop Prefab
7) Create GameObject in Script by Instantiate() with Resources.Load() Prefab
8) Create GameObject in Script by Keyword new
1) Create C# Class Object
首先,第一個例子會介紹如何在Unity內建立一個ClassB類別,再在ClassB類別內建立ClassA物件 - classA。
注意1: 所有在Unity內建立的類別都會自動inherits(繼承)MonoBehaviour類別
(例如: ClassA: MonoBehaviour)。
注意2: 所有類別如繼承MonoBehaviour類別都不能用Keyword new建立類別物件,我會在這節詳細介紹。
- 建立一個C# Class - ClassA。
- 建立一個Unity Class - ClassB,ClassB會自動繼承MonoBehaviour類別
(i.e. ClassB: MonoBehaviour)。 - 在ClassB內就能夠成功建立ClassA物件 - classA。
- 這個例子會建立一個C# Class物件。
- 建立一個新Project 。
- 在Assets區域內建立兩個Script。
- 選擇Main Camera。
- 把兩個Script拖放到Main Camera內。
- ClassA是一個C# Class,沒有繼承MonoBehaviour類別的,我們可以自己刪除繼承MonoBehaviour類別的部分。
- 建立一個methodA()方法 。
- ClassB是一個Unity Class,它會自動繼承MonoBehaviour類別的。
- 在ClassB外,是可以建立其他類別的,例如: ClassC。
- ClassB自動繼承MonoBehaviour類別的。
- 用Keyword new建立classA物件,再執行classA.methodA()方法。
- 執行classA.methodB()方法。
- 用Keyword new建立classC物件,再執行classC.methodC()方法。
- 建立methodB()方法 。
1.1) Result
- 結果成功顯示。
2) Create Unity MonoBehaviour Class Object
第二個例子會介紹在Unity內建立兩個Unity類別(ClassA和ClassB類別),再在ClassB類別內建立ClassA物件 - classA,但執行程式失敗。
注意1: 所有在Unity內建立一個類別都會自動inherits(繼承)MonoBehaviour類別
(例如: ClassA: MonoBehaviour)。
注意2: 所有類別如繼承MonoBehaviour類別都不能用Keyword new建立類別物件,我會在這節詳細介紹。
- 建立一個Unity Class - ClassA,ClassA會自動繼承MonoBehaviour類別
(i.e. ClassA: MonoBehaviour)。 - 建立一個Unity Class - ClassB,ClassB會自動繼承MonoBehaviour類別
(i.e. ClassB: MonoBehaviour)。 - 在ClassB內就不能夠建立ClassA物件 - classA。
注意: 所有類別如繼承MonoBehaviour類別都不能用Keyword new建立類別物件。 - 這個例子會建立一個C# Class物件。
- 建立一個新Project 。
- 在Assets區域內建立兩個Script。
- 選擇Main Camera。
- 把兩個Script拖放到Main Camera內。
- ClassA是一個Unity Class,它會自動繼承MonoBehaviour類別的。
- 建立一個methodA()方法 。
- ClassB是一個Unity Class,它會自動繼承MonoBehaviour類別的。
- 在ClassB外,是可以建立其他類別的,例如: ClassC。
- ClassB自動繼承MonoBehaviour類別的。
- 用Keyword new建立classA物件 - classA,再執行classA.methodA()方法。
- 執行classA.methodB()方法。
- 用Keyword new建立classC物件,再執行classC.methodC()方法。
- 建立methodB()方法 。
2.1) Result
- Error message會顯示: 所有類別如繼承MonoBehaviour類別都不能用Keyword new建立類別物件。
- 雖說可以執行結果,但出現以上錯誤信息。
3) Create GameObject in Script by Instantiate() with FindObjectofType<T>()
第三個例子會介紹在Unity內建立兩個Unity類別(ClassA和ClassB類別),再在ClassB類別內用FindObjectofType<T>()方法找出Unity GameObject內的ClassA類別。
- 建立一個Unity Class - ClassA,ClassA會自動繼承MonoBehaviour類別
(i.e. ClassA: MonoBehaviour)。 - 建立一個Unity Class - ClassB,ClassB會自動繼承MonoBehaviour類別
(i.e. ClassB: MonoBehaviour)。 - 在ClassB內用FindObjectofType<T>()方法找出Unity GameObject內的ClassA類別。
- 這個例子會建立一個Unity GameObject。
注意: FindObjectofType<T>()方法只是找出Unity GameObject內的ClassA類別,所以沒有產生新GameObject。
- 建立一個新Project 。
- 在Assets區域內建立兩個Script。
- 選擇Main Camera。
- 把兩個Script拖放到Main Camera內。
- 建立一個Empty GameObject - EmptyGameObjectA。
- 在Assets區域內建立一個Script,選擇EmptyGameObjectA,再把Script拖放到EmptyGameObjectA內。
- ClassA類別。
- ClassA是一個Unity Class,它會自動繼承MonoBehaviour類別的。
- 建立一個methodA()方法 。
- ClassB類別。
- ClassB是一個Unity Class,它會自動繼承MonoBehaviour類別的。
- 在ClassB內,建立一個classA Reference。
- 用FindObjectofType<T>()方法找出Unity GameObject內的ClassA類別,再執行classA.methodA()方法。
3.1) Result
- 結果成功顯示。
4) Create GameObject in Script by Instantiate() with FindWithTag()
第四個例子會介紹在Unity內建立兩個Unity類別(ClassA和ClassB類別),再在ClassB內用GameObject.FindWithTag()方法找出Unity Tag = TAGA的GameObject,找到後,就在這個GameObject內提取(GetComponent
- 建立一個Unity Class - ClassA,ClassA會自動繼承MonoBehaviour類別
(i.e. ClassA: MonoBehaviour)。 - 建立一個Unity Class - ClassB,ClassB會自動繼承MonoBehaviour類別
(i.e. ClassB: MonoBehaviour)。 - 在ClassB內用GameObject.FindWithTag()方法找出Unity Tag = TAGA的GameObject,找到後,就在這個GameObject內提取(GetComponent
) ClassA類別。
- 這個例子會建立一個Unity GameObject。
注意: GameObject.FindWithTag()方法只是找出Unity Tag = TAGA的GameObject,找到後,就在這個GameObject內提取(GetComponent) ClassA類別,所以沒有產生新GameObject。
- 建立一個新Project 。
- 在Assets區域內建立兩個Script。
- 選擇Main Camera。
- 把兩個Script拖放到Main Camera內。
- 建立一個Empty GameObject - EmptyGameObjectA。
- 在Tag內改名為TAGA。
- 在Assets區域內建立一個Script,選擇EmptyGameObjectA,再把Script拖放到EmptyGameObjectA內。
- ClassA類別。
- ClassA是一個Unity Class,它會自動繼承MonoBehaviour類別的。
- 建立一個methodA()方法 。
- ClassB類別。
- ClassB是一個Unity Class,它會自動繼承MonoBehaviour類別的。
- 在ClassB內,建立一個classA Reference。
- 用GameObject.FindWithTag()方法找出Unity Tag = TAGA的GameObject,找到後,就在這個GameObject內提取(GetComponent
) ClassA類別。
4.1) Result
- 結果成功顯示。
5) Create GameObject in Script by Instantiate() with Drag & Drop GameObject
這個例子會先在Unity的Hierachy區域內建立一個GameObject,再把這個GameObject拖放到Inspector內,最後在ClassA類別內Instantiate()方法複製(Clone)另一個GameObject。
注意1: Unity的GameObject與C#類別所建立的物件(Object/Instance)是不同的,Unity的GameObject就是Unity建立的一個GameObject,它可以顯示在2D/3D 場景上,所以我會簡單叫 Unity的GameObject和C#的類別物件。
注意2: Instantiate()方法是複製另一個GameObject,所以最後會有兩個GameObject,一個是在Unity的Hierachy區域內建立一個GameObject,而另一個是在ClassA類別內用Instantiate()方法複製的GameObject。
- 建立一個Unity Class - ClassA,ClassA會自動繼承MonoBehaviour類別
(i.e. ClassA: MonoBehaviour)。 - 建立一個Unity Empty GameObject - EmptyGameObjectA,再把EmptyGameObjectA拖放到Unity的Inspector區域內。
- 在ClassA內用Instantiate()方法Clone(複製)一個新的EmptyGameObjectA GameObject。
- 這個例子會建立兩個Unity GameObject。
注意: 除了Unity Empty GameObject - EmptyGameObjectA外,Instantiate()方法Clone(複製)一個新的EmptyGameObjectA GameObject。
- 建立一個新Project 。
- 建立一個Empty GameObject - EmptyGameObjectA。
- 在Assets區域內建立一個Script。
- 選擇Main Camera。
- 把Script拖放到Main Camera內。
- 再把EmptyGameObjectA拖放到Class A (Script)內。
- ClassA類別。
- ClassA是一個Unity Class,它會自動繼承MonoBehaviour類別的。
- 在ClassA內,建立一個gameObjectAInScript Reference。
- 用Instantiate()方法Clone(複製)一個新的EmptyGameObjectA GameObject。
5.1) Result
- 結果成功顯示,在Hierarchy區域內會建立一個新GameObject。
6) Create GameObject in Script by Instantiate() with Drag & Drop Prefab
第六個例子會介紹在Unity內建立一個Unity類別ClassA,再在ClassA內用Instantiate()方法Clone(複製)一個新的EmptyGameObjectA GameObject。
- 建立一個Unity Class - ClassA,ClassA會自動繼承MonoBehaviour類別
(i.e. ClassA: MonoBehaviour)。 - 把Hierarchy區域內的EmptyGameObjectA拖放到Assets區域內的Resources\Prefabs\內,Prefab EmptyGameObject就會產生。
- 在ClassA內用Instantiate()方法Clone(複製)一個新的EmptyGameObjectA GameObject。
- 這個例子會建立兩個Unity GameObject。
注意: 除了Assets區域內的Resources\Prefabs\EmptyGameObject外,Instantiate()方法Clone(複製)一個新的EmptyGameObjectA GameObject。
- 建立一個新Project 。
- 在Assets區域內建立一個Resources/Prefabs Directory 。
- 把Empty GameObject拖放到Resources/Prefabs內,最後EmptyGameObjectA可以刪除。
- 在Assets區域內建立一個Script。
- 選擇Main Camera。
- 把Script拖放到Main Camera內。
- 再把Prefabs EmptyGameObjectA拖放到Class A (Script)內。
- ClassA類別。
- ClassA是一個Unity Class,它會自動繼承MonoBehaviour類別的。
- 在ClassA內,建立一個gameObjectAInScript Reference。
- 用Instantiate()方法Clone(複製)一個新的EmptyGameObjectA GameObject。
6.1) Result
- 結果成功顯示,在Hierarchy區域內會建立一個新GameObject。
7) Create GameObject in Script by Instantiate() with Resources.Load() Prefab
第七個例子會介紹在Unity內建立一個Unity類別ClassA,再在ClassA內用Resources.Load()方法傳入Prefab EmptyGameObject,再用Instantiate()方法Clone(複製)一個新的EmptyGameObjectA GameObject。
- 建立一個Unity Class - ClassA,ClassA會自動繼承MonoBehaviour類別
(i.e. ClassA: MonoBehaviour)。 - 把Hierarchy區域內的EmptyGameObjectA拖放到Assets區域內的Resources\Prefabs\內,Prefab EmptyGameObject就會產生。
- 在ClassA內用Resources.Load()方法傳入Prefab EmptyGameObject,再用Instantiate()方法Clone(複製)一個新的EmptyGameObjectA GameObject。
- 這個例子會建立兩個Unity GameObject。
注意: 除了用Resources.Load()方法傳入Prefab EmptyGameObject外,Instantiate()方法Clone(複製)一個新的EmptyGameObjectA GameObject。
- 建立一個新Project 。
- 在Assets區域內建立兩個Script。
- 選擇Main Camera。
- 把兩個Script拖放到Main Camera內。
- 在Assets區域內建立一個Resources/Prefabs Directory , 再把EmptyGameObject拖放到Resources/Prefabs內,最後EmptyGameObjectA可以刪除。
- ClassA類別。
- ClassA是一個Unity Class,它會自動繼承MonoBehaviour類別的。
- 在ClassA內,建立一個gameObjectAInScript Reference。
- 用Resources.Load()方法傳入Prefab EmptyGameObject,再用Instantiate()方法Clone(複製)一個新的EmptyGameObjectA GameObject。
7.1) Result
- 結果成功顯示,在Hierarchy區域內會建立一個新GameObject。
8) Create GameObject in Script by Keyword new
最後一個例子會介紹在Script內用Keyword new,產生一個新的GameObject,再用AddComponent
- 建立一個Unity Class - ClassA,ClassA會自動繼承MonoBehaviour類別
(i.e. ClassA: MonoBehaviour)。 - 把ClassA類別內用Keyword new,產生一個新的GameObject。
- 再把你須要的部分用AddComponent<T>()方法加上GameObject上,T = Generic Type,則泛型 。
- 這個例子會建立一個Unity GameObject - MyGameObjectA。
- 建立一個新Project 。
- 在Assets區域內建立兩個Script。
- 選擇Main Camera。
- 把兩個Script拖放到Main Camera內。
- ClassA類別。
- ClassA是一個Unity Class,它會自動繼承MonoBehaviour類別的。
- 在ClassA內,建立一個gameObjectAInScript Reference。
- 用Keyword new產生一個新的GameObject。
- 把須要的部分用AddComponent<T>()方法加上GameObject上,T = Generic Type,則泛型 。
8.1 Result
- 結果成功顯示,在Hierarchy區域內會建立一個新GameObject。
- Transform Component是不須要加入的,但它會自動右入所有新建的GameObject。
- Sprite Renderer Component成功加入了。
- Rigidbody 2D Component成功加入了。