前言
這篇文章將會(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í)間...