关键点主要是对场景中Prefab得移除组件得处理,以及依赖Animation组件得删除

1. 通过 PrefabUtility.GetCorrespondingObjectFromSource 取得预制体对象

2. 通过 AssetDatabase.GetAssetPath 取得预制体路径

3. 加载预制体,DestroyImmediate删除预制体组件,并保存

4. 有些预制体并没有空Animation组件,但是引用预制体,并给预制体增加空Animation组件

5. 有些会用到 DelayAnimationPlay 组件,以来于Animation组件,但是删除Animation组件会失败,优先删除DelayAnimationPlay 组件

using System.Collections.Generic;
using System.Linq;
using TLStudio;
using UnityEditor;
using UnityEngine;
using UnityEngine.SceneManagement;namespace ProjectS.Editor
{public class CheckSceneNullAnimation : EditorWindow{public static Dictionary<string, int> info = new Dictionary<string, int>();public bool openState = false;//string bugReporterName = "";//string description = "";GameObject buggyGameObject;CheckSceneNullAnimation(){this.titleContent = new GUIContent("删除场景中空Animation组件");}[MenuItem("zpshiwo/资源工具/检查资源/批量删除所有场景中的空Animation组件")]static void showWindow(){GetWindow(typeof(CheckSceneNullAnimation));}private Vector2 _scroll;void OnGUI(){_scroll = GUILayout.BeginScrollView(_scroll);//开始一个滚动视野GUILayout.BeginVertical();if (!openState){ProcessAllAssets();openState = true;}GUILayout.BeginHorizontal();GUILayout.Space(10);GUI.skin.label.fontSize = 18;GUI.skin.label.alignment = TextAnchor.UpperLeft;int cnt = 0;foreach (var v in info){cnt += v.Value;}GUILayout.Label(string.Format("批量删除所有场景中的空Animation组件共:{0}个", cnt));GUILayout.EndHorizontal();info = info.OrderByDescending(kv => kv.Value).ToDictionary(kv => kv.Key, kv => kv.Value);GUILayout.BeginHorizontal();GUILayout.Label("SceneAssetName:", GUILayout.Width(500));GUILayout.Label("NullAnimationNum:", GUILayout.Width(240));GUILayout.EndHorizontal();foreach (var v in info){GUILayout.BeginHorizontal();GUI.skin.label.fontSize = 12;GUI.skin.label.alignment = TextAnchor.UpperLeft;GUILayout.Label(v.Key, GUILayout.Width(500));GUILayout.Label(v.Value.ToString(), GUILayout.Width(140));GUILayout.EndHorizontal();}GUILayout.EndVertical();GUILayout.EndScrollView(); //结束一个滚动视野}//利用构造函数来设置窗口名称private static void ProcessAllAssets(){info.Clear();int count = 0;EditorUtility.DisplayProgressBar("Delete Null", "Animation", 0);//遍历所有场景int total = EditorBuildSettings.scenes.Length;foreach (EditorBuildSettingsScene scene in EditorBuildSettings.scenes){count++;EditorUtility.DisplayProgressBar("Delete Scene", scene.path, (float)count / total);if(count == total)EditorUtility.ClearProgressBar();//if (!scene.path.Contains("测试场景名"))//{//    continue;//}//当场景启动中if (scene.enabled){int NullAnimationCount = 0;//打开这个场景Scene scene1 = UnityEditor.SceneManagement.EditorSceneManager.OpenScene(scene.path);//删除该场景中的所有MeshCollider 和AnimationRemove(ref NullAnimationCount);//保存UnityEditor.SceneManagement.EditorSceneManager.SaveScene(scene1);info.Add(scene1.path, NullAnimationCount);}}}static public void Remove(ref int NullAnimationCount){//获取当前场景里的所有游戏对象foreach (Animation animation in FindObjectsOfType(typeof(Animation))){if (animation!=null && animation.clip == null){if (PrefabUtility.GetPrefabAssetType(animation.gameObject) == PrefabAssetType.Regular){var items = PrefabUtility.GetCorrespondingObjectFromSource(animation.gameObject);string path = AssetDatabase.GetAssetPath(items);Debug.LogWarning("path :" + path);GameObject prefabGo = AssetDatabase.LoadAssetAtPath<GameObject>(path);Animation anim = prefabGo.GetComponent<Animation>();bool delFlag = false;if (anim != null && anim.clip == null){DelayAnimationPlay dap = prefabGo.GetComponent<DelayAnimationPlay>();if (dap != null){DestroyImmediate(dap,true);}DestroyImmediate(anim,true);EditorUtility.SetDirty(prefabGo);delFlag = true;}if (!delFlag){DelayAnimationPlay dap1 = animation.gameObject.GetComponent<DelayAnimationPlay>();if (dap1 != null){DestroyImmediate(dap1, true);}DestroyImmediate(animation, true);}}NullAnimationCount++;}}//保存AssetDatabase.SaveAssets();AssetDatabase.Refresh();}}
}

Unity 批量修改场景预制体,删除空Animation组件相关推荐

  1. Unity中 批量设置成 预制体

    在unity 中 设置预制体时,一般情况下 是一个一个的拖拽 ,很方便. 但是,遇到需求是 制作大量的预支体时, 一个一个的拖拽,效率很低, 也很无聊.查找资料, 发现 是可以批量的制作预制体的.步骤 ...

  2. Unity 将图片做成预制体

    Unity 将图片做成预制体 刚导入Assets的图片是无法直接拖入场景中的,若我们想要将图片变成预制体,需要做一点转化. 方法如下: 选中想要转成预制体的图片,更改如下图: 然后就可以将图片拖入场景 ...

  3. Unity使用c#开发遇上的问题(六)(3dmax围绕指定中心旋转,unity中动态调用预制体并根据模型旋转指定角度)

    文章目录 前言 一.3dmax创建子弹.炮塔及武器库 1.相关模型 2.炮塔模型引入unity,无法绕旋转球旋转,重新调整 1.3dmax中默认炮管的中心点 2.选择层次界面 3.选择编辑工作轴 4. ...

  4. 【Unity入门】21.预制体

    [Unity入门]预制体     大家好,我是Lampard~~     欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢  (一)预制体制作 (1)什么是预制体     这一章节的博客 ...

  5. Unity之自动生成预制体脚本

    在Unity开发中有许许多多的UI界面,包含着不同的组件,比如Button.Image等,我们需要按正确的路径找到它们并持有它们,这个步骤在界面十分庞大的时候,会十分繁琐易错.本文介绍的自动生成代码工 ...

  6. Unity 判断是否为预制体的根节点

    传进场景中的物体 gameObject 判断其是否为预制体的根节点 //判断是否为预制体的根节点public bool IsPrefabRoot(GameObject obj) {if (Prefab ...

  7. Unity 批量修改命名(重命名)

    一. 效果展示 二.代码 #if UNITY_EDITOR using System.IO; using UnityEditor; using UnityEngine;namespace Custom ...

  8. mysql批量修改表名、删除表

    mysql批量修改表名 第一步:得到所有需要修改的表名和对于得修改表名语句 SELECT CONCAT( 'ALTER TABLE ', table_name, ' RENAME TO ', REPL ...

  9. Unity批量修改FBX模型

     由于模型数量有点多,并且都要修改参数,还有从里面提取动画.就搜搜查查,搞了个小工具,批量的修改 FBX 模型的 参数,以及提取动画相关.如果有更简单的实现方法欢迎各位大佬留言. using Unit ...

最新文章

  1. 对输入框以及选择框集体的数据检验
  2. python字典之defaultdict详解
  3. python3.8.5安装-centos7 编译安装python3.8.5
  4. Java 随笔——7
  5. C语言中的位运算符主要有哪些?逻辑右移与算术右移的区别?
  6. Python 爬虫1——爬虫简述
  7. 电销机器人价格_供应商电话销售机器人服务为先
  8. svn迁移,备份,重装系统后恢复数据
  9. python 无头浏览器_Python对Selenium调用浏览器进行封装包括启用无头浏览器,及对应的浏览器配置文件...
  10. mysql使用文件排序_Mysql排序FileSort的问题
  11. SAP 修改字段长度
  12. typecho插件,typechoSEO插件,typecho程序插件
  13. 未来不迎,当时不杂,过往不乱
  14. 海思Hi3559V200运动相机、流媒体后视镜开发板防雷防静电推荐图
  15. html2canvas苹果不显示图片,html2canvas页面截图图片不显示
  16. 用计算机写作文教学难点,《用计算机写作文》教学设计
  17. 在vue中获取dom元素
  18. PPP概念股有哪些?PPP概念股大全
  19. Nginx+keepalived双主配置(双机双主热备)
  20. 深度学习(二)-----算法岗面试题

热门文章

  1. wps可以正常使用word、excel,却无法打开所有的ppt文件,也无法新建ppt文件
  2. 鸟哥推荐php书籍,好书推荐(PHP方向)
  3. 入职第一天,跟我交接后马上离职的旧员工,晚上跟我聊天,说出了她离职原因,并且吐槽公司,我该不该离职?
  4. 整理任正非思想:从二则空难事故看员工培训的重要性-1994
  5. Win11怎么彻底卸载Xbox Game Bar?
  6. M1 pro芯片Macbook Pro连接服务器
  7. 关于RTKLIB中用多普勒检测周跳方法的改进和思考
  8. W3School学习网站
  9. 你真的了解服务器托管收费标准吗?
  10. Deepin Linux CPU无法进行自动降频的一个解决方法