unity 新输入系统(Input System)使用教程

学习Unity的新输入系统(Input System),确实是提升开发效率、应对多平台输入的好选择。这套系统比老旧的Input Manager更灵活,尤其适合需要同时支持键盘鼠标、手柄、甚至触屏的现代游戏项目。

下面为你整理一份从安装到实战的入门教程,希望能帮你快速上手。

  1. 切换输入模式:安装完成后,Unity会提示你重启编辑器。重启后,你需要告诉Unity使用哪套输入系统。进入 Edit -> Project Settings -> Player -> Active Input Handling

    • 如果你是新建项目,建议选择 Input System Package (New),完全拥抱新系统。

    • 如果你是现有项目,担心旧代码报错,可以暂时选择 Both,让新旧系统同时工作,平稳过渡。

⌨️ 第二步:两种基础用法

新输入系统提供了两种主要的使用方式,你可以根据项目需求选择。

方法一:快速直接地监听设备(适合原型或简单游戏)

这种方式最接近旧系统的习惯,直接在代码里查询设备状态,适合快速测试。

using UnityEngine;
using UnityEngine.InputSystem; // 别忘了引用命名空间

public class QuickInputExample : MonoBehaviour
{
    void Update()
    {
        // 检查键盘空格键是否在这一帧被按下
        if (Keyboard.current.spaceKey.wasPressedThisFrame)
        {
            Debug.Log("跳跃!");
        }

        // 获取鼠标的屏幕位置
        Vector2 mousePos = Mouse.current.position.ReadValue();
        
        // 检查手柄A键是否被按住
        if (Gamepad.current != null && Gamepad.current.aButton.isPressed)
        {
            Debug.Log("手柄A键按住中");
        }
    }
}

代码示例参考自Unity开发者社区教程

方法二:基于“输入动作”的正式用法(推荐,适合复杂项目)

这是新输入系统的核心玩法,需要创建配置文件。

  1. 创建配置文件:在Project窗口右键 -> Create -> Input Actions,命名为PlayerControls

  2. 可视化编辑:双击打开PlayerControls,你会看到一个强大的编辑器。

    • Action Maps:可以理解为动作集合。比如创建一个叫“Gameplay”的Map,专门放游戏中的操作。

    • Actions:你的抽象动作。在“Gameplay”Map下创建 Move(类型设为 Value,Control Type设为 Vector2)和 Jump(类型设为 Button)两个动作。

    • Bindings:为动作绑定物理按键。选中 Move,点击右下角“Add Binding”的小加号,选择“Add 2D Vector Composite”。然后就可以在展开的选项里,为Up、Down、Left、Right分别绑定W、S、A、D键。然后再添加一个Binding,路径选择 Gamepad/leftStick。这样一来,你的Move动作就同时支持键盘和手柄了。

    • 别忘了点击右上角的 Save Asset

  3. 生成C#代码:这是一个非常方便的功能。在PlayerControls资产的Inspector面板中,勾选 Generate C# Class,然后点击 Apply。Unity会自动生成一个强类型的C#类,让你的代码写起来更顺手。

  4. 编写逻辑代码

  5. using UnityEngine;
    using UnityEngine.InputSystem; // 基础命名空间
    
    public class PlayerMovement : MonoBehaviour
    {
        // 由Unity生成的类的实例
        private PlayerControls controls;
        private Vector2 moveInput;
        private bool isJumping;
    
        void OnEnable()
        {
            controls = new PlayerControls(); // 创建实例
            
            // 为Move动作的“执行”状态注册回调,当方向改变时触发
            controls.Gameplay.Move.performed += ctx => moveInput = ctx.ReadValue<Vector2>();
            // 为Move动作的“取消”状态注册回调,当松开按键时触发
            controls.Gameplay.Move.canceled += ctx => moveInput = Vector2.zero;
            
            // 为Jump动作的“开始”状态注册回调,按下瞬间触发
            controls.Gameplay.Jump.started += OnJump;
            
            controls.Enable(); // 启用输入
        }
    
        void OnDisable()
        {
            // 一定要记得取消注册并禁用,防止内存泄漏和奇怪的bug
            controls.Gameplay.Move.performed -= ctx => moveInput = ctx.ReadValue<Vector2>();
            controls.Gameplay.Move.canceled -= ctx => moveInput = Vector2.zero;
            controls.Gameplay.Jump.started -= OnJump;
            controls.Disable();
        }
    
        void OnJump(InputAction.CallbackContext context)
        {
            Debug.Log("执行跳跃!");
            // 在这里添加你的跳跃逻辑
        }
    
        void Update()
        {
            // 在Update中使用从回调中读取到的值
            if (moveInput != Vector2.zero)
            {
                Debug.Log($"移动输入方向: {moveInput}");
                // 在这里应用移动逻辑 transform.Translate(moveInput * Time.deltaTime * speed);
            }
        }
    }

  6. 这段代码综合了搜索结果中的回调注册方式

  7. 🚀 第三步:进阶技巧与实用建议

  8. 当你熟悉了基础用法后,可以探索这些更强大的功能:

  9. 交互(Interactions):你可以直接在Input Action的编辑器中为动作添加交互行为,比如 Hold(长按)、Tap(点击)、MultiTap(双击或多击),而无需自己写计时器代码。

    • 例如,给“开枪”动作添加一个Hold交互,并设置Hold Time为0.5秒,就能轻松实现“蓄力射击”效果。

  10. 处理器(Processors):对输入值进行实时处理,比如反转轴、将输入值乘以一个系数、对摇杆输入进行曲线平滑等。

  11. 控制方案(Control Schemes):在同一个配置文件中定义不同的控制方案(如“键盘+鼠标”、“手柄”),并在运行时动态切换,完美适配PC和主机。

  12. 调试工具:新输入系统自带了一个强大的调试窗口(Window -> Analysis -> Input Debugger),可以实时查看所有接入的设备、当前的输入值以及触发的动作,是排查问题的利器。

✅ 总结

Unity的新输入系统虽然上手门槛比旧系统稍高,但其带来的灵活性、可维护性和跨平台能力,对于追求高品质体验的项目来说是值得投入的。从一个简单的Input Actions文件开始,逐步探索它的各种功能,相信你会体会到它的强大之处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值