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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:33:17