資源載入和優化之編輯器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()來解除安裝長時間不用的資源。