代碼動態加載Prefab預設體

轉載自:http://m.blog.csdn.net/article/details?id=51355198

在進行一些功能開發的時候,我們常常將一些能夠複用的對象製作成.prefab的預設物體,然後將預設體存放到Resources目錄之下,使用時再動態加載到場景中並進行實例化。例如:子彈、特效甚至音頻等,都能製作成預設體。

一、預設動態加載到場景:

 一個預設體要能夠通過代碼控制在場景中進行顯示,需要三個步驟,這裏我們以動態加載怪物血條爲例子分析一個常見的誤區:

1.預設體資源加載:

        //加載預設體資源
        GameObject hp_bar = (GameObject)Resources.Load("Prefabs/HP_Bar");

        

            

通過上述操作,實現從資源目錄下載入HP_Bar.prefab預設體,用一個GameObject對象來存放,此時該預設物體並未真正載入到場景中,因爲還未進行實例化操作。

2.預設體實例化:

 在第一步中我們已經將預設體資源加載完畢,但是爲實例化的資源不會出現在場景中,所以第二不我們需要對資源進行實例化,實例化使用的是MonoBehaviour.Instantiate函數來完成的,其實質就是從預設體資源中克隆出一個對象,它具有與預設體完全相同的屬性,並且被加載到當前場景中:

    //實例化預設體
        Instantiate(hp_bar);

完成以上代碼之後,在當前場景中會出現一個實例化之後的對象,可以在Hierarchy欄中查看到:

        

因爲我們沒有對此實例化後的對象進行任何的屬性設置,所以其屬性與預設體最初的屬性保持一致,並且其父節點默認爲當場的場景對外層。
3.實例化對象屬性設置(可選):

完成上述步驟之後,我們已經可以在場景中看到實例化之後的對象,但是通常情況下我們喜歡我們的對象之間層次感分明,而且這樣也方便我們進行對象統一管理,而不是在Hierarchy中看到一大堆並排散亂對象,所以我們需要爲對象設置名稱已經父節點等屬性。

常見錯誤:對未初始化的hp_bar進行屬性設置,設置之後的屬性在實例化之後無法生效。這是因爲我們最後在場景中顯示的其實並非實例化前的資源對象,而是一個克隆對象,所以假如希望設置的屬性在最後顯示出來的對象中生效,我們需要對實例化之後的對象進行設置。)

 正確的設置代碼如下,可以看到實例化對象已成功掛在到父節點Canvas上:

    GameObject hp_bar = (GameObject)Resources.Load("Prefabs/HP_Bar");
        GameObject mUICanvas = GameObject.Find("Canvas");
        hp_bar = Instantiate(hp_bar);
        hp_bar.transform.parent = mUICanvas.transform;

 其實前兩個步驟可以在一起完成,簡化後的寫法如下:

        GameObject hp_bar = (GameObject)Instantiate(Resources.Load("Prefabs/HP_Bar"));
        GameObject mUICanvas = GameObject.Find("Canvas");
        hp_bar.transform.parent = mUICanvas.transform;





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章