Odin Inspector中如何通过InlineButton特性调用外部类方法?
问题场景
编写通用工具静态类:
public static class UtilityClass { public static void Select(Component obj) { UnityEditor.Selection.activeObject = obj.gameObject; } }
直接在字段上通过InlineButton特性传入UtilityClass.Select作为回调,尝试调用外部静态方法:
[InlineButton("UtilityClass.Select", "Select")] public Canvas canvas;
代码编写完成后触发报错:
Couldn't not match the given string 'UtilityClass.Select' to any action that can be performed in the context of the type 'Test'. The following kinds of actions are possible:
报错原因
Odin Inspector的动作匹配逻辑默认仅在**当前特性挂载的所属类(即上述报错中的Test类)**的成员范围内查找可执行回调,不会自动解析字符串中带类名前缀的外部静态方法路径,因此直接传入类名.方法名格式的字符串无法被识别匹配。
可行解决方案
不存在无法调用外部类方法的限制,可通过以下两种方式实现需求:
方案1:类内中转方法(零扩展成本,推荐日常使用)
在挂载InlineButton特性的类内部新增一个私有方法作为回调中转,内部调用外部工具类的静态逻辑即可,示例代码:public class Test : MonoBehaviour { [InlineButton("TriggerSelect", "Select")] public Canvas canvas; private void TriggerSelect() { UtilityClass.Select(canvas); } }该方案兼容所有Odin版本,无需编写任何编辑器扩展代码,适配绝大多数开发场景。
方案2:自定义Odin动作解析规则(适合批量通用场景)
如果项目中有大量跨类调用静态工具方法的需求,可以自行扩展Odin的ActionResolver解析逻辑,新增对类名.方法名格式字符串的识别支持,通过反射查找对应程序集中的外部静态类与匹配方法完成回调绑定。该方案需要编写一定量的编辑器扩展代码,仅在高频使用场景下推荐实现。
内容的提问来源于stack exchange,提问作者na_sacc

