Unity 新版输入系统(Input System)

前言

官方教程

注意
新的输入系统需要 Unity 2019.4+ 和 .NET 4 运行时。它不适用于 .NET 3.5 的项目。
教程版本:Unity 2021.3.26

1. 安装

1.1 打开 Package Manager

导航栏 -> Window -> Package Manager

![[Pasted image 20240325155507.png]]

1.2 安装 Input System

选择 Unity Registry 在列表中找到 Input System 点击Install安装

![[Pasted image 20240325155721.png]]

点击 Yes 启用新版 Input System 等待Unity重新启动

![[Pasted image 20240325161420.png]]

Unity 默认会同时启用旧版和新版输入系统,你可以在 Player settings 中(Edit -> Project Settings -> Player ->Active Input Handling 找到相应的设置。可以随时修改这里的设置,这样做依然会重启编辑器。

![[Pasted image 20240325162301.png]]

2. 入门指南

2.1 快速监听某个按键按下抬起操作

void Update()  
{  // 检查空格键是否在这个帧被按下  if (Keyboard.current.spaceKey.wasPressedThisFrame)  {        Debug.Log("Space key was pressed");  }   // 检查空格键是否在这个帧被释放  if (Keyboard.current.spaceKey.wasReleasedThisFrame)  {        Debug.Log("Space key was released");  }   // 检查左鼠标键是否在这个帧被按下  if (Mouse.current.leftButton.wasPressedThisFrame)  {        Debug.Log("Left mouse button was pressed");  }  // 检查左鼠标键是否在这个帧被释放  if (Mouse.current.leftButton.wasReleasedThisFrame)  {        Debug.Log("Left mouse button was released");  }
}

2.2 使用可视化编辑器来建立映射

Project -> Create -> Input Actions

![[Pasted image 20240325165116.png]]

新建 Input Actions 给其命名(名称无所谓),笔者命名为 Test Input Controls 完成后,选中该文件勾选 Generate C# Class点击 Apply 后 Unity 会为我们生成一个 Action 的包装类,方便后续在代码中引用。

![[Pasted image 20240325173907.png]]

Action Map
可以理解为一个组织和管理输入动作的一种方式。通过将相关的输入动作放在同一个Action Map中,可以更好地管理输入逻辑。例如,可以将所有与玩家移动相关的输入动作放在一个叫做"Movement"的Action Map中。

Action
一个具体的输入动作,比如按键按下、摇杆移动等。

生成结束点击 Edit asset 创建第一个 Action Map 并将其命名为 Player 并将 Actions 列表生成的 Action 重命名为 Fire

![[Pasted image 20240325181359.png]]

选中 < No Binding >Fire Action 映射对应的按键(按键可以自定义,笔者映射的按键为键盘的 K 键)

![[Pasted image 20240325181748.png]]

也可以绑定多个按键对应不同的操作设备,笔者映射的第二个按键为鼠标左键

![[Pasted image 20240326094550.png]]

![[Pasted image 20240326180304.png]]
完成上述操作后点击 Save Asset 保存当前映射表,这样做可以绑定多个物理输入得到的输入值也只会影响同引用的 Action 对象。

![[Pasted image 20240326180326.png]]

2.3 通过代码监听映射表中的按键

创建测试脚本 TestInputSystem (命名可随意),我们需要使用之前的 TestInputControls ,通过监听 startedcanceled 实现按键按下抬起操作。具体可参考下述代码

// 输入控制类的实例  
private TestInputControls InputControls;  void OnEnable()  
{  InputControls = new TestInputControls(); // 创建输入控制实例  InputControls.Player.Fire.started += OnFireDown; // 注册开火开始动作的回调  InputControls.Player.Fire.canceled += OnFireUp; // 注册开火结束动作的回调  InputControls.Enable(); // 启用输入控制  
}  //当开火动作被触发时调用此方法。  
private void OnFireDown(InputAction.CallbackContext Obj)  
{  Debug.Log($"Fire Down | KeyName:{Obj.control.name}"); // 输出"Fire Down"到控制台 
}//当开火动作释放时调用此方法。  
private void OnFireUp(InputAction.CallbackContext Obj)  
{  Debug.Log($"Fire Up | KeyName:{Obj.control.name}"); // 输出"Fire Up"到控制台 
}//主要用于移除输入动作的回调函数,并禁用输入控制。  
private void OnDisable()  
{  InputControls.Player.Fire.started -= OnFireDown; // 移除开火开始事件的监听器  InputControls.Player.Fire.canceled -= OnFireUp; // 移除开火结束事件的监听器  InputControls.Disable(); // 禁用输入控制  
}

测试效果

可以看到,我们使用一套代码就可以同时监听键盘和鼠标的输入

![[Pasted image 20240326181829.png]]

按下抬起有了,要想实现长按也很简单。选中 TestInputControls 点击 Edit asset
Action Properties 一栏点击 Interactions 后方的+号添加 Hold

Hold:按下并按住至少设定的持续时间(默认为defaultHoldTime),则执行动作。(长按执行操作)
MultiTap:需要多次轻击(在tapTime内按下并释放),每次轻击之间的间隔不超过tapDelay秒(双击或多击)
Press:根据按钮的按下和释放顺序来触发特定的操作(例如:在按下按钮后执行某个动作或在释放按钮时执行某个操作)
SlowTap:按下并按住控件一段时间后释放时执行操作(长按释放后执行操作)
Tap:按下并按住小段时间内释放执行操作(点击)

![[Pasted image 20240326140155.png]]

添加完 Hold 后,我们看一下它的两个变量。如何默认值不能满足你的需求,取消勾选 Default 可自定义变量值。修改 Hold Time 变量一般即可满足需求

Press Point:按下按键这个阈值才能被认为是按下(笔者理解的是按压力度)
Hold Time:按下并按住按键保持的时间(以秒为单位)。

![[Pasted image 20240326142645.png]]

还是之前的代码在此基础上增加了长按监听的代码,具体参考下述代码

// 输入控制类的实例  
private TestInputControls InputControls;  void OnEnable()  
{  InputControls = new TestInputControls(); // 创建输入控制实例  InputControls.Player.Fire.started += OnFireDown; // 注册开火开始动作的回调  InputControls.Player.Fire.performed  += OnLongPress; // 注册长按动作的回调  InputControls.Player.Fire.canceled += OnFireUp; // 注册开火结束动作的回调  InputControls.Enable(); // 启用输入控制  
}  //当开火动作被触发时调用此方法。  
private void OnFireDown(InputAction.CallbackContext Obj)  
{  Debug.Log($"Fire Down | KeyName:{Obj.control.name}"); // 输出"Fire Down"到控制台 
}  //当开火动作持续时调用的方法。  
private void OnLongPress(InputAction.CallbackContext Obj)  
{  Debug.Log($"Fire Long Press | KeyName:{Obj.control.name},持续时间{Obj.duration}"); // 输出动作持续时间  
}  //当开火动作释放时调用此方法。  
private void OnFireUp(InputAction.CallbackContext Obj)  
{  Debug.Log($"Fire Up | KeyName:{Obj.control.name}"); // 输出"Fire Up"到控制台  
}  //主要用于移除输入动作的回调函数,并禁用输入控制。  
private void OnDisable()  
{  InputControls.Player.Fire.started -= OnFireDown; // 移除开火开始事件的监听器  InputControls.Player.Fire.performed  -= OnLongPress; // 移除长按事件的监听器  InputControls.Player.Fire.canceled -= OnFireUp; // 移除开火结束事件的监听器  InputControls.Disable(); // 禁用输入控制  
}

经过上述步骤,我们学习到了新版 InputSystem 中的三个最基本的按键触发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/828023.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ, DelayQueue, Redis的介绍以及IDEA的实现

RabbitMQ RabbitMQ是一个开源的消息队列中间件&#xff0c;它实现了高效、可靠的消息传递机制。它支持多种消息传递模式&#xff0c;如发布/订阅、点对点、请求/回应等。RabbitMQ以其可靠性、灵活性和易用性受到广泛的关注和应用。 RabbitMQ基于AMQP&#xff08;Advanced Mess…

字符串刷题(day1)题解

文章目录 字符串刷题一、Erase First or Second Letter二、Swap and Reverse三、Largest Subsequence四、XOR Palindromes五、Strong Password六、Row Major七、Game with Reversing八、Tear It Apart 字符串刷题 vjudge题单 一、Erase First or Second Letter [Erase First…

孙中亮:北斗三十周年,看北斗芯片高质量发展历程和方向

1994年1月10日&#xff0c;北斗一号建设正式启动&#xff0c;党中央决策建设独立自主的北斗卫星导航系统。2020年7月31日&#xff0c;北斗三号全球卫星导航系统正式开通&#xff0c;标志着北斗系统进入全球化发展新阶段。随着2024年的到来&#xff0c;北斗系统建设已走过栉风沐…

汇智知了堂走进宜宾学院,共话国产化信创未来!

在春意盎然的四月&#xff0c;汇智知了堂以其深厚的品牌底蕴和卓越的教育品质&#xff0c;再次展现了其在教育领域的领先地位。4月18日&#xff0c;汇智知了堂走进宜宾学院&#xff0c;为广大学子带来了一场关于国产化信创时代的技术变革与专业学习建议的讲座。 汇智知了堂作…

前端 -- if-else嵌套地狱

要解决 if-else 嵌套地狱问题&#xff0c;可以考虑以下几种方法&#xff1a; 1. 使用早返回&#xff08;Early Return&#xff09;&#xff1a; 尽早返回函数&#xff0c;避免深层嵌套。 将条件判断简化为多个独立的 if 语句&#xff0c;每个 if 语句处理一种情况。 2. 使用…

2024深圳杯(东三省)数学建模挑战赛D题:音板的振动模态分析与参数识别思路代码成品论文分析

​ 更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓ https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 问题重述 深圳杯&#xff08;东三省&#xff09;数学建模挑战赛2024D题&#xff1a;音板的振动模态分析与…

YoloV9改进策略:注意力改进、Neck层改进_自研全新的Mamba注意力_即插即用,简单易懂_附结构图_检测、分割、关键点均适用(独家原创,全世界首发)

摘要 无Mamba不狂欢,本文打造基于Mamba的注意力机制。全世界首发基于Mamba的注意力啊!对Mamba感兴趣的朋友一定不要错过啊! 基于Mamba的高效注意力代码和结构图 import torch import torch.nn as nn # 导入自定义的Mamba模块 from mamba_ssm import Mamba class Eff…

vue做导入导出excel文档

系统中经常会遇到要实现批量导入/导出数据的功能&#xff0c;导入就需要先下载一个模板&#xff0c;然后在模板文件中填写内容&#xff0c;最后导入模板&#xff0c;导出就可能是下载一个excel文件。 1、导出 新建一个export.js文件如下&#xff1a; import {MessageBox,Mes…

赋能数据检索:构建用于www.sohu.com的新闻下载器

引言 在信息爆炸的时代&#xff0c;随着新闻数据的数量不断增长&#xff0c;获取和分析这些数据变得尤为关键。本文将介绍如何构建一个高效的新闻下载器&#xff0c;专门用于从搜狐网&#xff08;www.sohu.com&#xff09;检索和下载新闻内容。 背景介绍 搜狐网作为中国领先…

区块链和IPFS安全测试工具;ECC+AES混合加密机制:秘钥管理

目录 区块链和IPFS安全测试工具 区块链测试工具:Caliper,BlockEmulator IPFS测试工具:Testgrou

vite与webpack有什么不同?为什么vite比webpack快?

1. 定位 webpack、rollup、esbuild 都是打包工具&#xff0c;对代码进行压缩、合并、转换、分割、打包等操作&#xff0c;都需要打包工具去完成 vue-cli、umi 是基于 webpack 的上层封装&#xff0c;通过简单配置能快速搭建起一个项目&#xff08;用 webpack 去搭建项目需要配…

iOS(Object C) 快速排序

快速排序使用分治法,把一个数组分为两个子数组 本质上来看&#xff0c;快速排序应该算是在冒泡排序基础上的递归分治法。 快速排序的思想: 1.找到一个基准元素(通常是数组里的第一元素) 2.从右边开始遍历,找到一个比基准数小的值(minValue),将minValue放到基准值的初始位置,…

40. 【Android教程】AsyncTask:异步任务

在前面的章节有提到过&#xff0c;Android 系统默认会在主线程&#xff08;UI 线程&#xff09;执行任务&#xff0c;但是如果有耗时程序就会阻塞 UI 线程&#xff0c;导致页面卡顿。这时候我们通常会将耗时任务放在独立的线程&#xff0c;然后通过 Handler 等线程间通信机制完…

外贸干货|客户迟迟不付款,怎么催?

(一) Gentle reminder 温馨提醒 "Hello Mary, l hope this message finds you well. l wanted to kindly remind you about the payment for our agreed-upon order. We appreciate your business and would like to proceed with the next steps as soon as possible.…

DS32K查看内置寄存器数值

需要在debug的时候进行查看&#xff0c;先暂停&#xff0c;再打开EmbSys Registers窗口。 需要先将导出的内容选中并双击&#xff0c;不然复制出来会变成问号。右上角有个复制按钮&#xff0c;复制到剪贴板就行。譬如我这里选择了MCR寄存器&#xff0c;复制出来的就是这个寄存器…

下载nvm来配置node版本

背景提示&#xff1a;入职的公司项目久远&#xff0c;一直运行不起来&#xff0c;原来是我node版本太高&#xff0c;需要降级才行。然后找到这个nvm配置一下 准备工作 如果电脑有配置node的&#xff0c;需要先卸载掉才能配置nvm&#xff01;&#xff01;&#xff01;这是重点嗷…

Leetcode双指针刷题(一)

给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面…

播放相关知识-持续更新

一&#xff1a;基础知识&#xff1a; 1.编码方式&#xff1a; H264&#xff1a; H265&#xff1a; AV1&#xff1a; 1.多码流&#xff0c;为什么现在视频播放有这么多的码流&#xff08;100、200、300、400、500、600、800、1020等等&#xff09; 优点&#xff1a;用户不同的…

大模型解决方案:具体业务场景下的智能表单填充(附代码)

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 大模型应用向开发路径:AI代理工作流大模型应用开发实用开源项目汇总大模型问答项目问答性能评估方法大模型…

在组件页面刷新为什么触发不了组件的生命周期销毁钩子

当在前端开发中遇到组件页面刷新时&#xff0c;无法触发组件生命周期的销毁钩子&#xff08;如 Vue 的 beforeDestroy/destroyed 或 React 的 componentWillUnmount&#xff09;&#xff0c;通常有以下几种情况或原因&#xff1a; 页面刷新的本质&#xff1a;当浏览器页面执行刷…