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

Unity新输入系统:如何无需为每个法术创建独立动作检测按键

新输入系统下多法术共享输入处理的解决思路

方案一:利用输入动作的参数传递(推荐,符合新输入系统设计)

这个方法是创建一个通用输入动作,给每个按键绑定设置不同的参数值,通过参数区分要触发的法术。

  1. 配置输入动作资源

    • 打开Input Action Asset,创建一个SpellCast动作,类型选择Value > Integer。
    • 给这个动作添加6个绑定,分别对应触发法术的按键(比如Alpha1到Alpha6)。
    • 对每个绑定,在右侧属性面板的Override > Value里设置对应索引值(比如Alpha1设为0,Alpha2设为1,对应法术数组的下标)。
  2. 编写通用处理代码
    只需要一个脚本就能处理所有法术的输入:

using UnityEngine;
using UnityEngine.InputSystem;

public class SpellInputHandler : MonoBehaviour
{
    [SerializeField] private PlayerInput playerInput;
    [SerializeField] private Spell[] spells; // 把你的六个法术拖到这里

    private InputAction _spellCastAction;

    private void Awake()
    {
        // 替换成你实际的Action Map名称和动作名称
        _spellCastAction = playerInput.actions["SpellCast"];
    }

    private void OnEnable()
    {
        _spellCastAction.performed += OnSpellCast;
    }

    private void OnDisable()
    {
        _spellCastAction.performed -= OnSpellCast;
    }

    private void OnSpellCast(InputAction.CallbackContext context)
    {
        int spellIndex = context.ReadValue<int>();
        // 检查索引合法性,避免越界
        if (spellIndex >= 0 && spellIndex < spells.Length)
        {
            spells[spellIndex].Cast(); // 调用对应法术的释放逻辑
        }
    }
}

方案二:代码动态创建绑定(适合不想用Input Action Asset的场景)

如果习惯直接在代码里绑定按键,可以循环创建输入动作,利用闭包捕获法术索引,绑定同一个回调方法。

using UnityEngine;
using UnityEngine.InputSystem;

public class SpellInputHandler : MonoBehaviour
{
    [SerializeField] private Spell[] spells;
    // 这里可以直接指定每个法术对应的按键
    [SerializeField] private KeyCode[] spellTriggerKeys = new KeyCode[] 
    {
        KeyCode.Alpha1, KeyCode.Alpha2, KeyCode.Alpha3,
        KeyCode.Alpha4, KeyCode.Alpha5, KeyCode.Alpha6
    };

    private InputAction[] _spellActions;

    private void Awake()
    {
        _spellActions = new InputAction[spells.Length];
        for (int i = 0; i < spells.Length; i++)
        {
            // 必须用局部变量捕获当前索引,否则闭包会拿到循环结束后的i值
            int currentSpellIndex = i;
            _spellActions[i] = new InputAction(type: InputActionType.Button);
            // 把KeyCode转成输入系统的绑定路径
            _spellActions[i].AddBinding($"<Keyboard>/{spellTriggerKeys[i].ToString().ToLower()}");
            // 绑定回调,触发对应法术
            _spellActions[i].performed += ctx => spells[currentSpellIndex].Cast();
        }
    }

    private void OnEnable()
    {
        foreach (var action in _spellActions)
        {
            action.Enable();
        }
    }

    private void OnDisable()
    {
        foreach (var action in _spellActions)
        {
            action.Disable();
        }
    }
}

核心思路

不管哪种方案,本质都是复用同一个回调逻辑,通过参数或索引区分要触发的法术,完全不需要为每个法术创建独立的类或输入动作。既符合新输入系统的设计理念,又能保持代码简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:05:27