- Unity 4 3D開發實戰詳解
- 峰 杜化美 張月霞 索依娜編著
- 651字
- 2019-01-01 21:15:09
4.2 預制件prefab資源的應用
在一個項目的開發過程中經常會應用到預制件prefab資源,因為在一個項目中,可能會在某一個場景中同時創建多個相同的游戲對象,如果單一創建不僅會浪費空間和時間,而且在管理上也增大了難度,甚至有些時候這些事情是不可能通過人工完成,這時就需要實例化預制件(prefab)來創建對象。
若要在游戲對象上添加一些具體的屬性或是掛載一些在實際開發中要實現的特定功能的腳本時,則需要對創建的各個游戲對象挨個添加,但是若需要創建的相同游戲對象太多時,這些操作就不是人為可以添加的操作,若使用預制件prefab資源,則只需對預制件prefab資源進行相關操作即可,通過實例化創建的游戲對象擁有同樣的屬性和腳本功能。
4.2.1 預制件prefab資源的創建
在前面的章節里面講解了Assets資源菜單的具體菜單即各個菜單的功能和用途,在Create菜單下的子菜單下就擁有一個 prefab 菜單,單擊這個菜單就會在資源項目列表中創建一個預制件prefab資源。但是此時的預制件prefab只是一個空殼,還需要添加一些具體的游戲對象。下面將對具體的創建過程進行講解,具體的操作步驟如下。
(1)通過Unity集成開發環境中的菜單創建一個prefab,即單擊Assets→Create→prefab菜單,即可在項目資源列表中創建一個prefab,在此將名字改為BallPrefab。
(2)在場景中創建一個球體,即單擊GameObject→Create Other→Sphere菜單,即可在游戲組成列表中創建一個Sphere,在此將名字改為Ball。
(3)向項目中導入一個球面紋理圖片資源,即單擊Assets→Import New Asset...菜單,會立刻彈出一個 Import New Asset對話框,在對話框中找到需要的球面紋理圖片資源,單擊“Import”按鈕即可導入,在項目資源列表中就會出現這個資源文件。
(4)為創建的 Ball 添加剛體屬性和球體碰撞者屬性,即先選中 Ball,再單擊 Component→Physics→Rigidbody 菜單,即可為 Ball 添加剛體屬性。若再單擊 Component→Physics→Sphere Collider菜單,即可為Ball添加球體碰撞者屬性(若該屬性已存在,可以跳過這步)。
(5)將導入的球面紋理圖片資源添加到創建的Ball上面,這個操作很簡單,只要選中紋理圖片拖動到創建的Ball上面即可,這樣Ball的屬性里面就又多了一個紋理圖片屬性。添加各個屬性都將在屬性查看器中顯示出來,如圖4-49所示。

▲圖4-49 添加的各個屬性
(6)為剛創建的BallPrefab添加真實的游戲對象。這個操作跟第(5)步一樣,只要選中游戲組成列表中創建Ball,拖動到項目資源列表中的BallPrefab上即可,此時這個BallPrefab就具有了與Ball一樣的屬性,如圖4-50所示。

▲圖4-50 成功創建真實的 BallPrefab
4.2.2 通過prefab資源進而實例化對象
在實際的開發過程中,若要創建大量的相同的游戲對象,就需要使用prefab資源,進而通過腳本編寫程序實例化這些游戲對象,這樣不僅可以省去創建的大量時間,為各個游戲對象添加相同屬性的煩瑣操作,而且這樣節省了大量的資源,提高了項目的運行效率。
下面就通過一個實例化籃球的小案例來講解實例化的具體操作過程,具體的步驟如下。
(1)就以上面的那個BallPrefab為例,所以在此就不講解創建prefab具體操作步驟。
(2)編寫腳本,實例化籃球。單擊Assets→Create→JavaScript菜單,在項目資源列表中就創建了一個 JavaScript 腳本,在此將腳本的名字改為 BallPrefabScript,雙擊這個腳本即可進入默認的腳本編輯器,對腳本進行編輯,具體實現如下面的代碼片段所示。
代碼位置:見隨書光盤中源代碼/第04章目錄下的 Prefab/Assets/PrefabScript/BalPrefabScript.js
1 var i:int ; //聲明整型變量i
2 var j:int ; //聲明整型變量j
3 var BallPrefab : Rigidbody; //聲明剛體BallPrefab
4 var x : float; var y : float; var z : float; //聲明初始的X、Y、Z坐標
5 var k : float; var n : int; //聲明實例化球的行數
6 var count : int =0; //聲明一個計數器
7 var BP: Rigidbody[] ; //聲明剛體數組
8 function Start () { //聲明Start方法
9 BP=new Rigidbody[10]; //初始化剛體數組
10 count=0; //計數器置0
11 for(i=0;i<=n;i++){ //對變量i進行循環
12 for(var j : int =0;j<i;j++){ //對變量j進行循環
13 //在自定義的坐標位置實例化10球
14 BP[count++]=Instantiate (BallPrefab, Vector3(x-2*k*i+4*j*k,2.0,z-2*1.75*k*i), BallPrefab.rotation);
15 } } }
(3)將編寫完的腳本掛載到攝像機上,然后對攝像機腳本屬性中的各個變量參數進行合理的設置,單擊 Unity 集成開發環境的運行按鈕,在場景涉及面板中就會顯示出實例化的效果,在游戲預覽面板中會顯示運行結果,在游戲組成列表中顯示實例化的10個BallPrefab,如圖4-51所示。

▲圖4-51 實例化效果圖