Unity编辑器扩展——通用组件替换工具
在我们的项目过程中经常会遇到某个组件迭代的过程,那么在废弃旧组件,替换新组件的时候,就可以使用一个通用组件替换工具完成一键替换的功能。
设计图如下:
基类ReplaceComponentBase泛型类,将旧组件和新组件传递进去。
public abstract class ReplaceComponentBase<TOldComponent, TNewComponent> where TOldComponent : Componentwhere TNewComponent : Component
MakeFindFile方法是一个虚方法供派生类可重写自己的查找方式。默认从预制体中进行查找。
protected string[] _findFiles; protected virtual void MakeFindFile(){//收集所有预制信息var extensions = new List<string>() {".prefab"};var files = Directory.GetFiles(Application.dataPath, "*.*", SearchOption.AllDirectories).Where(s => extensions.Contains(Path.GetExtension(s)?.ToLower())).ToArray();_findFiles = Directory.GetFiles(Application.dataPath, "*.*", SearchOption.AllDirectories).Where(s => extensions.Contains(Path.GetExtension(s)?.ToLower())).ToArray();}
StartReplace方法传入数据上下文,并打开进度条进行查找。
protected virtual void StartReplace(ComponentDataContextBase dataContextBase){_findComponentDict = new Dictionary<string, List<TOldComponent>>();_dataContextBase = dataContextBase;MakeFindFile();EditorUtilityHelp.ShowUpdate("正在查找", _findFiles.Length, (index) => { FindInPrefab(_findFiles[index]); },FindPrefabOver);}
ReplaceIng方法在替换过程中将旧的组件全部替换成新的组件,具体的数据操作交由ComponentDataContext子类实现。
protected virtual void ReplaceIng(TOldComponent oldComponent){var gameObject = oldComponent.gameObject;_dataContextBase.CopyComponent(oldComponent);Object.DestroyImmediate(oldComponent, true);var newComponent = gameObject.AddComponent<TNewComponent>();_dataContextBase.PasteComponent(newComponent);}
ReplaceOver在替换完成时调用,通常打印相关的替换信息。
protected virtual void ReplaceOver(){foreach (var item in _findComponentDict){GameObject prefab = LoadGameObjectByGuid(item.Key, out var prefabPath);Debug.Log($"Replace Prefab {prefab.name} {prefabPath} ComponentsLength {item.Value.Count}", prefab);}}
ComponentDataContextBase这个类提供两个抽象方法供子类重写,主要完成对数据的赋值和粘贴操作。
public abstract class ComponentDataContextBase{public abstract void CopyComponent<TOldComponent>(TOldComponent oldComponent) where TOldComponent : Component;public abstract void PasteComponent<TNewComponent>(TNewComponent newComponent) where TNewComponent : Component;}
对于实际的应用类,例如我们需要将Test1换成Test2组件的话,testData和nameData为这两个脚本中公用的数据。那么对应的两个类分别为:
public class TestScriptComponentDataContext : ComponentDataContextBase{public object testData;public object nameData;private static BindingFlags _flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;public override void CopyComponent<TOldComponent>(TOldComponent oldComponent){var test1Script = oldComponent as Test1;testData = typeof(Test1).GetField("TestData1", _flags)?.GetValue(test1Script);nameData = typeof(Test1).GetField("Name", _flags)?.GetValue(test1Script);}public override void PasteComponent<TNewComponent>(TNewComponent newComponent){var test2Script = newComponent as Test2;typeof(Test2).GetField("TestData1", _flags)?.SetValue(test2Script,testData);typeof(Test2).GetField("Name", _flags)?.SetValue(test2Script,nameData);}}
public class TestScriptReplaceComponent : ReplaceComponentBase<Test1,Test2>{public void StartReplaceTestScript(){StartReplace(new TestScriptComponentDataContext());}}
Unity编辑器扩展——通用组件替换工具相关推荐
- 【Unity编辑器扩展】语言国际化工具,生成多语言Excel自动翻译并导出多语言表
工具效果如图: 多语言是个非常简单且常用的功能.但是重复工作量大,程序手动把多语言Key配置到多语言表经常会出现错漏,或者几经改版,有些Key已经不用却没有剔除,久而久之造成冗余.这中简单且重复的工作 ...
- Unity编辑器扩展: 程序化打图集工具
开始前的声明:该案例中图集所使用图片资源均来源于网络,仅限于学习使用 一.前言 关于编辑器扩展相关的知识,在前面的两篇内容中做了详细的描述,链接地址: 第一篇 :Unity编辑器扩展 UI控件篇 第二 ...
- 【Unity编辑器扩展】(三)PSD转UGUI Prefab, 一键拼UI解放美术/程序(完结)
工具效果: 第一步,把psd图层转换为可编辑的节点树,并自动解析UI类型.自动绑定UI子元素: 第二步, 点击"生成UIForm"按钮生成UI预制体 (若有UI类型遗漏可在下拉菜单 ...
- 【Unity编辑器扩展实践】、查找所有引用该图片的预制体
上一篇Unity编辑器扩展实践二.通过代码查找所有预制中已经查到到所有的预制体了. 然后我们就可以用这些预制体做一些其他的操作了,比如查找该预制的资源引用.可以直接遍历预制,找到预制里面的所有Imag ...
- 【Unity编辑器扩展】(二)PSD转UGUI Prefab, 图层解析和碎图导出
书接上回:[Unity编辑器扩展](一)PSD转UGUI Prefab, Aspose.PSD和Harmony库的使用_TopGames的博客-CSDN博客 工具使用预览: 工具目标: 1. 实现将p ...
- 【Unity编辑器扩展】(一)PSD转UGUI Prefab, Aspose.PSD和Harmony库的使用
[Unity编辑器扩展](二)PSD转UGUI Prefab, 图层解析和碎图导出_psd导入unity_TopGames的博客-CSDN博客 [Unity编辑器扩展](三)PSD转UGUI Pref ...
- Unity编辑器扩展 UI控件篇
前摇 :认识编辑器扩展的必要性 由于各种各样的原因,无论是移动端亦或是主机/PC端,进几年的发行的游戏体量是越来越大.通常来说大体量的游戏开发需要一套很成熟完善的工作流,亦或说有很强的工业化的能力,像 ...
- Unity 编辑器扩展菜单
Unity 编辑器扩展菜单 目录 Unity 编辑器扩展菜单 一.MenuItem 特性 菜单栏扩展 1.创建多级菜单 2.创建可使用快捷键的菜单项 3.创建可被勾选的菜单项 4.检查菜单是否使用 5 ...
- Unity编辑器扩展之EditorWindow
Unity编辑器扩展之EditorWindow 继承这个类的编辑器脚本可以用来创建一个编辑器窗口,类似Inspector窗口 若要在这个类中添加一些控件,可以使用GUI和GUILayout控件,还可以 ...
最新文章
- PWA项目实战分享(听书APP)
- 【卷积神经网络结构专题】ResNet及其变体的结构梳理、有效性分析
- 用Php设置Iptables,如何使用CSF添加自定义iptables规则
- 前端小纠结--集成gitflow和standard-version使用
- SQL Server 审核(Audit)-- 创建服务器级别的审核
- C++打开的文件一定要用close()方法关闭
- Auty 2017——WebMonitor接口本地检测平台
- mips j指令_计算机组成原理 指令
- 【机器学习】手把手用AI算法实现冰雪奇缘中的“冰雪魔法”
- C 语言 普通基本数据类型 以及 其储存形式
- Python selenium web UI之Chrome 与 Chromedriver对应版本映射表及下载地址和配置(windows, Mac OS)...
- mysql创建约束时的约束名称,MySQL唯一键约束
- 小鱼的航程(改进版)(洛谷-P1424)
- idea swing 插件_【分享】我的idea配置
- ApacheCN 2019.4~7 总结
- js的基本类型有哪些?引用类型有哪些?(二)------null和undefined的区别
- 13 个设计 REST API 的最佳实践
- 王道c语言,王道训练营-C语言-一
- 怎么用8uftp上传网站,利用8Uftp上传自己的网页只需8步
- 一个朋友写的诗词收藏
热门文章
- CSS常用水平垂直居中的几种方法
- 判断某个数列是不是二元查找树的后序遍历。
- 错误,误解和攻击:分析广告拦截系统的众包过程
- ios 三种随机数生成
- CP2112使用USB转IIC通信教学示例
- 计算机二级小蒋在教务处负责学生成绩,小蒋是一位中学教师,在教务处负责初一年级学生的成绩管理。由于学校地处偏远地区,缺乏必要的教学_考题宝...
- 数据湖之Hudi基础:核心原理
- matplotlib eps格栅化,透明度被改变的问题 pdf->eps
- 金立M2017温情发布,成功的标配值得拥有
- 基于微信小程序的超市购物系统-计算机毕业设计