Unity C# | Instantiate GameObject

更新於 發佈於 閱讀時間約 7 分鐘

前言

  這篇文章將會介紹生成物件的五種多載說明和三種應用流程。

Instantiate | 生成遊戲物件

  這個英文單字的中文翻譯為「實例化」,如果單純用於 GameObject 的話你可以叫他生成物件,不過 Instatiate 還有其他的功用,像是 Clone 腳本和泛型化,這個就不在我們今天的介紹範圍,因為我也不會。

  實例化可用於在運行時創建新對象。 示例包括用於射彈的對象,或用於爆炸效果的粒子系統,或是敵人生成和隨機生成物件,物件持裡面也包含實例化,基本上大量用到同一個物件時,可以考慮把物件變成預製物在用程式生成它。

多載函式

  在這邊簡單介紹一下多載函式,基本上同一個函式能放不同的函式參數,讓使用者用不同的參數達成不一樣的事情。

複雜度 1 | 單純生成

public static Object Instantiate(Object original);

  它會生成在遊戲中,其他一切默認,相同於你在 Hierarchy 中創建一個物件,我想這個多載用於複製程式腳本。


複雜度 2 | 單純生成,指定父物件

public static Object Instantiate(Object original, Transform parent);

  同上,不過會生成在指定的父物件下面,似乎座標也會跟父物件相同,但這個生成感覺也適用於程式腳本,也許某些...自由落體的炸彈也能使用?


複雜度 3 | 單純生成,指定父物件、座標系統

public static Object Instantiate(Object original, Transform parent, bool instantiateInWorldSpace);

  當地(Local)和世界(World)座標是兩個不同的東西,其他同上。


複雜度 4 | 生成物件,指定生成座標和面相方向 (最常用)

public static Object Instantiate(Object original, Vector3 position, Quaternion rotation);

  這是我們最常用的實例化,指定好生成物件,這通常會是一個預製物,也可以是遊戲物件,然後指定它的生成座標和面相方向, Quaternion 是座標的資料儲存形式,有興趣可以自行理解到能使用就好,細節不用。


複雜度 5 | 生成物件、指定座標和方向,安排父物件

public static Object Instantiate(Object original, Vector3 position, Quaternion rotation, Transform parent);

  這個跟上面幾乎都相同,不過可以指定父物件。


應用思路

  這次我想嘗試一個撰寫應用的方式,使用程式碼的方式太過於複雜,很難解是到比較全面的教學,對於非程式人員來說很難理解,我想用流程指南的方式去講解。

發射子彈

  有不少遊戲中,都有發射子彈的機制,這個機制的撰寫和運作流程如下:

1. 製作一顆子彈放進預置物,刪掉在 Hierarchy 中的遊戲物件,子彈能是一個圓球或是精心製作好的建模物件,甚至能加特效和材質。

2. 在要發射的位置創建一個空物件,這能是槍口或陷阱口等位置,並讓它的正前方 ( 正Z軸) 面相發射方向,在程式腳本中創建一個 void 函式,未來我們會在這個函式中抓取這個位置的資料。

3. 在程式腳本中,使用實例化函式,使用複雜度 4 的多載函式,總共會需要複製物件、生成座標、生成物件面相方向,全部直接抓取空物件資料即可,方向記得抓取 Local 座標 (transform.forward等),這段寫完以後,會生成子彈於槍口並面向發射發向。

4. 在子彈預製物中新增剛體 (rigidbody),讓它能跟隨牛頓的腳步,回到程式腳本中,新增速度,會需要子彈的速度方向,依照子彈的種類不同,從直直射出去到拋物線砲彈都可以。

5. 依照不同的需求,可能會需要按鍵發射、定時發射、觸發發射,撰寫好發射的機制,可能是按鍵、計時器、觸發偵測,把 void 函式放進去,這個步驟可以移到步驟 2 之前,方便測試。

6. 測試、除錯、優化,最後完成它。

粒子系統

  實例化通常用於一次性的特效,譬如說煙花、爆炸、水波等等。

1. 製作好特效的預製物,它可是商店的素材或自己的作品,把它放在 Assets中而非 Hierarchy。

2. 在爆炸發生的位置創建一個空物件,或是在需要爆炸的物件上寫程式腳本。

3. 依照不同的需求,可能會需要一次性爆發、一次爆發多次、觸發爆炸、定時爆發等等,可能是碰撞偵測、計時器、隨機位置、觸發偵測等等,確定程式能正常運作,像是 Debug.Log 輸入一段文字。

4. 在程式腳本使用實例化函式,使用複雜度 4 的多載函式,總共會需要複製物件、生成座標、生成物件面相方向,全部直接抓取步驟2的資料即可。

5. 因為特效自己會運作,所以這樣就完成了,一樣會需要測試、除錯、優化。

敵人生成

  遊戲中的敵人通常會使用實例化生成。

1. 製作好敵人的預製物,它可是商店的素材或自己的作品,把它放在 Assets中而非 Hierarchy。

2. 在敵人生成的位置創建一個空物件。

3. 依照不同的需求,位置上有定點生成、平面範圍生成、立體範圍生成,生成方式有定時出現、觸發出現、隨機出現,可能是計時器、隨機位置和時間、觸發偵測等等,確定程式能正常運作,像是 Debug.Log 輸入多段文字。

4. 在程式腳本使用實例化函式,使用複雜度 4 的多載函式,總共會需要複製物件、生成座標、生成物件面相方向,全部直接抓取步驟2的資料即可。

5. 因為敵人通常具備 AI,無論簡單還是複雜,自己都會運作,所以這樣就完成了,一樣會需要測試、除錯、優化。

參考資料

Unity API | Object.Instantiate

Unity 官方說明和實作教學

後記

  我在嘗試一些新的東西和寫作方式,像是條列化與流程化,並盡量能讓各種不同的族群了解遊戲程式在做的事情,結果花了我不少時間...

瓶裝雪 | 想了解我更多嗎?

留言
avatar-img
留言分享你的想法!
瓶裝雪-avatar-img
發文者
2022/10/13
原來 Instantiate 會產生垃圾,是暫存檔還是空資料夾之類的? 在之前上課其實有交到物件池的設計,原來子彈也能放進物件池? 物件池原來官方有介紹! 談到生成物件座標,所以生成物件座標的設定是當地座標還是世界座標?是不是默認的情況下都是當地座標?
瓶裝雪-avatar-img
發文者
2022/10/16
感覺物件池是一定要學好的東西
Neish-avatar-img
2022/10/12
其實實務上像是子彈跟敵人這種東西很少會在遊戲進行中instantiate, 因為instantiate速度慢而且會產生garbage 常見的作法是在讀取階段先把需要用到的敵人跟子彈放在object pool中, 可以參考官方的這篇文章中Reusable object pools的部分 https://docs.unity3d.com/Manual/performance-garbage-collection-best-practices.html 另外關於 "...生成在指定的父物件下面,似乎座標也會跟父物件相同..." 如果你新生出來的子物件的local position是(0,0,0)那你的world position就會跟父物件相同 這個道理跟你在 Unity的 Hierarchy裡面把某個物件放到另一個物件底下是一樣的
avatar-img
瓶裝雪的沙龍
109會員
247內容數
對設計師如何成長為設計師好奇嗎? 2020年九月,我進入大學學習當一位設計師,從開始到沉寂,再到重燃熱忱,我將在方格子紀錄我的成長歷程、理念、心情,分享我在這段旅程中所經歷的故事。
瓶裝雪的沙龍的其他內容
2024/09/22
魔火術師是第三人稱動作射擊遊戲,屬於專題畢業製作,在畢業組成新的團隊後優化並上架。
Thumbnail
2024/09/22
魔火術師是第三人稱動作射擊遊戲,屬於專題畢業製作,在畢業組成新的團隊後優化並上架。
Thumbnail
2024/01/26
這篇文章將會講述虛擬(virtual)與覆蓋(override)的簡易使用方式。
Thumbnail
2024/01/26
這篇文章將會講述虛擬(virtual)與覆蓋(override)的簡易使用方式。
Thumbnail
2023/12/29
講述遊戲設計從新手到專業的發展方向。
Thumbnail
2023/12/29
講述遊戲設計從新手到專業的發展方向。
Thumbnail
看更多
你可能也想看
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
這篇內容,將會用一個簡單的範例,來解釋物件(Object)和實體(Instance)的差別。包括Instance的簡介、ID、物件改變會影響實體。
Thumbnail
這篇內容,將會用一個簡單的範例,來解釋物件(Object)和實體(Instance)的差別。包括Instance的簡介、ID、物件改變會影響實體。
Thumbnail
創建物件有時是一個資源密集型和耗時的過程,尤其是當涉及到從資料庫或其他來源初始化物件時。原型模式就是為了解決這種問題🔧,它提供了一種方法,能夠通過複製一個已存在的物件來迅速創建新物件,而不是從頭開始。
Thumbnail
創建物件有時是一個資源密集型和耗時的過程,尤其是當涉及到從資料庫或其他來源初始化物件時。原型模式就是為了解決這種問題🔧,它提供了一種方法,能夠通過複製一個已存在的物件來迅速創建新物件,而不是從頭開始。
Thumbnail
這篇文章將會講述彈簧物件的物件介紹、製作流程、展示影片。
Thumbnail
這篇文章將會講述彈簧物件的物件介紹、製作流程、展示影片。
Thumbnail
這篇文章將會講述 static 的小技巧,讓常用的欄位不用重複指定或拖拉。
Thumbnail
這篇文章將會講述 static 的小技巧,讓常用的欄位不用重複指定或拖拉。
Thumbnail
這篇文章將會講述使用 C# 的類( Class ) 來讓欄位模組(module)化。
Thumbnail
這篇文章將會講述使用 C# 的類( Class ) 來讓欄位模組(module)化。
Thumbnail
前言   這篇文章將會介紹生成物件的五種多載說明和三種應用流程。 Instantiate | 生成遊戲物件   這個英文單字的中文翻譯為「實例化」,如果單純用於 GameObject 的話你可以叫他生成物件,不過 Instatiate 還有其他的功用,像是 Clone 腳本和泛型化,這個就不在我們今
Thumbnail
前言   這篇文章將會介紹生成物件的五種多載說明和三種應用流程。 Instantiate | 生成遊戲物件   這個英文單字的中文翻譯為「實例化」,如果單純用於 GameObject 的話你可以叫他生成物件,不過 Instatiate 還有其他的功用,像是 Clone 腳本和泛型化,這個就不在我們今
Thumbnail
這一篇文章將會從Microsoft的.NET Class Library開始介紹,在介紹具狀態和不具狀態,以及物件和new關鍵字。
Thumbnail
這一篇文章將會從Microsoft的.NET Class Library開始介紹,在介紹具狀態和不具狀態,以及物件和new關鍵字。
Thumbnail
  本篇文章將會告訴你延時方法的呼叫方式,Invoke是一種讓函式(function)延時啟動的官方函式,通常用於延後幾秒鐘啟動或用InvokeRepeating定時啟動函式,遊戲中常用於怪物的定時召喚或延遲觸發機關等。
Thumbnail
  本篇文章將會告訴你延時方法的呼叫方式,Invoke是一種讓函式(function)延時啟動的官方函式,通常用於延後幾秒鐘啟動或用InvokeRepeating定時啟動函式,遊戲中常用於怪物的定時召喚或延遲觸發機關等。
Thumbnail
本文章將會介紹結構(Struct)的定義、簡單介紹其應用,並且補充與序列化(SerializeFile)結合的方式。
Thumbnail
本文章將會介紹結構(Struct)的定義、簡單介紹其應用,並且補充與序列化(SerializeFile)結合的方式。
Thumbnail
撰寫程式時,有沒有想過宣告的這些變數是怎麼運作的呢? 本文介紹了Value Type跟Reference Type,以及Variable的基本命名方式。
Thumbnail
撰寫程式時,有沒有想過宣告的這些變數是怎麼運作的呢? 本文介紹了Value Type跟Reference Type,以及Variable的基本命名方式。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News