003InputSystem新输入系统学习工作笔记

devtools/2024/11/14 13:16:32/

InputSystem新输入系统学习工作笔记

一、概述及理论学习

一种新的输入系统,可以用作UnityEngine.Input 中针对 Unity 典型输入系统的更具扩展性和可自定义的替代方案。

二、Demo案例学习

1**、首先是导入InputSystem包**

打开Package Manager面版,面版左上角选择“Unity Registry”选项,并在右上角搜索框架中输入插件名称“InputSystem”,如下图

点击“Install”进行安装

打开Unity的”Project”面版的“Packages”文件夹,InputSystem包已经安装好了,如下图

Unity支持通过两个独立的系统输入,一个旧的,一个新的。可以选择旧的,也可以选择新的,或者全都支持,通过面版“Project Settings”的Player项的Other Settings项目的“Active Input Handling*”指定三种选项进行支持,如下图

我们可以选择”Both”,让项目同时支持两种输入系统

2**、建立DEMO场景进行演示**

Unity建立一个简单的场景,中间建了一个雪人作为我们的主角,如下图

3**、创建并分配默认的项目范围操作project-wide actions**

input system将你的输入配置存储在Actions Asset中。首次安装输入系统包时,必须创建此Actions Asset。你可以通过转到Edit > Project Settings > Input System Package > Input Actions,然后单击”Create settings asset”按钮来完成此操作。

4**、默认****Action Maps and Actions**

Action Maps允许您将actions组织成组,这些组代表一组动作在一起有意义的特定情况。 Input System的默认配置有两个Action Maps: “Player” 和“UI”。这些都包含默认操作,通常分别对游戏和用户界面交互有用。

“Player”Action Maps定义了几个与游戏相关的动作,如“移动”、“看”、“跳跃”和“攻击”动作。“UI”Action Maps定义了几个与用户界面相关的动作,如“导航”、“提交”和“取消”。

每个默认操作都绑定到几种不同类型的控件。例如:

“移动”动作绑定到“WSAD”键盘键和箭头键、游戏手柄棒、XR控制器上的主2D轴

“跳跃”动作绑定到空格键、游戏手柄上的“南”按钮和XR控制器上的辅助按钮。

我们开始建立Action Maps

在“Project”面版新建一个文件夹”Input SystemDemo”作为DEMO的演示目录,右键点击 Create->Input Actions建立我们的Input Actions,如下图

然后将建立的Input Actions重命名为“InputControls”,然后在”InputControls”选中的情况下点击”Generate C# Class”复选框可以生成相应的C#代码,点击“Apple”才能生成代码,如下图

可以看到在“InputControls”同级目录下会生成同名的代码“InputControls.cs”,这个代码后面我们会用到。

然后点击“Inspector”面版的“Edit asset”按钮,打开“Player (Input Actions)”面版,在上面面版的左边“Action Maps”处点击“+”按钮生成一个“Action Maps”,并重命名为“Player”,将默认生成的Actions重命名为LeftMove,如下图

选择”LeftMove”下面的“”,然后映射它的按键,我们设置为“A”,如下图

重复以上步骤建立三个Actions即“RightMove”、“UpMove”和“DownMove”,分别对应“D”、“W”和“S”,如下图

然后我写个测试代码,邦定上面的四个按钮的响应函数,建立脚本“SnowManTest.cs”,将移动上面场景中的“snowman”对象上,双击脚本进行编辑,代码如下

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.InputSystem;

public class SnowManTest : MonoBehaviour

{

private InputControls m_InputControls;

private bool m_LeftMove = false;

private bool m_RightMove = false;

private bool m_UpMove = false;

private bool m_DownMove = false;

private void OnEnable()

{

m_InputControls = new InputControls();

m_InputControls.Enable();

m_InputControls.Player.LeftMove.started += OnLeftMove;

m_InputControls.Player.LeftMove.canceled += OnLeftCancel;

m_InputControls.Player.RightMove.started += OnRightMove;

m_InputControls.Player.RightMove.canceled += OnRightCancel;

m_InputControls.Player.UpMove.started += OnUpMove;

m_InputControls.Player.UpMove.canceled += OnUpCancel;

m_InputControls.Player.DownMove.started += OnDownMove;

m_InputControls.Player.DownMove.canceled += OnDownCancel;

}

// Start is called before the first frame update

void Start()

{

}

private void OnLeftMove(InputAction.CallbackContext Obj)

{

m_LeftMove = true;

}

private void OnLeftCancel(InputAction.CallbackContext Obj)

{

m_LeftMove = false;

}

private void OnRightMove(InputAction.CallbackContext Obj)

{

m_RightMove = true;

}

private void OnRightCancel(InputAction.CallbackContext Obj)

{

m_RightMove = false;

}

private void OnUpMove(InputAction.CallbackContext Obj)

{

m_UpMove = true;

}

private void OnUpCancel (InputAction.CallbackContext Obj)

{

m_UpMove = false;

}

private void OnDownMove(InputAction.CallbackContext Obj)

{

m_DownMove = true;

}

private void OnDownCancel(InputAction.CallbackContext Obj)

{

m_DownMove = false;

}

// Update is called once per frame

void Update()

{

float horizontal = 0;

float vertical = 0;

if(m_LeftMove && m_RightMove)

{

horizontal = 0;

}

else if(m_LeftMove)

{

horizontal = -0.5f;

}

else if(m_RightMove)

{

horizontal = 0.5f;

}

if(m_UpMove && m_DownMove)

{

vertical = 0;

}

else if(m_UpMove)

{

vertical = 0.5f;

}

else if(m_DownMove)

{

vertical = -0.5f;

}

// 计算移动量

Vector3 movement = new Vector3(horizontal, 0.0f, vertical) * 5 * Time.deltaTime;

// 移动物体

transform.Translate(movement);

if (Keyboard.current.spaceKey.wasPressedThisFrame)

{

Debug.Log(“Space key was pressed”);

}

}

}

注意上面的代码行m_InputControls.Enable(); 如果没有这行是不起作用的

然后,我们运行DEMO,当我们点击W,S,A,D四个键时“snowman”就会前后左右的移动。


http://www.ppmy.cn/devtools/114520.html

相关文章

服务器连接不上怎么办?

服务器连接不上怎么办?服务器连接问题对于依赖网络服务的企业来说可能是一场灾难,因为它可能导致业务中断和数据访问困难。当遇到服务器连接不上的情况时,迅速而准确地诊断问题并采取相应措施至关重要。聚名网将介绍一些常见的故障排查步骤和…

VSCode 渲染 markdown md , 设置插件的背景颜色 Markdown Preview Enhanced

起因, 目的: VSCode 中, 安装 Markdown Preview Enhanced 这个插件之后,能渲染,但是背景颜色太亮了。 最近正在学习 css, 所以一试身手。 先看效果: 过程: Ctrl Shift P 打开命令面板。输入: Markdown Preview…

firewalld实现NAT端口转发

1、准备工作 # 开启 NAT 转发 firewall-cmd --permanent --zonepublic --add-masquerade # 开放 DNS 使用的 80 端口,tcp# 必须,否则其它机器无法进行域名解析 firewall-cmd --zonepublic --add-port80/tcp --permanent # 检查是否允许 NAT 转发 f…

荣耀时刻|Anzo Capital 闪耀2024国际金融产业博览会

【2024年9月5日-6日,中国香港】由数汇金融和汇友网主办的2024年国际金融产业博览会香港峰会在香港康得思酒店举行,Anzo Capital 昂首资本作为顶级赞助商和重磅受邀嘉宾出席了本次展会。 此次展会汇聚了众多行业领军企业、知名专家以及投资机构&#xff…

★ C++进阶篇 ★ 多态

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将继续和大家一起学习C进阶篇第二章----多态 ~ ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页&#xff1a;椎名澄嵐-CSDN博客 C基础篇专栏&#xff1a;★ C基础篇 ★_椎名澄嵐的博客-CSDN博客 …

Leetcode—1184. 公交站间的距离【简单】

2024每日刷题&#xff08;161&#xff09; Leetcode—1184. 公交站间的距离 实现代码 class Solution { public:int distanceBetweenBusStops(vector<int>& distance, int start, int destination) {int clockwise 0;int counterclockwise 0;if(start > desti…

ROM和RAM的区别

ROM&#xff08;Read-Only Memory&#xff0c;只读存储器&#xff09;和RAM&#xff08;Random Access Memory&#xff0c;随机存取存储器&#xff09;是计算机系统中两种不同类型的存储技术&#xff0c;它们在功能、用途和特性上有显著的区别&#xff1a; 1. 存储数据的持久性…

行人持刀检测数据集 voc yolo

行人持刀检测数据集 9000张 持刀检测 带标注 voc yolo 行人持刀检测数据集 数据集描述 该数据集旨在用于行人持刀行为的检测任务&#xff0c;涵盖了多种场景下的行人图像&#xff0c;特别是那些携带刀具的行人。数据集包含大量的图像及其对应的标注信息&#xff0c;可用于训练…