zoukankan      html  css  js  c++  java
  • 在Unity中查找缺失的引用

    这篇博客是查找unity中缺失引用的一个简单简短的解决方案。你可以从GitHub上获取源码。
    缺失引用
    一个丢失引用与没有引用(在检视表显示“None”)是完全不同的概念。这些友各种原因造成,比如:把资源文件从Unity编辑器中移除,导致在.meta文件混乱,其中有个指向无效的连接。
    主要问题是缺失引用在项目中会被隐藏在某处,只有等运行中找到时已经太晚了。幸运的是,我们编写了编辑器脚本来补救...
     
    解决方案:
    以防止你也遇到这种问题,下面是查找缺失引用的所有代码:
     
     1 using System.Collections;
     2 using System.Linq;
     3 using UnityEditor;
     4 using UnityEngine;
     5   
     6 public class MissingReferencesFinder : MonoBehaviour 
     7 {
     8     [MenuItem("Tools/Show Missing Object References in scene", false, 50)]
     9     public static void FindMissingReferencesInCurrentScene()
    10     {
    11         var objects = GetSceneObjects();
    12         FindMissingReferences(EditorApplication.currentScene, objects);
    13     }
    14   
    15     [MenuItem("Tools/Show Missing Object References in all scenes", false, 51)]
    16     public static void MissingSpritesInAllScenes()
    17     {
    18         foreach (var scene in EditorBuildSettings.scenes.Where(s => s.enabled))
    19         {
    20             EditorApplication.OpenScene(scene.path);
    21             FindMissingReferences(scene.path, GetSceneObjects());
    22         }
    23     }
    24   
    25     [MenuItem("Tools/Show Missing Object References in assets", false, 52)]
    26     public static void MissingSpritesInAssets()
    27     {
    28         var allAssets = AssetDatabase.GetAllAssetPaths();
    29         var objs = allAssets.Select(a => AssetDatabase.LoadAssetAtPath(a, typeof(GameObject)) as GameObject).Where(a => a != null).ToArray();
    30           
    31         FindMissingReferences("Project", objs);
    32     }
    33   
    34     private static void FindMissingReferences(string context, GameObject[] objects)
    35     {
    36         foreach (var go in objects)
    37         {
    38             var components = go.GetComponents();
    39               
    40             foreach (var c in components)
    41             {
    42                 if (!c)
    43                 {
    44                     Debug.LogError("Missing Component in GO: " + FullPath(go), go);
    45                     continue;
    46                 }
    47                   
    48                 SerializedObject so = new SerializedObject(c);
    49                 var sp = so.GetIterator();
    50                   
    51                 while (sp.NextVisible(true))
    52                 {
    53                     if (sp.propertyType == SerializedPropertyType.ObjectReference)
    54                     {
    55                         if (sp.objectReferenceValue == null
    56                             && sp.objectReferenceInstanceIDValue != 0)
    57                         {
    58                             ShowError(context, go, c.GetType().Name, ObjectNames.NicifyVariableName(sp.name));
    59                         }
    60                     }
    61                 }
    62             }
    63         }
    64     }
    65   
    66     private static GameObject[] GetSceneObjects()
    67     {
    68         return Resources.FindObjectsOfTypeAll()
    69             .Where(go => string.IsNullOrEmpty(AssetDatabase.GetAssetPath(go))
    70                    && go.hideFlags == HideFlags.None).ToArray();
    71     }
    72       
    73     private const string err = "Missing Ref in: [{3}]{0}. Component: {1}, Property: {2}";
    74       
    75     private static void ShowError (string context, GameObject go, string c, string property)
    76     {
    77         Debug.LogError(string.Format(err, FullPath(go), c, property, context), go);
    78     }
    79       
    80     private static string FullPath(GameObject go)
    81     {
    82         return go.transform.parent == null
    83             ? go.name
    84                 : FullPath(go.transform.parent.gameObject) + "/" + go.name;
    85     }
    86 }
    作者: Lior Tal
  • 相关阅读:
    【vue】------ 路由创建 ------ 【William】
    【vue】------------@vue/cli3.7.0创建项目+ts-------------【William】
    【svn】--------------svn介绍------------------【William】
    【vue】------浅谈vue------【William】
    node创建服务器
    vue项目搭建
    利用vw做rem适配(纯css)
    nodejs实现md5和SHA256加密
    Cookie、session、localStorage、sessionStorage的区别
    tpc三次握手与四次挥手
  • 原文地址:https://www.cnblogs.com/AaronBlogs/p/7993696.html
Copyright © 2011-2022 走看看