Unity 新版输入系统(Input System)

news2024/11/15 15:58:17

前言

官方教程

注意
新的输入系统需要 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.coloradmin.cn/o/1620488.html

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

相关文章

【电控实物-infantry】

云台电机参数 电机内部参数 相电阻:Rs1.8欧 相电感:Ls5.7810^-3H 转矩常数:Kt 0.741 NM/A 转动惯量:J KG-m^2 电机接收数据&#xff1a;-16384到16384&#xff08;-3A到3A&#xff09; 电机反馈&#xff1a;速度RPM rad/s &#xff08;2πrpm&#xff09;/60 C板陀螺仪&…

RTT学习 cortex-m移植

Cortex-M移植 PRIMASK寄存器 PRIMASK寄存器为1位宽的中断屏蔽寄存器。在置位时&#xff0c;它会阻止不可屏蔽中断&#xff08;NMI&#xff09;和HardFault异常之外的所有异常&#xff08;包括中断&#xff09;。实际上&#xff0c;它是将当前异常优先级提升为0&#xff0c;这也…

压力测试caliper/java-sdk

通过Caliper进行压力测试程序 第一步. 配置基本环境 部署 Caliper 的计算机需要有外网权限&#xff1b; 操作系统版本需要满足以下要求&#xff1a; Ubuntu > 16.04 、 CentOS > 7 或 MacOS > 10.14 &#xff1b; 部署 Caliper 的计算机需要安装有以下软件&#x…

【机器学习】科学库使用第5篇:Matplotlib,学习目标【附代码文档】

机器学习&#xff08;科学计算库&#xff09;完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;机器学习&#xff08;常用科学计算库的使用&#xff09;基础定位、目标&#xff0c;机器学习概述定位,目标,学习目标,学习目标,1 人工智能应用场景,2 人工智能小…

Nuxt3项目如何通过开启ssr让网页实现seo自由!

nuxt.config开启ssr # nuxt.config.tsexport default defineNuxtConfig({// 是否开启SSRssr: true }) 终端运行 npm run generate generate 预渲染应用程序的每个路由&#xff0c;并将结果存储为纯HTML文件。 "scripts": {"generate": "nuxt genera…

软件兼容性定义以及作用简单讲解-行云管家

设想一下&#xff0c;假如您购买了一款新软件&#xff0c;但发现它无法在您的操作系统上正常运行&#xff0c;这个时候是不是非常恼火&#xff0c;是不是非常生气。所以企业采购新软件之前&#xff0c;一定要保障与其他操作系统能兼容。今天我们就来聊聊什么是软件兼容性&#…

小程序AI智能名片S2B2C商城系统:五大营销技术模块深度剖析

在当今数字化营销的时代&#xff0c;小程序AI智能名片S2B2C商城系统凭借五大核心营销技术模块&#xff0c;为企业提供了强大的私域流量管理与营销能力。下面我们将逐一剖析这五大模块&#xff0c;看它们如何共同助力企业实现精准营销与业务增长。 一、小程序&#xff1a;用户触…

1、Flink DataStreamAPI 概述(上)

一、DataStream API 1、概述 1&#xff09;Flink程序剖析 1.Flink程序组成 a&#xff09;Flink程序基本组成 获取一个执行环境&#xff08;execution environment&#xff09;&#xff1b;加载/创建初始数据&#xff1b;指定数据相关的转换&#xff1b;指定计算结果的存储…

Nintex访问上海斯歌总部,双方达成重要战略共识

近日&#xff0c;Nintex公司&#xff08;K2产品总部&#xff09;亚太区域销售副总裁Keith Payne、资深解决方案工程师Ranjit Nair以及区域销售经理Rachel一行莅临上海斯歌总部进行访问。在此次会晤中&#xff0c;上海斯歌与Nintex就未来在中国大陆及中国香港市场的战略发展达成…

SOLIDWORKS 2024 MBD新增功能

MBD即基于模型的工程定义、是一个用集成的三维实体模型来完整表达产品定义信息的方法体&#xff0c;它详细规定了三维实体模型中产品尺寸、公差的标注规则和工艺信息的表达方法。 01 通过实体几何体控制注解的可见性 SOLIDWORKS 2024 MBD 在用户使用体验上做了很大的提升。S…

QT初识

通过图形化界面输出helloworld 既然学习了QT&#xff0c;那么自然要做经典的输出helloworld字符串的实验。 QT有两好几种方案输出helloworld&#xff0c;一种是通过图形化界面输出&#xff0c;一种是通过代码实现。 这里先了解图形化界面的方案。 创建项目后&#xff0c;点…

高频前端面试题汇总之HTML篇

1. src和href的区别 src和href都是用来引用外部的资源&#xff0c;它们的区别如下&#xff1a; src&#xff1a; 表示对资源的引用&#xff0c;它指向的内容会嵌入到当前标签所在的位置。src会将其指向的资源下载并应⽤到⽂档内&#xff0c;如请求js脚本。当浏览器解析到该元素…

函数式接口及Stream流式计算

一、什么是函数式接口 只有一个方法的接口&#xff0c;例如 FunctionalInterface public interface Runnable { public abstract void run(); }二、Function函数式接口&#xff1a;有一个输入参数&#xff0c;有一个输出 三、断定型接口&#xff1a;有一个输入参数&#xf…

如何用虚拟仿真实训室提质增效?

为积极推进教学改革&#xff0c;优化人才培养方案&#xff0c;紧跟产业发展趋势&#xff0c;响应教育领域数字化改革要求&#xff0c;越来越多院校通过搭建虚拟仿真实训室、数字人实训室&#xff0c;打通了融“理论知识虚拟训练技能训练”为一体的教学和实训。学生通过数字人实…

代码随想录 Day19 字符串 | LC28 实现strStr() 【KMP经典题目】

六、实现strStr() 题目&#xff1a; 力扣28&#xff1a;找出字符串中第一个匹配的下标 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack…

大模型检索召回系统:RAG技术的全面调查与未来展望

随着人工智能技术的飞速发展&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;领域取得了显著成就。然而&#xff0c;这些模型在处理特定领域或知识密集型任务时仍面临挑战&#xff0c;如产生错误信息或“幻觉”。为了克服这些难…

代码随想录算法训练营33期 第五十天 | 188.买卖股票的最佳时机IV

dp[i][0] 不操作&#xff1b;d[i][1]第一次开始持有股票 //dp[i]当前天i的价值情况&#xff0c;dp[i][0]表示不操作的最大价值&#xff0c;dp[i][1]在当前天第一次持有的最大价值&#xff0c;dp[i][2]在当前天第一次卖出的最大价值, dp[i][3]在当前天第二次持有的最大价值&am…

qmt教程2----订阅单股行情,提供源代码

链接 qmt教程2----订阅单股行情&#xff0c;提供源代码 (qq.com) qmt教程1---qmt安装&#xff0c;提供下载链接 今天我重新封装了全部qmt的内容&#xff0c;包括数据&#xff0c;交易 qmt交易 我本来打算全部上次git的&#xff0c;但是考虑到毕竟是实盘的内容&#xff0c;就放…

项目总结计划-(Word)

项目总结计划书-Word 2 项目工作成果 2.1 交付给用户的产品 2.2 交付给研发中心的产品 2.2.1 代码部分 2.2.2 文档部分 2.3 需求完成情况与功能及性能符合性统计 2.3.1 需求完成情况统计 2.3.2 功能符合性分析 2.3.3 性能符合性分析 3 项目工作分析 3.1 项目计划与进度实施分…