利用PrefabUtility API規範Prefab製作
在Unity開發過程中,會有很多需要大家自覺遵守的「製作規則」。
這裡以UI的Prefab為例,分享一個規範Prefab製作的方法。
在UI的Prefab製作中,我們會有一些類似這樣的規範要求:
- 粒子特效必須動態載入,不能直接掛在Prefab里;
- 動態載入的大圖不能直接掛在Prefab上;
- 文本字型大小符合規範;
- ...
這些規則並不難理解,也不難執行,但本身規則比較細節,容易遺漏。且隨著團隊人員流動,這些規則很難被100%地完美執行。
如果用人為檢查的方式去規範,又耗費人力。因此,就想到希望有工具能自動檢查Prefab的製作是否符合規範,自動修改並給出報錯提示。
PrefabUtility是一個靜態類,主要用於進行Prefab的相關處理。
這裡利用PrefabUtility.prefabInstanceUpdated可以監聽Prefab Apply操作,就可以在Prefab Apply的時候進行規範檢查和修改了。
[InitializeOnLoadMethod]static void StartInitializeOnLoadMethod(){ PrefabUtility.prefabInstanceUpdated = delegate(GameObject instance){ if(instance){ ProcessUIPrefab(instance); } };} /// <summary>/// 檢查如果是UI的prefab進行一些處理/// </summary>static void ProcessUIPrefab(GameObject instance){ Object parentPrefab = PrefabUtility.GetPrefabParent(instance); string prefabPath = AssetDatabase.GetAssetPath(PrefabUtility.GetPrefabParent(instance)); bool needCheck = false; foreach(string path in UIPrefabPath) { if(prefabPath.Contains(path)) { needCheck = true; } } if(!needCheck) { return; } bool isChange = ProcessUIPrefab(instance); //具體對Prefab進行操作的方法 if(isChange) { PrefabUtility.ReplacePrefab(instance, parentPrefab, ReplacePrefabOptions.ConnectToPrefab); }}
推薦閱讀: