Unity預制體
技術概述
unity預制體是用來創建和存儲一個游戲對象的所有組件,各項屬性和子對象。當需要多次重復使用同一個游戲對象時,便可以使用預制體,將該游戲對象設置為預制體。學習該技術的原因在團隊項目過程中需要根據房間數量自動創建房間列表,以及棋盤中每個格子的創建。
該技術的難點在於對預制體屬性的配置。
技術詳述
預制體的創建
首先搭建自己所需要的可能重復使用的游戲對象,搭建完后將其拖進Prefabs文件夾中,預制體便創建完成。
預制體實例化
當創建完預制體之后,我們便要對其進行使用。使用方法分為兩種。
一是通過將其直接拖進Scene中,便創建了一個與其組件、屬性和子對象都相同的Clone游戲對象。
二是通過c#腳本代碼實例化。
public GameObject gameObject;//聲明預制體
Vector3 a = new Vector3(0, 0, 0); //實例化預制體的position
Quaternion b = new Quaternion(0, 0, 0, 0);//實例化預制體的rotation
GameObject Sphere = GameObject.Instantiate(gameObject, a, b) as GameObject;//實例化
當然,如果我們要將預制體實例化到制定的位置,只需要獲取該位置的position,然后將其作為a參數傳遞進去便可將預制體實例化到制定的位置。
預制體重寫
我們所需要的重復的對象可能並不是千篇一律的相同的游戲對象,例如在房間列表上,每個房間的房間號,人數等等信息都不一樣,因此在實例化的過程中需要對實例化的游戲對象進行重寫。因為重寫的優先級是高於預制體的,實例化的預制體在組件、屬性和子對象上會有所不同。
重寫的方式也有兩種,一是通過Scene界面直接修改預制體實例對象的屬性值、組件、子對象等等。
二是通過c#腳本代碼對預制體實例化對象進行重寫。
public GameObject gameObject;//聲明預制體
Vector3 a = new Vector3(0, 0, 0); //實例化預制體的position
Quaternion b = new Quaternion(0, 0, 0, 0);//實例化預制體的rotation
GameObject Sphere = GameObject.Instantiate(gameObject, a, b) as GameObject;//實例化
Sphere.getGetComponent<Text>().text().text="123456";//對預制體實例對象的text組件進行重寫
使用流程圖
問題和解決過程
問題一
當我們要將預制體實例化到指定的位置時,如果一個個去確定位置(x,y,z),再將該參數傳入到實例化函數當中,那么將變得十分繁瑣。
解決方案:我們可以預先在指定位置處設置一個游戲對象GameObject,然后獲取GameObject的transform組件便可以獲取該位置的坐標信息並作為參數傳遞到實例化函數當中去。使用如下:
public GameObject gameObject;//聲明所指定位置上的游戲對象
public GameObject prefabs;//聲明預制體
GameObject Sphere = GameObject.Instantiate(prefabs, gameObject.transform) as GameObject;//實例化到gameObject對象位置上
問題二
當我們在預制體上添加button組件,並綁定了onClick()事件后,所有的預制體實例的點擊事件都會是onClick(),如何去讓不同的實例有不同的點擊事件
解決方案:在實例化預制體后,重新編寫一個事件函數,再將該事件函數與實例的button組件進行綁定
總結
Unity預制體是Unity設計中一個需要經常使用到的技術和功能之一。當去創建、配置和存儲好一個游戲對象,並將其設置為預制體之后,就成了一個可以不斷重復使用的資源和模板,並且該資源和模板可以在使用過程中根據實際情況進行改寫。當需要重復使用一個游戲對象時,便可以使用預制體功能。
參考
《unity3d入門到精通》