【Unity_Input System】Input System新输入系统(一)

目录

一、导入Input System包

二、使用方式1:直接从输入设备对应类中获取输入

三、使用方式2:用代码创建InputAction获取输入

四、使用方式3:用Player Input组件获取输入

五、使用方式4:用Input Action Asset生成C#代码获取输入


一、导入Input System包

打开包管理器,搜索Input System,点击右下角安装。

安装完成会弹出警告框,点击Yes

这一步会重启编译器并禁用旧的Input Manager,如果想重新启用Input Manager,可以在项目管理->Player->活动输入处理中进行选择:

  • 选择输入管理器(旧)代表仅启用Input Manager
  • 选择输入系统包(新)代表仅启用Input System
  • 选择两个代表同时启用Input System及Input Manager

二、使用方式1:直接从输入设备对应类中获取输入

注意需要使用UnityEngine.InputSystem命名空间。

常用的输入设备:

  • 手柄——>Gamepad类(Gamepad.current获取当前手柄)
  • 键盘——>Keyboard类(Keyboard.current获取当前键盘)
  • 鼠标——>Mouse类(Mouse.current获取当前鼠标)
using UnityEngine;
using UnityEngine.InputSystem;public class M1_DirectlyFromInputDevice : MonoBehaviour
{private Vector2 dir;//用一个枚举类来切换设备类型public DeviceType type;void Update(){//1.Gamepad:if (type == DeviceType.Gamepad){//获取当前Gamepadvar gamepad = Gamepad.current;//gamepad为空则代表没有Gamepad连接if (gamepad == null){return;}//获取左摇杆的方向dir = gamepad.leftStick.ReadValue();//移动transform.Translate(new Vector3(dir.x, dir.y, 0) * Time.deltaTime);}//2.Keyboard:else if(type == DeviceType.Keyboard){var keyboard = Keyboard.current;if (keyboard == null){return;}//跳跃if (keyboard.spaceKey.isPressed){GetComponent<Rigidbody>().AddForce(Vector3.up * 10f);}}//3.Mouse:else{var mouse = Mouse.current;if(mouse == null){return;}//跳跃if (mouse.leftButton.isPressed){GetComponent<Rigidbody>().AddForce(Vector3.up * 10f);}}}public enum DeviceType{Gamepad,Keyboard,Mouse,}
}

三、使用方式2:用代码创建InputAction获取输入

注意需要使用UnityEngine.InputSystem命名空间。

增加按键绑定有两种方法:

  • AddBinding()
  • AddCompositeBinding()

其中AddCompositeBinding请查阅:Input Bindings | Input System | 1.3.0 (unity3d.com)

注意这种方式下,创建的Action必须手动在代码里面Enable

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;public class M2_CreateInputActionThroughScripts : MonoBehaviour
{public InputAction moveAction;public InputAction jumpAction;private Vector2 dir;void Start(){//增加2D Vector:WASD绑定moveAction.AddCompositeBinding("2DVector(mode=2)").With("Up", "<Keyboard>/w").With("Down", "<Keyboard>/s").With("Left", "<Keyboard>/a").With("Right", "<Keyboard>/d");//增加单个按键:Space绑定jumpAction.AddBinding("<Keyboard>/space");//需要手动启用ActionmoveAction.Enable();//需要手动启用ActionjumpAction.Enable();}void Update(){//获取输入dir = moveAction.ReadValue<Vector2>();//移动transform.Translate(new Vector3(dir.x, dir.y, 0) * Time.deltaTime);//跳跃if (jumpAction.ReadValue<float>() >= 1){GetComponent<Rigidbody>().AddForce(Vector3.up * 10f);}}
}

AddCompositeBinding的Mode有三种:

请查阅:Enum Vector3Composite.Mode | Input System | 1.3.0 (unity3d.com)

  •  Analog(当mode=2),默认,每个按键以浮点值0~1表示
  • Digital(当mode=1),每个按键只有0和1两种状态
  • DigitalNormalized(当mode=0),每个按键只有0和1两种状态,当返回是一个Vector类型的值时,会将向量长度标准化为1,方向不变 

四、使用方式3:用Player Input组件获取输入

第一步:添加PlayerInput组件

第二步:点击Player Input组件中的Create Actions创建Input Action Asset

第三步:设置Input Action Asset

新建出来的是默认配置,可以按自己的需求修改

其中:

  • 最左边的模块ActionMaps是Actions的分组,默认配置的ActionMaps有Player和UI两个分组。
  • 中间的模块Actions显示选中分组下的所有Actions,在这里可以对Action进行设置。
  • 最右边的模块Properties是Action或者Bindings的属性设置。
  • 最上方的All Control Scheme可以对Bindings进行筛选,比如选中Gamepad就只会显示Gamepad的Bindings。
  • 最上方的Save Asset用来手动保存,关闭时,未保存的修改会丢失,也可以勾选上Auto Save来自动保存

第四步:设置Player Input组件中的Behavior

请查阅:GameObject components for input | Input System | 1.3.0 (unity3d.com)

1>Send Messages

通过调用Gameobject的SendMessages()方法来调用OnXXX方法,比如当Move Action触发时,会调用OnMove方法,具体方法名可以看Behavior下面的说明

通过测试发现每一次触发都会调用方法至少两次,Performed状态时调用,Canceled状态时也会调用

public void OnMove()
{Debug.Log("Move " + GetComponent<PlayerInput>().actions["Move"].phase.ToString());
}

2>Broadcast Messages

与Send Messages类似,但不同的是,Broadcast Messages还可以调用子物体孙物体上挂载的对应方法

3>Invoke Unity Events

需要在事件中手动关联触发时需要调用的方法,注意Started、Performed、Canceled状态时都会各调用一次方法

using UnityEngine;
using UnityEngine.InputSystem;public class M3_UsePlayerInputComponent : MonoBehaviour
{public void OnMove(){Debug.Log("Move " + GetComponent<PlayerInput>().actions["Move"].phase.ToString());}
}

4>Invoke CSharp Events

有三个设定好的事件C#事件:

  •  onActionTriggered
  • onDeviceLost
  • onDeviceRegained 
using UnityEngine;
using UnityEngine.InputSystem;public class M3_UsePlayerInputComponent : MonoBehaviour
{private void Start(){GetComponent<PlayerInput>().onActionTriggered += OnActionTriggered;}public void OnActionTriggered(InputAction.CallbackContext context){Debug.Log(context.action + ":" + context.action.phase.ToString());}
}

 注意Started、Performed、Canceled三个状态都会触发事件

五、使用方式4:用Input Action Asset生成C#代码获取输入

注意这种方式下,必须手动在代码里面Enable

请查阅:Input Action Assets | Input System | 1.3.0 (unity3d.com)

第一步:可以按上面的方法用PlayerInput组件创建一个默认的Input Action Asset文件,然后可以移除PlayerInput组件

第二步:找到创建出来的Input Action Asset文件,点击该文件,勾选检查器里面的Generate C# Class,点击应用

第三步:在代码中创建上面的类的实例,并从该实例获取输入

using UnityEngine;
using UnityEngine.InputSystem;public class M4_GenerateScripts : MonoBehaviour
{private MyAction inputActions;void Start(){//创建一个实例inputActions = new MyAction();//启用Player分组里面的ActionsinputActions.Player.Enable();//事件inputActions.Player.Fire.performed += Fire_performed;}private void Fire_performed(InputAction.CallbackContext obj){Debug.Log("Fire");}
}

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

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

相关文章

Echarts的地图实现拖拽缩放同步功能(解决多层geo缩放、拖动卡顿问题)

项目场景&#xff1a; 大屏项目显示云南省3D的地图&#xff0c;可拖拽缩放、地图打点、点击图标弹框等等功能 问题描述 多图层拖拽时会上下层会分离&#xff0c;延迟卡顿 原因分析&#xff1a; 1、拖拽时不同图层的中心坐标没有保持一致&#xff0c; 2、卡顿是数据更新动画时…

php编写年历流程图,使用PHP怎么编写一个万年历功能

使用PHP怎么编写一个万年历功能 发布时间&#xff1a;2020-12-25 14:27:13 来源&#xff1a;亿速云 阅读&#xff1a;94 作者&#xff1a;Leah 这篇文章将为大家详细讲解有关使用PHP怎么编写一个万年历功能&#xff0c;文章内容质量较高&#xff0c;因此小编分享给大家做个参考…

mysql审计audit插件_MySQL审计工具Audit插件使用

MySQL审计工具Audit插件使用一、介绍MySQL AUDIT MySQL AUDIT Plugin是一个 MySQL安全审计插件&#xff0c;由McAfee提供&#xff0c;设计强调安全性和审计能力。该插件可用作独立审计解决方案&#xff0c;或配置为数据传送给外部监测工具。支持版本为MySQL (5.1, 5.5, 5.6, 5.…

计算机小知识应用,电脑使用小知识

办公用品网平台正在火热招商中&#xff01;&#xff01;&#xff01; 1.在我们使用软件时&#xff0c;大部分软件(如word&#xff0c;excel&#xff0c;PPT&#xff0c;等)会使用CTRL键加s键进行快捷保存。比如说&#xff0c;我们在写word文档时&#xff0c;写完一段&#xff0…

linux tree工具使用,Dutree–Linux上磁盘使用情况分析的免费开源命令行工具

Dutree是一款免费的开源&#xff0c;快速的命令列工具&#xff0c;用于分析磁碟使用情况。Dutree是Durep和Tree的组合。Durep用图表创建磁盘使用情况报告&#xff0c;这使我们能够确定哪些目录使用了最多的空间。尽管durep可以产生类似于du的文本输出&#xff0c;但其真正的功能…

直播预告 | 虹科Vuzix AR眼镜赋能汽车业“智慧眼”

就在今天20:00-21:00&#xff01; 虹科行业AR解决方案直播课程《虹科AR汽车行业解决方案》&#xff0c;深刻透析汽车业诊断、维修、培训的“四大痛点”&#xff0c;介绍汽车行业AR创新解决方案、培训场景解决方案、数字化工作流解决方案、远程协助全场景解决方案&#xff01; …

2023,智能硬件的AIGC“又一春”

​ 文|智能相对论 作者|佘凯文 消费电子产品风光不再&#xff0c;特别是自去年以来&#xff0c;电子消费市场经历了一整年的寒潮袭击&#xff0c;智能手机等产品达到10年消费谷底&#xff0c;PC出货量整体下降16%&#xff0c;不仅如此&#xff0c;包括平板、可穿戴设备也一改…

ChatGPT 速通手册——开始提问

开始提问 当我们完成注册后&#xff0c;页面自动会跳转到ChatGPT的主页面&#xff0c;在这里我们就可以开始进行对话了。 我们在页面下方的输入框中填写问题&#xff0c;然后回车或者点击小飞机&#xff0c;我们的问题和ChatGPT的答案就会在页面上方以一问一答的格式展现出来…

小牛情报APP最强攻略

下面博主就为您写一波小牛情报最强攻略。 首先&#xff0c;我们来介绍一下小牛情报&#xff0c;是国内专业的独立第三方区块链数据服务平台&#xff0c;一直致力于数据的深耕与数据价值的挖掘&#xff0c;从数据的采集、处理到数据的分析&#xff0c;再到数据的应用于咨询。它…

北京市小牛电动车选购指南

由于北京市对可上牌照的电动自行车的配置有要求&#xff1a;速度不能超过25km/s&#xff0c;必须带有脚踏板。本文写于2019年11 月&#xff0c;当前&#xff0c;小牛在北京可选的车型也就只有如下几种&#xff1a;U/U1、US、UM、U了&#xff0c;它们在《北京市电动自行车产品目…

小牛性能服务器图片,【N1S参数篇】性能与体验并肩,N1S参数配置介绍

​智能化时代已经来临&#xff0c;智能产品对于我们来说都已经不再陌生&#xff0c;硬件配置似乎永远是智能产品中恒古不变的主题。 和科技沾边的东西&#xff0c;似乎很难添加什么感性的包装。虽然如今我们看到不少强调梦想与情怀的产品层出不穷&#xff0c;但归根结底&#x…

MAC下查看JDK1.8中文文档CHM教程

下载JDK文档资源&#xff0c;本文结尾会提供资源链接。下载打开Mac,下载可以识别CHM的软件如CHM Reader&#xff0c;ReadCHM。 注意&#xff1a;升级Mac系统到10.15后我自己电脑的CHM Reader已经不能使用&#xff0c;应该是不兼容。重新找了其他的软件替代即可比如&#xff1a;…

大牛生小牛的问题

问题&#xff1a; 一只刚出生的小牛&#xff0c;4年后生一只小牛&#xff0c;以后每年生一只。现有一只刚出生的小牛&#xff0c;问20年后共有牛多少只&#xff1f; 思路&#xff1a; 这种子生孙&#xff0c;孙生子&#xff0c;子子孙孙的问题&#xff0c;循环里面还有循环的嵌…

小牛N1S改装60A大单体宁德时代

N1s是19年底动力版&#xff0c;目前行驶12000公里没有任何故障&#xff0c;也没做任何改装&#xff01;由于电池26A续航55公里左右还是不能满足个人使用习惯&#xff0c;官方电池太贵&#xff0c;所以有了自己改装大单体的想法&#xff0c;目前采购电池等配件中&#xff0c;选择…

求母牛生小牛函数c语言,编程求解以下问题 若一头母小牛,从出生的第四个年头开始每年生一头小母牛,按此规律,第n年时有多少头母牛?(要求用两种方法)...

满意答案 zoav7 2015.10.15 采纳率&#xff1a;59% 等级&#xff1a;7 已帮助&#xff1a;962人 //第一种方法 int n 100; //假设n100 int[] Group new int[1]; //初设牛的数量 Group[0] 1; for (int i 1; i < n; i) {//循环经过的 时间/年 int count Group.Length;…

解决小牛电动自行车电池不能输出电压

前几天我买的小牛电动自行车的APP 后台不停的报告我的电池 “已接入”和已断开“”&#xff0c;如下所示 最开始以为是谁在偷电池&#xff0c;马上就去找小牛&#xff0c;此时按遥控器&#xff0c;车辆已无反应了&#xff0c;把电池的电源输出连接线拔掉&#xff0c;APP 最终停…

小牛问题

描述&#xff1a;农场有一头牛&#xff0c;每年生一头小牛。小牛四岁后会每年生一头小小牛。求20年后农场有多少头牛。 题目很短&#xff0c;但很有意思的题目&#xff0c;作为水平不是很高的我来说&#xff0c;我觉得起到了充分的锻炼。 思路&#xff1a; 第一年&#xff1a…

小牛马的编程

1 自我介绍 大家好我是来自甘肃兰州&#xff0c;大一的学生&#xff0c;要说我是怎么喜欢上编程的那就要从一部电影说起来了&#xff0c;《没有绝对安全的系统》我就感觉黑客都很厉害&#xff0c;随便就入侵别人的系统&#xff0c;各种攻击&#xff0c;然后我也看了一些关于黑…

递推算法3——顺推法之母牛生小牛问题

有一头母牛&#xff0c;每年年初生一头小母牛&#xff0c;每头小母牛从第3个年头起每年年初也可以生一头小母牛。求在第20年时有多少头母牛。 令x0_i&#xff0c;x1_i&#xff0c;x2_i&#xff0c;x3_i分别表示第i年后刚生下的母牛、满1岁的母牛、满2岁的母牛以及可生小母牛的…

递归算法10——复杂递归之大牛生小牛问题

一只刚出生的小牛&#xff0c;4年后生一只小牛&#xff0c;以后每年生一只&#xff0c;现有一只刚出生的小牛&#xff0c;问20年后共有多少只。 【分析】 问题可以分成两种情况处理&#xff1a;小于4年时&#xff0c;只有一只小牛&#xff1b;大于4年时&#xff0c;小牛长成大…