首页 > 其他分享 >Unity最新一键清理Prefab中所有MissingComponent

Unity最新一键清理Prefab中所有MissingComponent

时间:2023-12-23 15:12:12浏览次数:33  
标签:Prefab pre obj AssetDatabase Unity assetGUIDs MissingComponent path

因为老的API  Properties.DeleteArrayElementAtIndex(propertyIndex);提示没权限修改,

而unity提供了新的API  GameObjectUtility.RemoveMonoBehavioursWithMissingScript(go); 更方便移除丢失的组件,需要遍历物体下面所有子节点,否则无法移除子节点的丢失组件。

于是重新整理了下清理的编辑器代码,直接贴上:

 1 using System;
 2 using UnityEngine;
 3 using UnityEditor;
 4 
 5 public class ResTool : Editor
 6 {
 7     [MenuItem("Tools/清理prefab中所有Missing的脚本")]
 8     public static void ClearAllPrefabMissingComponents()
 9     {
10         EditorUtility.DisplayProgressBar("Modify Prefab", "Please wait...", 0);
11         string[] assetGUIDs = AssetDatabase.FindAssets("t:Prefab", new string[] { "Assets/Res/Prefab" });
12         try
13         {
14             for (int i = 0; i < assetGUIDs.Length; i++)
15             {
16                 string path = AssetDatabase.GUIDToAssetPath(assetGUIDs[i]);
17                 // Debug.Log($"path:{path}");
18                 GameObject pre = PrefabUtility.LoadPrefabContents(path);
19 
20                 DeleteRecursive(pre, (go) =>
21                 {
22                     GameObjectUtility.RemoveMonoBehavioursWithMissingScript(go);
23                 });
24                 PrefabUtility.SaveAsPrefabAssetAndConnect(pre, path, InteractionMode.AutomatedAction);
25 
26                 EditorUtility.DisplayProgressBar($"清理Prefab丢失组件", $"当前{pre}, {i}/{assetGUIDs.Length}", i / (float)assetGUIDs.Length);
27             }
28         }
29         catch (Exception e)
30         {
31             Debug.LogError($"{e}");
32         }
33         
34         AssetDatabase.SaveAssets();
35         EditorUtility.ClearProgressBar();
36         AssetDatabase.Refresh();
37     }
38 
39     /// <summary>
40     /// 遍历所有子节点
41     /// </summary>
42     /// <param name="obj"></param>
43     /// <param name="action"></param>
44     static void DeleteRecursive(GameObject obj, Action<GameObject> action)
45     {
46         action(obj);
47 
48         for (int i = 0; i < obj.transform.childCount; i++)
49         {
50             DeleteRecursive(obj.transform.GetChild(i).gameObject, action);
51         }
52 
53     }
54     
55 }

 

标签:Prefab,pre,obj,AssetDatabase,Unity,assetGUIDs,MissingComponent,path
From: https://www.cnblogs.com/flamesky/p/17923139.html

相关文章

  • 基于Unity开发的强化学习环境(游戏环境):ml-agents —— Unity ML-Agents
    介绍:https://medium.com/nerd-for-tech/an-introduction-to-machine-learning-with-unity-ml-agents-af71938ca958官方地址:https://github.com/Unity-Technologies/ml-agents......
  • unity3D 敌人死亡爆炸效果
    https://www.youtube.com/watch?v=WgLd6EahyVU创建物体,添加粒子效果材质改变起始大小改变发射位置和半径生命周期和速度粒子数淡出效果持续时间模拟瞬间爆炸取消循环播放播放后销毁变成预制体......
  • Unity 捕获C++ dll的Crash
    转载:C#程序调用第三dll引起崩溃,但是try无法捕捉到第三方dll的异常-.net程序调试-少有人走的路(skcircle.com) 问题:一个第三方的dll,调用它的函数会引起程序崩溃,但是try却无法捕捉到此异常。 因为没有Try到异常,那么一个未处理的异常,会导致整个进程终止。这就是程序会崩溃的原......
  • DOTS Unity.Physics物理引擎碰撞事件处理
    最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎,今天我们给大家分享和介绍一下这个物理引擎的碰撞事件处理以及核心相关概念。Unity.Physics物理引擎的主要流程与Pipeline Unity.Physics物理引擎做仿真迭代计算的时候主要通过以下步骤来执行:   st......
  • CommunityToolkit.Mvvm 之 通过一个属性控制一个按钮是否禁用 及 按钮执行费时需任务
    要达到的目的:通过一个属性控制一个按钮是否禁用当按钮执行费时需任务时,按下禁用按钮,任务完成后自动解除禁用1. 属性定义1[ObservableProperty]2[NotifyCanExecuteChangedFor(nameof(SettingParamCommand))]//属性变化时通知对应的命令3privateboolallowOperator;2.......
  • Unity3D iOS 系统与 Unity 交互中如何实现参数传递详解
    在Unity3D开发中,与iOS系统的交互是非常常见的需求。而在交互过程中,参数传递是非常重要的环节。本文将详细介绍在Unity3DiOS系统与Unity交互中如何实现参数传递,并给出技术详解以及代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事......
  • Unity3D 背包系统的渲染如何优化详解
    Unity3D背包系统是游戏中常见的一个功能,玩家可以在游戏中收集或购买各种道具,然后将其放入背包中进行管理。然而,当背包中的道具数量增加时,往往会导致游戏的性能下降,因为需要渲染大量的道具图标和信息。因此,如何优化背包系统的渲染成为了游戏开发中的一个重要问题。对啦!这里有个游......
  • Unity3D 自定义Shader 与 内置Shader 如何整合详解
    Unity3D是一款非常流行的游戏开发引擎,它提供了丰富的内置Shader供开发者使用。然而,有时候我们需要根据具体需求自定义Shader来实现特定的效果。本文将详细介绍Unity3D中如何整合自定义Shader和内置Shader,并给出相关的技术详解和代码实现。对啦!这里有个游戏开发交流小组里面聚集了......
  • 最新UnityDOTS Physics物理引擎碰撞查询核心分析
    最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎,今天我们给大家分享和介绍一下这个物理引擎的碰撞查询以及核心相关概念。Unity.Physics碰撞查询概述碰撞查询(CollisonQurey)是Unity.Physics物理引擎中的一个很重要的功能。很多游戏逻辑都需要基于碰撞......
  • Unity DOTS物理引擎的核心分析与详解
    最近DOTS发布了正式的版本,同时基于DOTS的理念实现了一套高性能的物理引擎,今天我们来给大家分享和介绍一下这个物理引擎的使用。Unity.Physics的设计哲学Unity.Physics是基于DOTS设计思想的一个高性能C#物理引擎的实现,包含了物理刚体的迭代计算与碰撞检测等查询。Unity.Physic......