为何Unity自定义编辑器脚本监听按键无法触发MonoBehaviour方法?
核心问题排查
- 你添加
EventSystem组件的操作完全偏离方向:EventSystem是运行时UGUI、交互系统的事件管理组件,和Editor下OnSceneGUI的输入监听没有任何关联,对当前问题没有任何帮助。 - 最关键的触发条件未满足:
OnSceneGUI只有在Scene视图处于激活(获得焦点)状态时才会接收输入事件。如果在Game视图、或Hierarchy/Inspector面板处于激活状态下按A键,事件根本不会进入OnSceneGUI的逻辑,连"A pressed"的日志都不会输出。 - 基础环境排查:确认你的Editor脚本确实放在Unity识别的
Editor特殊文件夹下(不是普通命名为"Editor"的非特殊文件夹),否则Editor脚本不会被编译,自定义扩展功能完全不生效。 - 可选冲突排查:如果满足前面的条件仍无反应,可以先换个不常用的按键(比如
KeyCode.B)测试,排除Unity全局快捷键、第三方插件占用A键的情况。
正确验证流程
- 点击Scene视图让其边框高亮,处于激活状态
- 选中挂载了
Switcher脚本的物体,激活对应的自定义Editor - 此时按下对应测试按键即可触发逻辑
优化后参考代码
// 修正原类名拼写错误(原SiwtcherEditor不影响功能但易造成维护混淆) [CustomEditor(typeof(Switcher))] public class SwitcherEditor : Editor { void OnSceneGUI() { // 提前过滤非按键按下事件,减少冗余逻辑 if (Event.current.type != EventType.KeyDown) return; Switcher script = (Switcher)target; if (Event.current.keyCode == KeyCode.A) { Debug.Log("A pressed"); // 非播放模式下修改对象属性需补充Undo逻辑,否则修改无法保存、无法撤回 if (!Application.isPlaying) { Undo.RecordObject(script, "Switch Here"); } script.SwitchHere(); Event.current.Use(); } } }
注意:如果在非播放模式下调用
SwitchHere修改了挂载对象的属性,必须补充Undo.RecordObject逻辑并标记对象为脏状态,否则修改不会被保存。
内容的提问来源于stack exchange,提问作者Pifo
相关产品推荐
相关产品推荐

