如何用键盘控制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按钮的点击事件,无需编写代码:
- 选中你的选项按钮(A-E),依次添加组件:
Mixed Reality Toolkit -> UI -> Physical Press Event Router。 - 在组件的
Physical Key To Press下拉框中,分别为A-E按钮选择Alpha1、Alpha2、Alpha3、Alpha4、Alpha5(对应键盘1-5键)。 - 因为你已经通过Interactable组件将按钮的OnClick绑定到了QuizUI的OnClick方法,当按下对应键盘按键时,PhysicalPressEventRouter会自动触发按钮的点击事件,直接调用QuizUI的OnClick方法。
这种方式符合MRTK的交互框架,代码更简洁,无需手动处理键盘输入逻辑。
内容的提问来源于stack exchange,提问作者PolarBear22
相关产品推荐
相关产品推荐

