找回密码
 立即注册
查看: 599|回复: 0

[笔记] 做了个奇怪的工具(Unity)

[复制链接]
发表于 2020-11-29 10:51 | 显示全部楼层 |阅读模式
自古以来 Unity 的数组/列表默认编辑器就不太好用,一般情况下也无所谓就是了;但一旦涉及自定义编辑器,数组/列表的实现就极为繁琐。而且 Unity 还有一个令人拍案叫绝的设计:通过 Attribute 对数组/列表自定义 Drawer 时,你的 Drawer 会被理解为是针对每个元素的而不是针对整个数组/列表的……如果你尝试去自定义元素的 Drawer,你又会发现你没办法手动增删排序了……
总之我花了一天做了个奇怪的工具,让数组/列表编辑器更好用。看起来是这个样子的:
是的可以直接手动增删排序了。最最重要的是,兼容元素的自定义 Drawer。比如我自己的项目中用到的某个自定义配置数据,在这个框架下看起来是这样的:
这个工具的原理是,将数组/列表用 struct 包装,然后对这个 struct 自定义 Drawer。虽然听起来很 dirty,但我觉得还行……总之我已经把这个过程自动化了,可以用这样一个编辑器生成代码:
这样对一种元素类型会生成一个 cs 文件,包含对数组和列表两种包装。通过这些代码,几乎可以将这两个结构体当作它们所包装的数组和列表那样直接使用。
使用方法:通过 Package Manager 安装这个:90-games/UnityExtensionsCommon,然后通过菜单 Assets > Create > Unity Extensions > Wrapped Array Code... 打开代码生成窗口,填写你的类型等参数然后生成代码、保存文件。


其实,你要是嫌麻烦的话,就这样也行:
  1. [Serializable]
  2. public struct MyTypeArray : IWrappedArray
  3. {
  4.     public MyType[] data;
  5. }
  6. // Or
  7. [Serializable]
  8. public struct MyTypeList : IWrappedArray
  9. {
  10.     public List<MyType> data;
  11. }
复制代码

更新:已添加对多态的支持(与 Unity 新的 SerializeReference 标记配合使用):
对应的,想要支持多态,包装结构定义稍有不同:
  1. [Serializable]
  2. public struct MyTypeArray : IWrappedPolymorphicArray
  3. {
  4.     [SerializeReference]
  5.     public MyType[] data;
  6. }
  7. [Serializable]
  8. public struct MyTypeList : IWrappedPolymorphicArray
  9. {
  10.     [SerializeReference]
  11.     public List<MyType> data;
  12. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-23 00:08 , Processed in 0.112141 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表