这篇博客是查找unity中缺失引用的一个简单简短的解决方案。你可以从GitHub上获取源码。
缺失引用
一个丢失引用与没有引用(在检视表显示“None”)是完全不同的概念。这些友各种原因造成,比如:把资源文件从Unity编辑器中移除,导致在.meta文件混乱,其中有个指向无效的连接。
主要问题是缺失引用在项目中会被隐藏在某处,只有等运行中找到时已经太晚了。幸运的是,我们编写了编辑器脚本来补救...
 
解决方案:
以防止你也遇到这种问题,下面是查找缺失引用的所有代码:
 
 using System.Collections;
using System.Linq;
using UnityEditor;
using UnityEngine; public class MissingReferencesFinder : MonoBehaviour
{
[MenuItem("Tools/Show Missing Object References in scene", false, )]
public static void FindMissingReferencesInCurrentScene()
{
var objects = GetSceneObjects();
FindMissingReferences(EditorApplication.currentScene, objects);
} [MenuItem("Tools/Show Missing Object References in all scenes", false, )]
public static void MissingSpritesInAllScenes()
{
foreach (var scene in EditorBuildSettings.scenes.Where(s => s.enabled))
{
EditorApplication.OpenScene(scene.path);
FindMissingReferences(scene.path, GetSceneObjects());
}
} [MenuItem("Tools/Show Missing Object References in assets", false, )]
public static void MissingSpritesInAssets()
{
var allAssets = AssetDatabase.GetAllAssetPaths();
var objs = allAssets.Select(a => AssetDatabase.LoadAssetAtPath(a, typeof(GameObject)) as GameObject).Where(a => a != null).ToArray(); FindMissingReferences("Project", objs);
} private static void FindMissingReferences(string context, GameObject[] objects)
{
foreach (var go in objects)
{
var components = go.GetComponents(); foreach (var c in components)
{
if (!c)
{
Debug.LogError("Missing Component in GO: " + FullPath(go), go);
continue;
} SerializedObject so = new SerializedObject(c);
var sp = so.GetIterator(); while (sp.NextVisible(true))
{
if (sp.propertyType == SerializedPropertyType.ObjectReference)
{
if (sp.objectReferenceValue == null
&& sp.objectReferenceInstanceIDValue != )
{
ShowError(context, go, c.GetType().Name, ObjectNames.NicifyVariableName(sp.name));
}
}
}
}
}
} private static GameObject[] GetSceneObjects()
{
return Resources.FindObjectsOfTypeAll()
.Where(go => string.IsNullOrEmpty(AssetDatabase.GetAssetPath(go))
&& go.hideFlags == HideFlags.None).ToArray();
} private const string err = "Missing Ref in: [{3}]{0}. Component: {1}, Property: {2}"; private static void ShowError (string context, GameObject go, string c, string property)
{
Debug.LogError(string.Format(err, FullPath(go), c, property, context), go);
} private static string FullPath(GameObject go)
{
return go.transform.parent == null
? go.name
: FullPath(go.transform.parent.gameObject) + "/" + go.name;
}
}
作者: Lior Tal

在Unity中查找缺失的引用的更多相关文章

  1. Unity中各种查找物体的方法

    本文转自博主:Teng的世界 https://blog.csdn.net/teng_ontheway/article/details/47188141 GameObject.Find().Transf ...

  2. pycharm中查找一个对象在哪里被引用

    pycharm中查找一个对象在哪里被引用 2018年10月28日 19:22:20 vivian_wanjin 阅读数:1600   PyCharm的Find Usages功能可以查找某个对象(变量. ...

  3. Unity中的值传递与引用传递

    1. 值类型 值类型变量本身保存了该类型的全部数据,当声明一个值类型的变量时,该变量会被分配到栈(Stack)上. 2. 引用类型 引用类型变量本身保存的是位于堆(Heap)上的该类型的实例的内存地址 ...

  4. [LeetCode]面试题53 - I. 在排序数组中查找数字 I(二分);面试题53 - II. 0~n-1中缺失的数字(二分)

    ##面试题53 - I. 在排序数组中查找数字 I ###题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 ...

  5. 【《Effective C#》提炼总结】提高Unity中C#代码质量的21条准则

    作者:Williammao, 腾讯移动客户端开发工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/290.h ...

  6. Unity中的内存泄漏

    在对内存泄漏有一个基本印象之后,我们再来看一下在特定环境——Unity下的内存泄漏.大家都知道,游戏程序由代码和资源两部分组成,Unity下的内存泄漏也主要分为代码侧的泄漏和资源侧的泄漏,当然,资源侧 ...

  7. 【《Effective C#》提炼总结】提高Unity中C#代码质量的22条准则

    引言 原则1尽可能地使用属性而不是可直接访问的数据成员 原则2偏向于使用运行时常量而不是编译时常量 原则3 推荐使用is 或as操作符而不是强制类型转换 原则4 推荐使用条件属性而不是if条件编译 原 ...

  8. 【转】Effective C#观后感之提高Unity中C#代码质量的21条准则

    转自:http://blog.csdn.net/swj524152416/article/details/75418162 我们知道,在C++领域,作为进阶阅读材料,必看的书是<Effectiv ...

  9. Unity中所有特殊的文件夹

    1. 隐藏文件夹以.开头的文件夹会被Unity忽略.在这种文件夹中的资源不会被导入,脚本不会被编译.也不会出现在Project视图中.2. Standard Assets在这个文件夹中的脚本最先被编译 ...

随机推荐

  1. systemd管理网络应用

    采用systemd-networkd管理网卡 主网卡eth0的配置文件/etc/systemd/network/20-eth0.network,静态配置时内容示例如下: [Match] Name=et ...

  2. git实践:对比svn

    先前只用过svn,自然也没有去对比什么好坏,亲自上手之后发现svn和git实在是有很多不同 svn优点: 学习成本对比非常低 服务器公司统一控制管理 安全机制, 不会每个人都拷贝一份, 可以对组员限制 ...

  3. drupal7 的核心模块

    核心模块 Drupal 7 block Block(区块)模块提供了与区块相关的功能,通过区块可将内容放置在网站不同区域.Block模块是Drupal的基础模块之一,不能被禁用.它是通过单独的区块管理 ...

  4. setTimeout()和setInterval()的区别

    JS学习 - setTimeout()和setInterval()的区别 相同点 setTimeout 和 setInterval的语法相同.他们都有两个参数,一个是将要执行的代码字符串,还有一个是以 ...

  5. C#7.0新语法

    一.out输出参数 在以前使用out输出参数的时候,必须先定义变量,然后才能使用,例如: 先定义一个方法,方法参数是out类型的输出参数: private void DoNoting(out int ...

  6. SpringBoot的文件下载

    SpringBoot的文件下载 2017年11月29日 10:32:20 阅读数:3907 SpringBoot的文件下载方法有很多,此处只记录使用Spring的Resource实现类FileSyst ...

  7. PCL中IO模块和类的介绍

    I/O模块中共有21个类 (1)class pcl::FIleReader:定义了PCD文件的读取接口,主要用作其他读取类的父类   pcl::FileReader有pcl::PCDReader和pc ...

  8. socket阻塞与非阻塞,同步与异步、I/O模型

    socket阻塞与非阻塞,同步与异步 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步:      所 ...

  9. Android NDK: Application targets deprecated ABI(s): armeabi Open File

    Error:(81) Android NDK: Application targets deprecated ABI(s): armeabi Error:(82) Android NDK: Suppo ...

  10. 卡片式ViewPager,一屏展示多个pager item,设置高度不一致的tabBar

    ViewPager的基本用法不必多说,这都很简单,我们可以在ViewPager中加载一个ImageView,也可以加载一个Fragment,这都是目前非常常见的用法.那么我今天说的是ViewPager ...