编辑器脚本: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的脚本");
}
});
}
}