论Unity_InputSystem如何使用(一)

一、导入

在Window——PackageManage中搜索InputSystem,下载导入。如果搜不到,则调整为UnityRegistry。

二、更改输入模式

Edit——ProjectSettings——Player——OtherSettings——Configuration——Active Input Handling,选择旧版或者新版,也可以选择兼容。
三、使用
请使用InputSystem为一个3D对象制作通过键盘移动跳跃,鼠标攻击的脚本。

我们先采取直接使用InputAction的方式来编写脚本,而InputAction则是这个系统的核心。
是InputSystem为我们封装的一个类,作用是不必通过编写代码来获取设备的信号输入,而是直接在Inspector窗口编辑,方便我们专注于编写按键触发后的逻辑。
使用前需要引用using UnityEngine.InputSystem。

	[Header("移动")]
    public InputAction Move;
    [Header("攻击")]
    public InputAction Attack;
    [Header("跳跃")]
    public InputAction Jump;

然后我们直接在Inspector窗口编辑在这里插入图片描述

首先点击齿轮符号

在这里插入图片描述

Action——输入动作设置,设置检测哪些设备输入。

在这里插入图片描述

Action Type——动作类型:

  • Value——值类型,主要用于状态连续更改的输入设备,如鼠标移动,手柄遥感。若有多个设备绑定此Action,只会发送最受控制的输入。

  • Button——按钮类型,处理按下类型。

  • PassThrough——直通类型,与Value一样,但如果有多个设备绑定,会发送所有设备的输入。

在这里插入图片描述

  • Control  Type——控制类型: 在这里选择你想要的设备按键返回值的类型,之后在选择对应设备按键时会根据你选择的内容进行筛选。

Interaction——相互作用设置,对特殊输入进行处理,如长按,多次点击等,满足条件时才会触发(设置长按时间,点击次数等)。

在这里插入图片描述

Hold

在这里插入图片描述

  • Press Point:在Input System中,每个按键都有对应的浮点值,例如普通的按键,将会在0(未按下)和1(按下)之间,当大于等于这个值时则认为按键按下。
  • Hold Time 当按钮按下会触发started,若在松开按钮前,按住时间大于等于Hold Time则会触发performed,否则触发canceled。

MultiTap

在这里插入图片描述

多次点击,例如双击或者三连击。

  • Tap Count为点击次数。
  • Max Tap Spacing为每次点击之间的间隔(默认值为 2 * Max Tap Duration)。
  • Max Tap Duration为每次点击的持续时间,即按下和松开按键的这段时间。 当每次点击时间小于Max Tap
    Duration,且点击间隔时间小于Max Tap Spacing,点击Tap Count次,触发performed。

Press

在这里插入图片描述

  • Press Only:按下的时候触发started和performed。不触发canceled
  • Release Only: 按下的时候触发started,松开的时候触发performed
  • Press And Release: 按下的时候触发started和performed,松开的时候会再次触发started和performed。不触发canceled

SlowTap

在这里插入图片描述

  • 在按键按住时间大于等于Max Tap Duriation时,松开按键触发performed

Tap

在这里插入图片描述

  • 当按键按下会触发started,若在Max Tap Duriation时间内(小于)松开按钮,触发performed,否则触发canceled。

Processors——处理器,对得到的值进行处理(有点长可以不看)

Clamp
将输入值钳制到[min…max]范围。
Invert
反转控件中的值(即,将值乘以-1)。
Invert Vector 2
反转控件中的值(即,将值乘以-1)。如果invertX为真,则反转矢量的x轴;如果invertY为真,则反转矢量的y轴。
Invert Vector 3
反转控件中的值(即,将值乘以-1)。如果反转x为真,则反转矢量的x轴;如果反转y为真,则反转y轴;如果反转z为真,则反转z轴。
Normalize
如果最小值>=零,则将[min…max]范围内的输入值规格化为无符号规格化形式[0…1],如果最小值<零,则将输入值规格化为有符号规格化形式[-1…1]。
Normalize Vector 2
将输入向量规格化为单位长度(1)。
Normalize Vector 3
将输入向量规格化为单位长度(1)
Scale
将所有输入值乘以系数。
Scale Vector 2
将所有输入值沿x轴乘以x,沿y轴乘以y。
Scale Vector 3
将所有输入值沿x轴乘以x,沿y轴乘以y,沿z轴乘以z。
Axis Deadzone
axis死区处理器缩放控件的值,使绝对值小于最小值的任何值为0,绝对值大于最大值的任何值为1或-1。许多控件没有精确的静止点(也就是说,当控件位于中心时,它们并不总是精确报告0)。在死区处理器上使用最小值可避免此类控件的无意输入。此外,当轴一直移动时,某些控件不一致地报告其最大值。在死区处理器上使用最大值可确保在这种情况下始终获得最大值。
Stick Deadzone
摇杆死区处理器缩放Vector2控件(如摇杆)的值,以便任何幅值小于最小值的输入向量都将得到(0,0),而任何幅值大于最大值的输入向量都将规格化为长度1。许多控件没有精确的静止点(也就是说,当控件位于中心时,它们并不总是精确地报告0,0)。在死区处理器上使用最小值可避免此类控件的无意输入。此外,当轴一直移动时,某些控件不一致地报告其最大值。在死区处理器上使用最大值可确保在这种情况下始终获得最大值。

点击+号

在这里插入图片描述

  1. 添加单个按钮绑定
  2. 添加1D轴组合,就是1到-1。
  3. 2D轴
  4. 3D轴
  5. 添加双组合键,如Ctrl+Z
  6. 添加三组合键,如Shift+Win+S;

添加之后双击它们
在这里插入图片描述

1D Axis

在这里插入图片描述

  • 负和正值

在这里插入图片描述

Composite Type

在这里插入图片描述

  1. Min Value和Max Value则是正负值的界限。
  2. Which Side Win则是当代表正负的键同时按下时哪一方获胜

在这里插入图片描述

2D Vector

在这里插入图片描述

  • 上(0,1)下(0,-1)左(-1,0)右(1,0)

在这里插入图片描述

  1. Mode 处理模式
  2. Analog——模拟值,浮点值
  3. DIgital Normalized——单位化向量
  4. Digital——向量

3D Vector

  • 与2D相同

One Modifier

在这里插入图片描述

  • 如Ctrl+V,Modifier代表Ctrl,Button代表V。
  • Two Modifier

在这里插入图片描述

  • 如Shift+Win+S,Modifier1代表Ctrl,Modifier2代表Win,S代表Button

三、InputAction的一些使用代码

首先我们需要启用输入检测
然后其拥有三种事件——开始,触发,结束
这些拥有一个参数,通过这个参数我们可以获得相关信息
void Start()
    {
        //启用
        Move.Enable();
        //开始事件调用
        Move.started += (con) =>
        {
            print("start");
        };
        //触发事件调用
        Move.performed += (con) =>
        {
            //当前状态
            //没有启用是 Disabled
            //等待是 Waiting
            //开始是 Started
            //触发是 Performed
            //结束是 Canceled
            print(con.phase);
            //action名字
            print(con.action.name);
            //控件路径
            print(con.control.path);
            //控件信息
            print(con.control.name);
            //返回的值
            print(con.ReadValue<Vector2>());
            //持续时间
            print(con.duration);
            //事件开始时间
            print(con.startTime);
        };
        //结束事件时间
        Move.canceled += Move_canceled;
    }

    private void Move_canceled(InputAction.CallbackContext obj)
    {
        print("canceled");
    }
  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中,可以通过重写派生自UnityEngine.Windows.WindowsWindow类的自定义窗口脚本的WndProc方法来处理Windows消息。通过重写WndProc方法,您可以获取和处理各种Windows消息,包括WM_INPUT消息。 下面是一个示例代码,展示了如何在Unity中处理WM_INPUT消息: ```csharp using UnityEngine; using System; using System.Runtime.InteropServices; public class RawInputExample : MonoBehaviour { const int WM_INPUT = 0x00FF; protected override void WndProc(ref Message message) { if (message.Msg == WM_INPUT) { IntPtr hRawInput = message.LParam; uint dataSize = 0; // 获取原始输入数据的大小 GetRawInputData(hRawInput, RID_INPUT, IntPtr.Zero, ref dataSize, (uint)Marshal.SizeOf(typeof(RAWINPUTHEADER))); if (dataSize > 0) { IntPtr data = Marshal.AllocHGlobal((int)dataSize); // 获取原始输入数据 if (GetRawInputData(hRawInput, RID_INPUT, data, ref dataSize, (uint)Marshal.SizeOf(typeof(RAWINPUTHEADER))) == dataSize) { RAWINPUT rawInput = Marshal.PtrToStructure<RAWINPUT>(data); // 在这里处理原始输入数据 // 示例:检查输入设备类型是否为鼠标 if (rawInput.header.dwType == RIM_TYPEMOUSE) { RAWMOUSE mouseData = rawInput.mouse; // 在这里处理鼠标输入数据 int deltaX = mouseData.lLastX; int deltaY = mouseData.lLastY; Debug.Log("Mouse Delta: " + deltaX + ", " + deltaY); } } Marshal.FreeHGlobal(data); } base.WndProc(ref message); return; } base.WndProc(ref message); } [StructLayout(LayoutKind.Sequential)] struct RAWINPUTHEADER { public uint dwType; public uint dwSize; public IntPtr hDevice; public IntPtr wParam; } [StructLayout(LayoutKind.Explicit)] struct RAWINPUT { [FieldOffset(0)] public RAWINPUTHEADER header; [FieldOffset(16)] public RAWMOUSE mouse; // 其他输入设备类型的数据结构 } [StructLayout(LayoutKind.Sequential)] struct RAWMOUSE { public ushort usFlags; public uint ulButtons; public uint ulRawButtons; public int lLastX; public int lLastY; public uint ulExtraInformation; } const uint RIDEV_INPUTSINK = 0x00000100; const int RIM_TYPEMOUSE = 0x00000000; const int RID_INPUT = 0x10000003; [DllImport("user32.dll")] static extern uint GetRawInputData(IntPtr hRawInput, uint uiCommand, IntPtr pData, ref uint pcbSize, uint cbSizeHeader); [DllImport("user32.dll")] static extern bool RegisterRawInputDevices(RAWINPUTDEVICE[] pRawInputDevices, uint uiNumDevices, uint cbSize); [StructLayout(LayoutKind.Sequential)] struct RAWINPUTDEVICE { public ushort usUsagePage; public ushort usUsage; public uint dwFlags; public IntPtr hwndTarget; } void Start() { RAWINPUTDEVICE[] rawInputDevices = new RAWINPUTDEVICE[1]; rawInputDevices[0].usUsagePage = 0x01; // HID_USAGE_PAGE_GENERIC rawInputDevices[0].usUsage = 0x02; // HID_USAGE_GENERIC_MOUSE rawInputDevices[0].dwFlags = RIDEV_INPUTSINK; rawInputDevices[0].hwndTarget = this.Handle; if (!RegisterRawInputDevices(rawInputDevices, (uint)rawInputDevices.Length, (uint)Marshal.SizeOf(typeof(RAWINPUTDEVICE)))) { Debug.LogError("Failed to register raw input devices"); } } } ``` 上述示例代码中,重写了WndProc方法来处理Windows消息。在WndProc方法中,检查消息是否为WM_INPUT消息,并获取原始输入数据进行处理。示例代码中处理了鼠标输入数据,您可以根据实际需求进行相应的处理。 请注意,由于涉及到Windows API的调用,需要将上述代码放置在派生自UnityEngine.Windows.WindowsWindow类的自定义窗口脚本中,并确保脚本被正确添加到场景中。此外,还需要在Unity项目的Player Settings中启用"Allow 'unsafe' Code"选项。 希望这可以帮助您处理WM_INPUT消息并获取原始输入数据。如果有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值