You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.30 16:45:05