在Unity使用Prefab過程當中,咱們有時候須要進行Prefab實例斷開引用和替換引用的需求。實現這些需求,使用到的核心的類是PrefabUtility。PrefabUtility是一個靜態類,主要用於進行Prefab的相關處理。 這裏主要使用如下幾種方法html
斷開Prefab引用的代碼以下函數
[MenuItem("Tools/Prefab/去除引用")]ui
public static void BreakPrefabRef()spa
{code
var select = Selection.activeGameObject;orm
if (select.activeInHierarchy)htm
{blog
PrefabUtility.DisconnectPrefabInstance(select);ip
Selection.activeGameObject = null;內存
var prefab = PrefabUtility.CreateEmptyPrefab("Assets/empty.prefab");
PrefabUtility.ReplacePrefab(select, prefab, ReplacePrefabOptions.ConnectToPrefab);
PrefabUtility.DisconnectPrefabInstance(select);
AssetDatabase.DeleteAsset("Assets/empty.prefab");
}
}
雖然PrefabUtility.DisconnectPrefabInstance有斷開Prefab的含義,可是若是僅僅使用這個函數會出現下面這個狀況,名字的顏色從藍變白,看起來已經不是一個prefab,可是從Inspector面板中仍是可以看到Prefab標記以及Prefab實例纔會出現的那三個Select、Revert、Apply按鈕。
若是嘗試在這個時候刪除掉Project裏面的源prefab,發現這個prefab標記就消失了。
所以,這裏採用如下方法實現整個斷開引用
至此就完成了斷開引用的功能。這裏在函數加上[menuitem]標籤,將這個功能放在unity菜單「Tools->Prefab->去除引用」上。
替換引用的代碼以下
[MenuItem("Tools/Prefab/替換引用")]
public static void RelocalPrefabRef()
{
var select = Selection.activeGameObject;
if (select.activeInHierarchy)
{
var ab = PrefabUtility.GetPrefabParent(select);
if (ab == null)
return;
var oripath = AssetDatabase.GetAssetPath(ab);
var filters = new[] { "prefab file", "prefab" };
var tar = EditorUtility.OpenFilePanelWithFilters("select target", Application.dataPath, filters);
if (string.IsNullOrEmpty(tar))
return;
tar = FileUtil.GetProjectRelativePath(tar);
var tarprefab = AssetDatabase.LoadAssetAtPath<GameObject>(tar);
if (tarprefab == null)
return;
var gname = select.name;
var enable = select.activeInHierarchy;
var pos = select.transform.localPosition;
var rot = select.transform.localRotation;
var scale = select.transform.localScale;
var go = PrefabUtility.ConnectGameObjectToPrefab(select, tarprefab);
go.transform.localPosition = pos;
go.transform.localRotation = rot;
go.transform.localScale = scale;
go.name = gname;
go.SetActive(enable);
Debug.LogFormat("Replace Prefab From:{0} to {1}", oripath, tar);
}
}
代碼中主要的流程爲
至此完成了Prefab實例替換引用的功能。在Unity中選擇菜單Tools->Prefab->替換引用,選擇一個prefab便可實現替換
轉載保留:http://www.cnblogs.com/CodeGize http://www.codegize.com