前言
经常会希望在Unity编辑器中有这样一种功能的实现,可以直接引用(序列化)一个实现了指定接口的组件。
面向接口可以大大降低代码的耦合,实现依赖反转,同时更加灵活,后续的修改与扩展都更加方便。
但官方就是不做,可以从这个帖子中看到官方的态度。
所以下面就列举一下自己实现这个功能的各种方法。
问题描述
假使有这样一个接口
然后有若干MonoBehaviour
目的是在编辑器中将一CanGetBoolMono
或者CanGetBoolFalseMono
的实例拖拽到TestMono
的canGetBool
属性上去。
OnValidate判断
思路是用一个通用的比如Component属性来接收,然后在OnValidate中判断是否是对应的接口,不是就重置为null。然后在使用的时候要手动转换一次。
这种简单快捷,但缺点是要为每个类似需求的MonoBehaviour都写对应的OnValidate,还是不方便。
构造容器
也是大同小异,区别在于利用泛型生成一个新的类,用新的类型作为容器来存储真正的对象。也是可以放入任意类型,在PropertyDrawer中验证类型是否符合。
摘自
这种省去了在目标MonoBehaviour中写模板代码,可以为每个接口实现一个容器类,也可以在使用时直接声明TypedContainer<ICanGetBool>
。
SerializableInterface
最后介绍一个项目Unity3D-SerializableInterface
不仅实现了第二种的容器类的方式,还支持从资源文件,场景组件,甚至仅引用一个接口,一共三种方式来序列化接口。
而且提供了untiyPackage的安装方式。强烈推荐。