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

如何用键盘控制Unity UI按钮?解决非静态方法调用报错

解决Unity测验应用键盘绑定与非静态方法调用问题

一、修复"非静态字段、方法或属性需要对象引用"错误

你当前的错误核心是:直接通过QuizUI.OnClick(A)调用非静态方法,非静态方法必须通过类的实例对象调用,同时你的A变量未赋值。以下是两种修复方案:

方案1:修改Key脚本,使用实例调用

using UnityEngine;
using Microsoft.MixedReality.Toolkit.UI;

public class Key : MonoBehaviour
{
    // 在Inspector面板拖拽赋值对应的QuizUI组件和选项按钮
    [SerializeField] private QuizUI quizUI;
    [SerializeField] private GameObject optionA;
    [SerializeField] private GameObject optionB;
    [SerializeField] private GameObject optionC;
    [SerializeField] private GameObject optionD;
    [SerializeField] private GameObject optionE;

    private void Update()
    {      
        // 使用KeyCode比字符串更可靠,加空值检查避免空引用报错
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            quizUI?.OnClick(optionA);
        }
        else if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            quizUI?.OnClick(optionB);
        }
        else if (Input.GetKeyDown(KeyCode.Alpha3))
        {
            quizUI?.OnClick(optionC);
        }
        else if (Input.GetKeyDown(KeyCode.Alpha4))
        {
            quizUI?.OnClick(optionD);
        }
        else if (Input.GetKeyDown(KeyCode.Alpha5))
        {
            quizUI?.OnClick(optionE);
        }
    }
}

方案2:直接在QuizUI中处理键盘输入(更简洁)

不需要额外的Key脚本,直接在QuizUI中添加Update方法处理键盘事件:

// 在QuizUI类中添加以下方法
private void Update()
{
    // 仅在未答题时响应键盘输入
    if (!answered)
    {
        // 利用已有的options列表,无需单独赋值按钮
        if (Input.GetKeyDown(KeyCode.Alpha1) && options.Count > 0)
        {
            OnClick(options[0]);
        }
        else if (Input.GetKeyDown(KeyCode.Alpha2) && options.Count > 1)
        {
            OnClick(options[1]);
        }
        else if (Input.GetKeyDown(KeyCode.Alpha3) && options.Count > 2)
        {
            OnClick(options[2]);
        }
        else if (Input.GetKeyDown(KeyCode.Alpha4) && options.Count > 3)
        {
            OnClick(options[3]);
        }
        else if (Input.GetKeyDown(KeyCode.Alpha5) && options.Count > 4)
        {
            OnClick(options[4]);
        }
    }
}

二、使用PhysicalPressEventRouter替代自定义键盘检测

PhysicalPressEventRouter是MRTK提供的组件,可直接将键盘/手柄按键映射到UI按钮的点击事件,无需编写代码:

  1. 选中你的选项按钮(A-E),依次添加组件:Mixed Reality Toolkit -> UI -> Physical Press Event Router。
  2. 在组件的Physical Key To Press下拉框中,分别为A-E按钮选择Alpha1、Alpha2、Alpha3、Alpha4、Alpha5(对应键盘1-5键)。
  3. 因为你已经通过Interactable组件将按钮的OnClick绑定到了QuizUI的OnClick方法,当按下对应键盘按键时,PhysicalPressEventRouter会自动触发按钮的点击事件,直接调用QuizUI的OnClick方法。

这种方式符合MRTK的交互框架,代码更简洁,无需手动处理键盘输入逻辑。


内容的提问来源于stack exchange,提问作者PolarBear22

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:37:31