ETH官方钱包

前往
大廳
主題

Unity C# | Instantiate GameObject

瓶裝雪 | 2022-10-12 19:00:05 | 巴幣 122 | 人氣 848

前言
  這篇文章將會(huì)介紹生成物件的五種多載說明和三種應(yīng)用流程。

Instantiate | 生成遊戲物件
  這個(gè)英文單字的中文翻譯為「實(shí)例化」,如果單純用於 GameObject 的話你可以叫他生成物件,不過 Instatiate 還有其他的功用,像是 Clone 腳本和泛型化,這個(gè)就不在我們今天的介紹範(fàn)圍,因?yàn)槲乙膊粫?huì)。

  實(shí)例化可用於在運(yùn)行時(shí)創(chuàng)建新對(duì)象。 示例包括用於射彈的對(duì)象,或用於爆炸效果的粒子系統(tǒng),或是敵人生成和隨機(jī)生成物件,物件持裡面也包含實(shí)例化,基本上大量用到同一個(gè)物件時(shí),可以考慮把物件變成預(yù)製物在用程式生成它。

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

複雜度 1 | 單純生成

public static Object Instantiate(Object original);

  它會(huì)生成在遊戲中,其他一切默認(rèn),相同於你在 Hierarchy 中創(chuàng)建一個(gè)物件,我想這個(gè)多載用於複製程式腳本。

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

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

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

複雜度 3 | 單純生成,指定父物件、座標(biāo)系統(tǒng)

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

  當(dāng)?shù)兀↙ocal)和世界(World)座標(biāo)是兩個(gè)不同的東西,其他同上。

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

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

  這是我們最常用的實(shí)例化,指定好生成物件,這通常會(huì)是一個(gè)預(yù)製物,也可以是遊戲物件,然後指定它的生成座標(biāo)和面相方向, Quaternion 是座標(biāo)的資料儲(chǔ)存形式,有興趣可以自行理解到能使用就好,細(xì)節(jié)不用。

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

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

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

應(yīng)用思路
  這次我想嘗試一個(gè)撰寫應(yīng)用的方式,使用程式碼的方式太過於複雜,很難解是到比較全面的教學(xué),對(duì)於非程式人員來說很難理解,我想用流程指南的方式去講解。

發(fā)射子彈
  有不少遊戲中,都有發(fā)射子彈的機(jī)制,這個(gè)機(jī)制的撰寫和運(yùn)作流程如下:

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

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

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

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

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

6. 測試、除錯(cuò)、優(yōu)化,最後完成它。

粒子系統(tǒng)
  實(shí)例化通常用於一次性的特效,譬如說煙花、爆炸、水波等等。

1. 製作好特效的預(yù)製物,它可是商店的素材或自己的作品,把它放在 Assets中而非 Hierarchy。
2. 在爆炸發(fā)生的位置創(chuàng)建一個(gè)空物件,或是在需要爆炸的物件上寫程式腳本。

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

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

5. 因?yàn)樘匦ё约簳?huì)運(yùn)作,所以這樣就完成了,一樣會(huì)需要測試、除錯(cuò)、優(yōu)化。

敵人生成
  遊戲中的敵人通常會(huì)使用實(shí)例化生成。

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

2. 在敵人生成的位置創(chuàng)建一個(gè)空物件。

3. 依照不同的需求,位置上有定點(diǎn)生成、平面範(fàn)圍生成、立體範(fàn)圍生成,生成方式有定時(shí)出現(xiàn)、觸發(fā)出現(xiàn)、隨機(jī)出現(xiàn),可能是計(jì)時(shí)器、隨機(jī)位置和時(shí)間、觸發(fā)偵測等,確定程式能正常運(yùn)作,像是 Debug.Log 輸入多段文字。

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

5. 因?yàn)閿橙送ǔ>邆?AI,無論簡單還是複雜,自己都會(huì)運(yùn)作,所以這樣就完成了,一樣會(huì)需要測試、除錯(cuò)、優(yōu)化。

參考資料

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

送禮物贊助創(chuàng)作者 !
0
留言

創(chuàng)作回應(yīng)

相關(guān)創(chuàng)作

更多創(chuàng)作