BindingMenu - KumoKyaku/Megumin.AI.Samples GitHub Wiki
绑定菜单
- 静态成员使用[S]标记。
- 菜单中不含有方法,只包含字段和属性。
- 菜单中根据TypeAdpter自动匹配可绑定成员。
- 可以手动填写绑定字符串,绑定无参方法。
- Set绑定时可以绑定一个参数且类型匹配的方法,不考虑返回值。
- 可以使用静态方法扩展TypeAdpter中的适配器。
绑定按钮左键点击和右键点击弹出不同菜单。
- 左键菜单
当前序列化对象是一个GameObject,或者选中一个GameObject时。根据GameObject所含有的组件提供绑定菜单。
- 右键菜单
提供所有静态类型成员,所有组件类型,所有接口类型的可绑定成员菜单。
关于绑定菜单功能的讨论
叶月葵 2023/4/22 21:33:00
这个绑定哪里怪怪的感觉,按理说不是应该反射所在对象的组件里面的public吗
云却 2023/4/22 21:33:32
因为功能比较强,即使不是public的也能绑定上去。
都是反射,是不是public没影响。
开销也没区别。但是确实有点反直觉。
叶月葵 2023/4/22 21:34:29
主要是,比如我想要绑定这个NavMeshAgent.BaseOffset
那么理论上我点出来的列表里面应该按compoent展开才对
叶月葵 2023/4/22 21:34:42
那我应该是在NavMeshAgent下面找到BaseOffset
云却 2023/4/22 21:35:53
你是说选择菜单只提供game object上已经有的组件吗?
叶月葵 2023/4/22 21:36:01
嗯
叶月葵 2023/4/22 21:36:27
毕竟不挂上去的组件本质上表示没有需要
云却 2023/4/22 21:36:32
确实应该这样。其他插件都是如此。
叶月葵 2023/4/22 21:36:48
有需要的在C#的语境下默认应该是全局静态类
叶月葵 2023/4/22 21:37:16
所以理论上应该反射组件的变量和静态类的
云却 2023/4/22 21:37:35
我的考虑是组件是可以动态添加的。可能行为树存在时,game object上的组件还没有添加。如果不让选就会有限制
叶月葵 2023/4/22 21:38:00
感觉考虑得这部分过于复杂了
叶月葵 2023/4/22 21:38:27
会用这个编辑器的用户主体不应该是擅长这么复杂调度的程序,而是一般程序甚至不懂程序的策划
叶月葵 2023/4/22 21:39:06
他们打开编辑器必然是为了编辑好一个prefab放着就能用
当你需要服务动态组件添加的时候我认为相对好的方案是你留下了能让动态注册绑定的接口才是
云却 2023/4/22 21:40:19
另外,行为树是独立于game object。绑定时访问不到game object实例,所以就不知道game object上有哪些组件,这个是最重要原因。也就是说,允许绑定或者手动填写一个任意字符串,然后运行时尝试解析,如果恰好能解析成功就会成功,如果没有组件或者绑定路径不合法,就会触发设置的默认行为,返回默认值或者fallback值
云却 2023/4/22 21:40:50
嗯,我考虑看看能不能改一下。难度很大
叶月葵 2023/4/22 21:41:08
所以我现在也理解其他行为树插件也好Bolt也好他们的Blackboard都是独立一个compent而不是放在行为树上的
叶月葵 2023/4/22 21:41:29
以及其他行为树插件的自定义类型甚至要求泛型指定Agent依赖
云却 2023/4/22 21:44:28
这个也是我要自己写一个行为树的主要原因。 其他行为树插件 绑定时都只能设定已有的组件,还不允许用户手动编写绑定路径,所有我才写的这个。架构设计之初就是为了 能绑定一个game object不存在的组件。
需求时,以后如果支持mod,要包AI部分开源出去,又不想开源核心代码,这样mod中是不能访问核心代码的,所以绑定只能手动拼字符串。
云却 2023/4/22 21:44:39
我看看能不能做两种模式,两个方式都支持