1. 程式人生 > >資源載入和優化之編輯器Prefab

資源載入和優化之編輯器Prefab

一,建立Prefab

函式:PrefabUtility.CreatePrefab(),需要提供儲存的目錄以及當前的遊戲物件。

            ReplacePrefabOptions.ConnectToPrefab()表示建立的Prefab的同時自動關聯到建立它的這個遊戲物件。

[MenuItem("Assets/Tools/CreatePrefab",false ,3)]
    static void CreatePrefab()
    {
        if (Selection.activeTransform)
        {
            string path = "Assets/Prefabs/Test.prefab";
            //判斷檔案是否存在,如果存在刪除
            if (AssetDatabase.LoadAssetAtPath<GameObject>(path))
            {
                AssetDatabase.DeleteAsset(path);
            }
           //建立新的Prefab傳入三個引數,路徑,物件,關聯Prefab
            PrefabUtility.CreatePrefab(path, Selection.activeGameObject,                     
            ReplacePrefabOptions.ConnectToPrefab);
            //重新整理檢視
            AssetDatabase.Refresh();
        }
    }

在層級面板中選擇一個想要建立Prefab的物件,然後點選Assets>>>>>Tools>>>>>CreatePrefab,就可以執行相關的函式。

二,例項化Prefab

在編輯器模式下我們通常使用PrefabUtility.InstantiatePrefab()方法來例項化Prefab,以及常用的FBX格式的資源,使用這種載入方式可以保持它的一些引用關係。(這方法用來保持原有的依賴關係,並非克隆一份新的)

我們通常使用transform.SetParent().第二個引數如果是false表示它不會被父座標影響,會迴歸原點。

static void MyLoad()
    {
        if (Selection.activeTransform)
        {
            GameObject gameObject  = AssetDatabase.LoadAssetAtPath<GameObject>                
           ("Assets/Prefabs/Test.prefab");
            if (gameObject != null)
            {
                GameObject go = PrefabUtility.InstantiatePrefab(gameObject) as 
                GameObject;
                go.transform.SetParent(Selection.activeTransform,false);
            }
            else
            {
                Debug.LogError("資源載入失敗!!!");
            }
        }
    }

三,更新Prefab

函式:使用PrefabUtility.ReplacePrefab()方法用來更新Prefab。

[MenuItem("Assets/Tools/ApplyPrefab", false, 4)]
    static void ApplyPrefab()
    {
        if (Selection.activeTransform)
        {
            //判斷是否是Prefab
            Object prefab = PrefabUtility.GetPrefabObject(Selection.activeGameObject);
            //如果是
            if (prefab)
            {
              PrefabUtility.ReplacePrefab(Selection.activeGameObject,prefab,ReplacePrefabOptions.ConnectToPrefab);
            }
            //重新整理Project檢視
            AssetDatabase.Refresh();
        }
    }

四,解除安裝資源

在編輯器模式下我們使用GameObject.DestroyImmediate()方法來解除安裝遊戲物件。如果需要解除安裝遊戲物件的引用資源,則第二個引數是True,預設為false。

 [MenuItem("Assets/Tools/Delete", false, 5)]
    static void Delete()
    {
        if (Selection.activeTransform)
        {

            GameObject.DestroyImmediate(Selection.activeGameObject,true);
        }
    }

五,遊戲物件與資源的一些關係

我們知道遊戲物件與資源是一種引用關係。例如一個模型是Mesh和貼圖組成的,當我們拖到場景中時,這個遊戲物件也是會引用對應的貼圖和Mesh的。通常我們刪除遊戲物件時,僅僅是把遊戲物件給刪除了呢,並沒有解除安裝掉對應的引用,因為如果載入和解除安裝遊戲物件很頻繁,每次解除安裝都將引用解除安裝掉,這會造成IO的阻塞。但是如果是長時間不用這些資源,必然導致記憶體的增加,因此我們可以使用EditorUtility.UnloadUnusedAssetsImmediate()來解除安裝長時間不用的資源。