在我们的项目过程中经常会遇到某个组件迭代的过程,那么在废弃旧组件,替换新组件的时候,就可以使用一个通用组件替换工具完成一键替换的功能。

设计图如下:

基类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编辑器扩展——通用组件替换工具相关推荐

  1. 【Unity编辑器扩展】语言国际化工具,生成多语言Excel自动翻译并导出多语言表

    工具效果如图: 多语言是个非常简单且常用的功能.但是重复工作量大,程序手动把多语言Key配置到多语言表经常会出现错漏,或者几经改版,有些Key已经不用却没有剔除,久而久之造成冗余.这中简单且重复的工作 ...

  2. Unity编辑器扩展: 程序化打图集工具

    开始前的声明:该案例中图集所使用图片资源均来源于网络,仅限于学习使用 一.前言 关于编辑器扩展相关的知识,在前面的两篇内容中做了详细的描述,链接地址: 第一篇 :Unity编辑器扩展 UI控件篇 第二 ...

  3. 【Unity编辑器扩展】(三)PSD转UGUI Prefab, 一键拼UI解放美术/程序(完结)

    工具效果: 第一步,把psd图层转换为可编辑的节点树,并自动解析UI类型.自动绑定UI子元素: 第二步, 点击"生成UIForm"按钮生成UI预制体 (若有UI类型遗漏可在下拉菜单 ...

  4. 【Unity编辑器扩展实践】、查找所有引用该图片的预制体

    上一篇Unity编辑器扩展实践二.通过代码查找所有预制中已经查到到所有的预制体了. 然后我们就可以用这些预制体做一些其他的操作了,比如查找该预制的资源引用.可以直接遍历预制,找到预制里面的所有Imag ...

  5. 【Unity编辑器扩展】(二)PSD转UGUI Prefab, 图层解析和碎图导出

    书接上回:[Unity编辑器扩展](一)PSD转UGUI Prefab, Aspose.PSD和Harmony库的使用_TopGames的博客-CSDN博客 工具使用预览: 工具目标: 1. 实现将p ...

  6. 【Unity编辑器扩展】(一)PSD转UGUI Prefab, Aspose.PSD和Harmony库的使用

    [Unity编辑器扩展](二)PSD转UGUI Prefab, 图层解析和碎图导出_psd导入unity_TopGames的博客-CSDN博客 [Unity编辑器扩展](三)PSD转UGUI Pref ...

  7. Unity编辑器扩展 UI控件篇

    前摇 :认识编辑器扩展的必要性 由于各种各样的原因,无论是移动端亦或是主机/PC端,进几年的发行的游戏体量是越来越大.通常来说大体量的游戏开发需要一套很成熟完善的工作流,亦或说有很强的工业化的能力,像 ...

  8. Unity 编辑器扩展菜单

    Unity 编辑器扩展菜单 目录 Unity 编辑器扩展菜单 一.MenuItem 特性 菜单栏扩展 1.创建多级菜单 2.创建可使用快捷键的菜单项 3.创建可被勾选的菜单项 4.检查菜单是否使用 5 ...

  9. Unity编辑器扩展之EditorWindow

    Unity编辑器扩展之EditorWindow 继承这个类的编辑器脚本可以用来创建一个编辑器窗口,类似Inspector窗口 若要在这个类中添加一些控件,可以使用GUI和GUILayout控件,还可以 ...

最新文章

  1. PWA项目实战分享(听书APP)
  2. 【卷积神经网络结构专题】ResNet及其变体的结构梳理、有效性分析
  3. 用Php设置Iptables,如何使用CSF添加自定义iptables规则
  4. 前端小纠结--集成gitflow和standard-version使用
  5. SQL Server 审核(Audit)-- 创建服务器级别的审核
  6. C++打开的文件一定要用close()方法关闭
  7. Auty 2017——WebMonitor接口本地检测平台
  8. mips j指令_计算机组成原理 指令
  9. 【机器学习】手把手用AI算法实现冰雪奇缘中的“冰雪魔法”
  10. C 语言 普通基本数据类型 以及 其储存形式
  11. Python selenium web UI之Chrome 与 Chromedriver对应版本映射表及下载地址和配置(windows, Mac OS)...
  12. mysql创建约束时的约束名称,MySQL唯一键约束
  13. 小鱼的航程(改进版)(洛谷-P1424)
  14. idea swing 插件_【分享】我的idea配置
  15. ApacheCN 2019.4~7 总结
  16. js的基本类型有哪些?引用类型有哪些?(二)------null和undefined的区别
  17. 13 个设计 REST API 的最佳实践
  18. 王道c语言,王道训练营-C语言-一
  19. 怎么用8uftp上传网站,利用8Uftp上传自己的网页只需8步
  20. 一个朋友写的诗词收藏

热门文章

  1. CSS常用水平垂直居中的几种方法
  2. 判断某个数列是不是二元查找树的后序遍历。
  3. 错误,误解和攻击:分析广告拦截系统的众包过程
  4. ios 三种随机数生成
  5. CP2112使用USB转IIC通信教学示例
  6. 计算机二级小蒋在教务处负责学生成绩,小蒋是一位中学教师,在教务处负责初一年级学生的成绩管理。由于学校地处偏远地区,缺乏必要的教学_考题宝...
  7. 数据湖之Hudi基础:核心原理
  8. matplotlib eps格栅化,透明度被改变的问题 pdf->eps
  9. 金立M2017温情发布,成功的标配值得拥有
  10. 基于微信小程序的超市购物系统-计算机毕业设计