编辑器脚本:Unity中如何查找哪些物体上有missing的脚本

一、需求

编辑器中选中物体,判断这些物体及子物体上是否有丢失的脚本

二、实现过程:

  • 1、编辑器选中n个物体
  • 2、获取这n个物体及其它们的子物体,数据集记为A
  • 3、A中全部物体判断他们是否有null的脚本(MonoBehaviour)
  • 4、判断一个物体(obj)是否有空脚本的关键语句:
    obj.GetComponents<MonoBehaviour>().Any(mono => mono == null)

在这里插入图片描述

三、代码清单:

该脚本为编辑器脚本,直接新建一个Editor文件夹,放在下面即可

using UnityEngine;
using UnityEditor;
using System.Linq;

public class txEditorFunctions : EditorWindow {

    [MenuItem("脚本处理/查找有missing脚本的物体")]
    static void FindMissingScriptObject()
    {
        /*******************************************************************************************
         * 1、编辑器选中n个物体
         * 2、获取这n个物体及其它们的子物体,数据集记为A
         * 3、A中全部物体判断他们是否有null的脚本(MonoBehaviour)
         * 
         * 判断一个物体(object)是否有空脚本:obj.GetComponents<MonoBehaviour>().Any(mono => mono == null)
         *******************************************************************************************/
        var objs = Selection.gameObjects;
        Debug.Log($"选中的物体数量为:{objs.Length}");

        var allObjs = objs.SelectMany(obj => obj.GetComponentsInChildren<Transform>().Select(x => x.gameObject)).ToList();
        Debug.Log($"选中的物体及其子物体的数量为:{allObjs.Count()}");

        allObjs.ForEach(obj =>
        {            
            //1、该物体是否有null的脚本
            var hasNullScript = obj.GetComponents<MonoBehaviour>().Any(mono => mono == null); //注意:用【MonoBehaviour】而不是用【MonoScript】
            //Debug.Log($"是否有空脚本:{hasNullScript},物体名字:【{obj.name}】");

            //2、Debug物体名字
            if (hasNullScript)
            {
                Debug.Log($"物体 【{obj.name}】 上有Missing的脚本");                
            }
        });
    }
}