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

Unity新输入系统如何实现旧系统GetButton的持续触发功能?

嘿,刚好对新输入系统的这个点挺熟的,给你分享两种能完美复刻旧系统Update+GetButton持续触发逻辑的方法,看你习惯哪种:

方法1:事件驱动式(新输入系统官方推荐)

这种方式不用死盯Update,靠输入动作的状态回调来标记触发状态,更贴合新系统的设计思路:

  1. 先在你的.inputactions输入资产里创建一个动作(比如叫HoldAction),绑定到你需要的按键/按钮上
  2. 在脚本里通过状态标记来控制Update里的持续操作,代码示例:
using UnityEngine;
using UnityEngine.InputSystem;

public class HoldActionExample : MonoBehaviour
{
    // 在Inspector面板拖入你创建的InputAction
    public InputAction holdAction;
    private bool isHolding;

    private void OnEnable()
    {
        // 按键按下时标记为触发中
        holdAction.started += ctx => isHolding = true;
        // 按键抬起时取消标记
        holdAction.canceled += ctx => isHolding = false;
        
        // 启用这个输入动作
        holdAction.Enable();
    }

    private void OnDisable()
    {
        // 一定要解绑事件+禁用动作,避免内存泄漏
        holdAction.started -= ctx => isHolding = true;
        holdAction.canceled -= ctx => isHolding = false;
        
        holdAction.Disable();
    }

    private void Update()
    {
        if (isHolding)
        {
            // 这里写你需要持续执行的操作
            Debug.Log("按钮按住中,持续触发逻辑");
        }
    }
}

方法2:类旧系统的Update轮询法(最直观的复刻)

如果你习惯了旧系统的写法,新输入系统也支持直接在Update里读取按钮的持续状态,和GetButton几乎一模一样:

方式A:直接用InputAction实例

using UnityEngine;
using UnityEngine.InputSystem;

public class HoldActionExample : MonoBehaviour
{
    public InputAction holdAction;

    private void OnEnable()
    {
        holdAction.Enable();
    }

    private void OnDisable()
    {
        holdAction.Disable();
    }

    private void Update()
    {
        // 这句完全等价于旧系统的GetButton("xxx")
        if (holdAction.ReadValueAsButton())
        {
            // 按住期间持续执行的操作
            Debug.Log("持续触发中");
        }
    }
}

方式B:用生成的输入类(更简洁)

如果你在输入资产的设置里勾选了「Generate C# Class」,可以直接用自动生成的静态类来访问输入,代码更清爽:

using UnityEngine;

public class HoldActionExample : MonoBehaviour
{
    private PlayerInputActions inputActions; // 这里的PlayerInputActions是你生成的类名

    private void OnEnable()
    {
        inputActions ??= new PlayerInputActions();
        inputActions.Default.Enable(); // Default是你的动作映射名称
    }

    private void OnDisable()
    {
        inputActions?.Default.Disable();
    }

    private void Update()
    {
        // 直接访问生成类里的动作,检查是否按住
        if (inputActions.Default.HoldAction.ReadValueAsButton())
        {
            // 持续执行操作
            Debug.Log("按钮按住中");
        }
    }
}

小提醒

  • 不管用哪种方法,都要记得在OnEnable/OnDisable里启用/禁用输入动作,不然会出现输入无响应或者内存泄漏的问题
  • 事件驱动的方式在复杂输入场景(比如多设备切换、自定义绑定)下更高效,推荐优先使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:02:34