Unity节奏游戏移动按键检测异常问题求助
问题:节奏游戏中按键检测失效,始终显示无按键按下
我正在制作一款节奏游戏,玩家需要用背部格挡来袭的攻击。为此我为每个格挡方向制作了防御动画,思路是按下对应移动键时激活对应的Sprite Renderer,同时关闭idle状态。但不知为何,以下代码始终显示没有按键被按下:
public void positionDefault() { if (keyIsBeingPressed == false) { // Show the default sprite if no movement key is being pressed abbyDefaultPosition.GetComponent<SpriteRenderer>().enabled = true; UnityEngine.Debug.Log("no key is being pressed!"); } else { // Hide the default sprite if any movement key is being pressed abbyDefaultPosition.GetComponent<SpriteRenderer>().enabled = false; UnityEngine.Debug.Log("a key is being pressed!"); } }
布尔值keyIsBeingPressed的定义如下:
keyIsBeingPressed = (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.RightArrow));
我尝试过将逻辑或改为单竖线|,也尝试过用!=语句来定义该布尔值。
解决方案
1. 确保按键状态每帧更新
最大的问题大概率是keyIsBeingPressed只被赋值了一次(比如在Start()方法中),没有每帧刷新。Input.GetKey是实时检测当前帧的按键状态,必须在Update()方法里每帧重新计算这个变量:
private bool keyIsBeingPressed; void Update() { // 每帧更新按键检测状态 keyIsBeingPressed = Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.RightArrow); // 调用方法更新Sprite显示 positionDefault(); } public void positionDefault() { bool showDefault = !keyIsBeingPressed; abbyDefaultPosition.GetComponent<SpriteRenderer>().enabled = showDefault; Debug.Log(showDefault ? "no key is being pressed!" : "a key is being pressed!"); }
2. 缓存SpriteRenderer引用提升性能
避免每次调用GetComponent<SpriteRenderer>()带来的性能损耗,提前在Start()里缓存组件引用:
private SpriteRenderer defaultSpriteRenderer; private bool keyIsBeingPressed; void Start() { // 提前获取组件引用 defaultSpriteRenderer = abbyDefaultPosition.GetComponent<SpriteRenderer>(); } void Update() { keyIsBeingPressed = Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.RightArrow); positionDefault(); } public void positionDefault() { bool showDefault = !keyIsBeingPressed; defaultSpriteRenderer.enabled = showDefault; Debug.Log(showDefault ? "no key is being pressed!" : "a key is being pressed!"); }
3. 排查输入设置问题
打开Unity编辑器的Edit > Project Settings > Input Manager,检查Horizontal/Vertical轴的绑定是否包含方向键;也可以在Update()里单独打印每个方向键的状态,测试输入是否正常:
void Update() { // 单独测试每个按键的输入状态 Debug.Log($"Up: {Input.GetKey(KeyCode.UpArrow)}, Down: {Input.GetKey(KeyCode.DownArrow)}, Left: {Input.GetKey(KeyCode.LeftArrow)}, Right: {Input.GetKey(KeyCode.RightArrow)}"); }
内容的提问来源于stack exchange,提问作者ROBERT BOL
相关产品推荐
相关产品推荐

