missing prefab 检查
问题:unity手动删除预制件后,对嵌套了被删除预制件的预制件进行打包Assetbundle,unity无报错Crash。为了解决crash检查代码如下:
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEditor;public class MissingPrefabDetector{ static void Init() { string[] allPrefabs = GetAllPrefabs(); int count = 0; EditorUtility.DisplayProgressBar("Processing...", "Begin Job", 0); foreach (string prefab in allPrefabs) { AssetDatabase.ImportAsset(prefab); UnityEngine.Object o = AssetDatabase.LoadMainAssetAtPath(prefab); if (o == null) { Debug.Log("prefab " + prefab + " null?"); continue; } GameObject go; try { go = o as GameObject; EditorUtility.DisplayProgressBar("Processing...", go.name, ++count / (float)allPrefabs.Length); FindMissingPrefabInGO(go, prefab, true); } catch { Debug.Log("For some reason, prefab " + prefab + " won't cast to GameObject"); } } EditorUtility.ClearProgressBar(); } static void FindMissingPrefabInGO(GameObject g, string prefabName, bool isRoot) { if (g.name.Contains("Missing Prefab")) { Debug.LogError($"{prefabName} has missing prefab {g.name}"); return; } if (PrefabUtility.IsPrefabAssetMissing(g)) { Debug.LogError($"{prefabName} has missing prefab {g.name}"); return; } if (PrefabUtility.IsDisconnectedFromPrefabAsset(g)) { Debug.LogError($"{prefabName} has missing prefab {g.name}"); return; } if (!isRoot) { if (PrefabUtility.IsAnyPrefabInstanceRoot(g)) { return; } GameObject root = PrefabUtility.GetNearestPrefabInstanceRoot(g); if (root == g) { return; } } // Now recurse through each child GO (if there are any): foreach (Transform childT in g.transform) { //Debug.Log("Searching " + childT.name+ " " ); FindMissingPrefabInGO(childT.gameObject, prefabName, false); } } public static string[] GetAllPrefabs() { string[] temp = AssetDatabase.GetAllAssetPaths(); List<string> result = new List<string>(); foreach (string s in temp) { if (s.Contains(".prefab")) result.Add(s); } return result.ToArray(); }}
页:
[1]