Unity-Input System新输入系统插件学习

文章介绍了Unity中的InputSystem组件,如何配置ActionMaps、Actions(包括ActionType和ControlType),处理键盘、鼠标和手柄输入,以及实现多设备支持,包括手柄震动和按键重新绑定功能。

1.键盘、鼠标操作

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class NewInputSystem : MonoBehaviour
{
    public float SpaceKeyValue;
    public float RightMouseValue;
    public Image Icon;
    public Vector2 MousePos;
    public Vector2 MouseScroll;

    void Update()
    {
        if(Keyboard.current != null)        //判断是否有键盘外设接入
        {
            if(Keyboard.current.spaceKey.wasPressedThisFrame)       //判断是否按下
            {
                Debug.Log("Space Pressed - New");
            }
            else if(Keyboard.current.spaceKey.wasReleasedThisFrame) //判断是否抬起
            {
                Debug.Log("Space Released - New");
            }
            //值为0表示没有按住,值为1表示正在按住
            SpaceKeyValue = Keyboard.current.spaceKey.ReadValue();
            if(SpaceKeyValue > 0)
                Debug.Log("Space");
        }

        if(Mouse.current != null)       //判断是否有鼠标外设接入
        {
            if(Mouse.current.rightButton.wasPressedThisFrame)       //判断鼠标邮件是否按下
                Debug.Log("RightMouse Released - New");

            //值为0表示没有按住,值为1表示正在按住
            RightMouseValue = Mouse.current.rightButton.ReadValue();

            //鼠标右键按住
            if(Mouse.current.rightButton.ReadValue() == 1)
                Debug.Log("RightMouse");

            //获取鼠标位置
            Icon.rectTransform.anchoredPosition = Mouse.current.position.ReadValue();
            MousePos = Mouse.current.position.ReadValue();
            //获取鼠标滚轮值
            MouseScroll = Mouse.current.scroll.ReadValue();
        }

        //手柄
        if(Gamepad.current != null)
        {

        }
    }
}

2.Input Action

Action Maps---动作表(一般分为两个表1.GamePlay-游戏时用的表,2.UI)

Action—动作   

配置:

(1)Action Maps(方案):点击右侧加号新建一个方案,输入方案名称,然后选中该方案在Action与Action Properties设置该方案具体内容。

(2)Action(输入行为):点击“+”添加一个action,选中添加的action在右侧Action Properties内配置Action Type(value—通过值判断,提供一种连续状态变化事件,如果设置了多个输入,就会切换到最主要的一个。用它进行模拟控制,比如移动;Button—通过按钮,默认设置,包括按钮或者按键触发的一次性动作;Pass Through—和Value很相似,但它不会像Value一样(如果有多个输入时,不会只选择最主要的那个,而把其他的输入忽略,适用于一台机器有多人进行游戏)。在使用Value或者Pass Through Types时,你会看到一个额外的选项 Control Type为该Value的返回值类型)。

(3)然后点击添加的Action右侧的“+”,有下列4项选择:

Add Binding:添加普通绑定

Unity 中使用 Input System 插件实现鼠标事件冒泡功能,需要结合 Input System 的事件分发机制与 UI 交互逻辑。以下是一个详细的解析和实现方式: ### 鼠标事件冒泡的实现 #### 1. Input System 插件的基础 Input System 插件提供了一种灵活的方式来捕获输入事件,包括鼠标事件。通过定义自定义的 `InputAction`,可以捕获鼠标的点击、移动等操作[^1]。 #### 2. 鼠标事件冒泡的核心逻辑 鼠标事件冒泡是指当鼠标事件发生在某个 UI 元素上时,如果该元素没有处理该事件,则事件会逐级向其父级传播,直到被处理或到达根节点。这种行为可以通过递归检查 UI 层次结构来实现。 #### 3. 实现步骤 以下是基于 Input System 插件的鼠标事件冒泡实现代码示例: ```csharp using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class MouseBubbleEvent : MonoBehaviour, IPointerClickHandler { private void Start() { // 初始化 Input System 监听 var inputAction = new InputAction("Mouse Click", binding: "<Mouse>/leftButton"); inputAction.performed += OnMouseClick; inputAction.Enable(); } private void OnMouseClick(InputAction.CallbackContext context) { if (context.performed) { ProcessMouseClick(); } } private void ProcessMouseClick() { // 获取当前鼠标位置下的 UI 元素 PointerEventData eventData = new PointerEventData(EventSystem.current); eventData.position = Input.mousePosition; List<RaycastResult> results = new List<RaycastResult>(); EventSystem.current.RaycastAll(eventData, results); // 遍历从最顶层到底层的所有 UI 元素 foreach (var result in results) { GameObject hitObject = result.gameObject; // 检查是否实现了 IPointerClickHandler 接口 if (hitObject.TryGetComponent(out IPointerClickHandler handler)) { handler.OnPointerClick(eventData); return; // 如果处理了事件,则停止冒泡 } } // 如果没有处理,则继续冒泡到父级 foreach (var result in results) { GameObject hitObject = result.gameObject; // 递归检查父级对象 if (ProcessParent(hitObject.transform.parent, eventData)) { return; // 如果父级处理了事件,则停止冒泡 } } } private bool ProcessParent(Transform parent, PointerEventData eventData) { if (parent == null) return false; if (parent.gameObject.TryGetComponent(out IPointerClickHandler handler)) { handler.OnPointerClick(eventData); return true; // 父级处理了事件 } // 继续向上查找父级 return ProcessParent(parent.parent, eventData); } } ``` #### 4. 代码解析 - **InputAction**:定义了一个名为 "Mouse Click" 的输入动作,绑定到鼠标左键。 - **PointerEventData**:用于存储鼠标事件的相关数据,例如鼠标位置。 - **RaycastAll**:对当前鼠标位置进行射线检测,获取所有可能的 UI 元素。 - **IPointerClickHandler**:UI 元素需要实现此接口以响应鼠标点击事件。 - **递归检查父级**:如果当前 UI 元素未处理事件,则递归检查其父级,直到找到处理者或到达根节点。 #### 5. 注意事项 - 确保项目中已启用 Input System 插件,并正确配置 `Player Input` 组件。 - 使用 `EventSystem.current` 来确保射线检测能够正常工作。 - 如果 UI 元素较多,射线检测可能会带来性能开销,需优化检测逻辑[^2]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值