Unity 实现删除missing脚本组件
通过Resources.FindObjectsOfTypeAll查找所有GameObject,然后通过.hideFlags == HideFlags.None判断是否为存在于Hierarchy面板。(此为编辑器脚本)
详细代码:
/******************************************************************************* * 版本声明:v1.0.0 * 类 名 称:DeleteMissingScripts * 创建日期:8/10/2019 5:04:13 PM * 作者名称:末零 * 功能描述:删除所有Miss的脚本 ******************************************************************************/ using UnityEngine; using UnityEditor; public class DeleteMissingScripts { [MenuItem("MyTools/Delete Missing Scripts")] static void CleanupMissingScript() { GameObject[] pAllObjects = (GameObject[])Resources.FindObjectsOfTypeAll(typeof(GameObject)); int r; int j; for (int i = 0; i < pAllObjects.Length; i++) { if (pAllObjects[i].hideFlags == HideFlags.None)//HideFlags.None 获取Hierarchy面板所有Object { var components = pAllObjects[i].GetComponents<Component>(); var serializedObject = new SerializedObject(pAllObjects[i]); var prop = serializedObject.FindProperty("m_Component"); r = 0; for (j = 0; j < components.Length; j++) { if (components[j] == null) { prop.DeleteArrayElementAtIndex(j - r); r++; } } serializedObject.ApplyModifiedProperties(); } } } }
补充:Unity中一键删除所有已失效的脚本
如下所示:
//删除所有Miss的脚本 using UnityEngine; using UnityEditor; public class DeleteMissingScripts { [MenuItem("MyTools/Delete Missing Scripts")] static void CleanupMissingScript() { GameObject[] pAllObjects = (GameObject[])Resources.FindObjectsOfTypeAll(typeof(GameObject)); int r; int j; for (int i = 0; i < pAllObjects.Length; i++) { if (pAllObjects[i].hideFlags == HideFlags.None)//HideFlags.None 获取Hierarchy面板所有Object { var components = pAllObjects[i].GetComponents<Component>(); var serializedObject = new SerializedObject(pAllObjects[i]); var prop = serializedObject.FindProperty("m_Component"); r = 0; for (j = 0; j < components.Length; j++) { if (components[j] == null) { prop.DeleteArrayElementAtIndex(j - r); r++; } } serializedObject.ApplyModifiedProperties(); } } } }
此为编辑器脚本
使用方法:
方法二:
using UnityEngine; using UnityEditor; public class DeleteMissingScripts { [MenuItem("Edit/Cleanup Missing Scripts")] static void CleanupMissingScripts() { for (int i = 0; i < Selection.gameObjects.Length; i++) { var gameObject = Selection.gameObjects[i]; // We must use the GetComponents array to actually detect missing components var components = gameObject.GetComponents<Component>(); // Create a serialized object so that we can edit the component list var serializedObject = new SerializedObject(gameObject); // Find the component list property var prop = serializedObject.FindProperty("m_Component"); // Track how many components we've removed int r = 0; // Iterate over all components for (int j = 0; j < components.Length; j++) { // Check if the ref is null if (components[j] == null) { // If so, remove from the serialized component array prop.DeleteArrayElementAtIndex(j - r); // Increment removed count r++; } } // Apply our changes to the game object serializedObject.ApplyModifiedProperties(); EditorUtility.SetDirty(gameObject); } } }
建议采取方法二
已知两种方法可能会出现某些错误,
方法二运行几次会自动修复(方法一未测试)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。
赞 (0)