FeastSC 发表于 2022-2-8 11:56

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]
查看完整版本: missing prefab 检查