找回密码
 立即注册
查看: 437|回复: 0

missing prefab 检查

[复制链接]
发表于 2022-2-8 11:56 | 显示全部楼层 |阅读模式
问题:unity手动删除预制件后,对嵌套了被删除预制件的预制件进行打包Assetbundle,unity无报错Crash。

为了解决crash检查代码如下:
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEditor;public class MissingPrefabDetector{    [MenuItem("Util/Find Missing Prefab")]    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();    }}
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 21:02 , Processed in 0.087922 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表