Unity-Input System新输入系统插件学习

1.键盘、鼠标操作

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;public class NewInputSystem : MonoBehaviour
{public float SpaceKeyValue;public float RightMouseValue;public Image Icon;public Vector2 MousePos;public Vector2 MouseScroll;void Update(){if(Keyboard.current != null)        //判断是否有键盘外设接入{if(Keyboard.current.spaceKey.wasPressedThisFrame)       //判断是否按下{Debug.Log("Space Pressed - New");}else if(Keyboard.current.spaceKey.wasReleasedThisFrame) //判断是否抬起{Debug.Log("Space Released - New");}//值为0表示没有按住,值为1表示正在按住SpaceKeyValue = Keyboard.current.spaceKey.ReadValue();if(SpaceKeyValue > 0)Debug.Log("Space");}if(Mouse.current != null)       //判断是否有鼠标外设接入{if(Mouse.current.rightButton.wasPressedThisFrame)       //判断鼠标邮件是否按下Debug.Log("RightMouse Released - New");//值为0表示没有按住,值为1表示正在按住RightMouseValue = Mouse.current.rightButton.ReadValue();//鼠标右键按住if(Mouse.current.rightButton.ReadValue() == 1)Debug.Log("RightMouse");//获取鼠标位置Icon.rectTransform.anchoredPosition = Mouse.current.position.ReadValue();MousePos = Mouse.current.position.ReadValue();//获取鼠标滚轮值MouseScroll = Mouse.current.scroll.ReadValue();}//手柄if(Gamepad.current != null){}}
}

2.Input Action

Action Maps---动作表(一般分为两个表1.GamePlay-游戏时用的表,2.UI)

Action—动作   

配置:

(1)Action Maps(方案):点击右侧加号新建一个方案,输入方案名称,然后选中该方案在Action与Action Properties设置该方案具体内容。

(2)Action(输入行为):点击“+”添加一个action,选中添加的action在右侧Action Properties内配置Action Type(value—通过值判断,提供一种连续状态变化事件,如果设置了多个输入,就会切换到最主要的一个。用它进行模拟控制,比如移动;Button—通过按钮,默认设置,包括按钮或者按键触发的一次性动作;Pass Through—和Value很相似,但它不会像Value一样(如果有多个输入时,不会只选择最主要的那个,而把其他的输入忽略,适用于一台机器有多人进行游戏)。在使用Value或者Pass Through Types时,你会看到一个额外的选项 Control Type为该Value的返回值类型)。

(3)然后点击添加的Action右侧的“+”,有下列4项选择:

Add Binding:添加普通绑定

Add Up\Down\Left\Right Composite:添加上下左右绑定,Action中的Control Type为Vector2时存在此选项

Add Binding With One Modifier:添加组合按钮(1+1组合按键)

Add Binding With Two Modifiers:添加组合按键(1+2组合按键)

(4)点击添加的绑定,在右侧Binding PropertiesàBindingàPath内选择要绑定的按键(可以是键盘、手柄、鼠标等输入设备),也可以点击搜索框左侧的“Listen”按钮,然后按下要绑定的按键,然后选择对应按键即可完成绑定。

(5)配置Interactions:设置Action中的Interactions,该设置会影响Action下所有Binding,设置Binding的Interactions只会影响该Binding。

详细请看【Unity_Input System】Input System新输入系统(二)_铃兰148的博客-CSDN博客的第5节

(6)配置Processors:详细请看【Unity_Input System】Input System新输入系统(二)_铃兰148的博客-CSDN博客的第6节

(7)然后点击“Save Asset”即可保存该InputAction

(8)然后单击创建的InputAction在Inspector面板勾选“Generate C# Class”并配置文件路径,类名,命名空间名称,点击Apply即可生成C#类代码文件。

(9)最后就是编写代码脚本进行使用,示例代码如下

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Animations;
using UnityEngine.InputSystem;public class InputSystemBall : MonoBehaviour
{/// <summary>/// 移动的值,范围为-1到1,类似旧版系统中GetAxis获取到的值/// </summary>public Vector2 Movement;/// <summary>/// 移动速度/// </summary>public float MoveSpeed = 5f;/// <summary>/// 横向偏移值(-1,1),模拟旧版GetAxis(“Horizontal”)的值/// </summary>public float Horizontal;/// <summary>/// 创建的InputAction/// </summary>private MyInputAction myInputAction;private Rigidbody rigidbody;private void Awake(){myInputAction = new MyInputAction();//启用InputActionmyInputAction.Enable();rigidbody = GetComponent<Rigidbody>();//给InputAction中的Jump添加监听,分为3个阶段Started->Performed->Canceld//myInputAction.GamePlay.Jump.performed += OnJump;}public void OnJump(InputAction.CallbackContext context){//Started->Performed->Canceld//context.ReadValueAsButton()获取按键是按下(true),还是抬起(false)Debug.Log($"Jump!:{context.ReadValueAsButton()}");rigidbody.AddForce(Vector3.up * 5f, ForceMode.Impulse);}private void OnDestroy(){//禁用InputActionmyInputAction.Disable();}void Update(){//获取InputAction中Movement的值Movement = myInputAction.GamePlay.Movement.ReadValue<Vector2>();//获取InputAction中Horizontal的值Horizontal = myInputAction.GamePlay.Horizontal.ReadValue<float>();rigidbody.AddForce(new Vector3(Movement.x, 0, Movement.y) * MoveSpeed * Time.deltaTime, ForceMode.Impulse);//if (myInputAction.GamePlay.Jump.IsPressed())//    Debug.Log("Press");}
}

3.多设备支持与手柄震动实现

注意创建InputAction的Action时需要选择Action Type为Pass Through,否则多设备连接使用时存在问题。

代码示例---多设备管理器

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;/// <summary>
/// 输入设备数据
/// </summary>
[System.Serializable]
public class InputSystemMultiData
{public int Index;               //0public InputDevice Device;      //输入设备public Action OnJump;           //jump事件public Vector2 MoveMentData;    //移动值public InputSystemMultiData(int index, InputDevice device){Index = index;Device = device;}
}/// <summary>
/// 多人手柄
/// </summary>
public class InputSystemMultiManager : MonoBehaviour
{/// <summary>/// 单例/// </summary>public static InputSystemMultiManager Instance;/// <summary>/// 存储已接入的输入设备/// </summary>public List<InputSystemMultiData> InputSystem_MultiDatas = new List<InputSystemMultiData>();/// <summary>/// 创建的InputAction/// </summary>private MyInputAction myInputAction;private void Awake(){Instance = this;myInputAction = new MyInputAction();//将InputAction中的Movement和Jump添加监听myInputAction.GamePlay.Movement.performed += OnMovement;myInputAction.GamePlay.Jump.performed += OnJump;myInputAction.Enable();}/// <summary>/// 通过index获取设备数据/// </summary>/// <param name="index"></param>/// <returns></returns>public InputSystemMultiData GetDataByIndex(int index){//查找存储设备中满足条件的设备数据var data = InputSystem_MultiDatas.Find(a => a.Index == index);return data;}/// <summary>/// 获取设备Index/// </summary>/// <param name="device">原设备</param>/// <returns></returns>public int GetIndex(InputDevice device){//查找设备是否已存储var data = InputSystem_MultiDatas.Find(a =>a.Device.deviceId == device.deviceId);if(data != null) return data.Index;//新建设备并存储InputSystemMultiData multiData = new InputSystemMultiData(InputSystem_MultiDatas.Count, device);InputSystem_MultiDatas.Add(multiData);return multiData.Index;}/// <summary>/// 跳跃的监听/// </summary>/// <param name="context"></param>private void OnJump(InputAction.CallbackContext context){//获取输入设备InputDevice device = context.control.device;//获取设备idint index = GetIndex(device);//执行设备(自定义)中的跳跃方法InputSystem_MultiDatas[index].OnJump?.Invoke();}/// <summary>/// 移动的监听/// </summary>/// <param name="context"></param>private void OnMovement(InputAction.CallbackContext context){//获取输入设备InputDevice device = context.control.device;//获取设备idint index = GetIndex(device);//给设备(自定义)中的移动数据赋值InputSystem_MultiDatas[index].MoveMentData = context.ReadValue<Vector2>();}private void OnDestroy(){myInputAction.Disable();}
}

使用示例

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor.Rendering.LookDev;
using UnityEngine;
using UnityEngine.InputSystem;public class InputSystemMultiBall : MonoBehaviour
{public int Index = -1;private InputSystemMultiData Data = null;private Rigidbody rigidbody;private void Awake(){rigidbody = GetComponent<Rigidbody>();Data = null;}private void Update(){if(Data == null){//获取设备数据Data = InputSystemMultiManager.Instance.GetDataByIndex(Index);if (Data != null){//添加跳跃方法Data.OnJump += OnBallJump;}elsereturn;}//移动rigidbody.AddForce(new Vector3(Data.MoveMentData.x, 0, Data.MoveMentData.y) * 5 * Time.deltaTime, ForceMode.Impulse);}/// <summary>/// 跳跃/// </summary>private void OnBallJump(){rigidbody.AddForce(Vector3.up * 5f, ForceMode.Impulse);//开启协程-让手柄震动StartCoroutine(StartShockCoroutine());}/// <summary>/// 手柄震动/// </summary>/// <returns></returns>private IEnumerator StartShockCoroutine(){//判断是否为手柄输入设备if (Data.Device is Gamepad == false)yield break;Gamepad gamepad = Data.Device as Gamepad;//设置手柄马达转速(低频,高频)gamepad.SetMotorSpeeds(0.3f, 0.9f);//持续时间yield return new WaitForSeconds(1);//时间到设置手柄马达停止gamepad.SetMotorSpeeds(0, 0);}
}

4.修改绑定按键并保存

代码

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;public class InputSystemRebindBall : MonoBehaviour
{/// <summary>/// 跳跃的Action/// </summary>public InputActionReference JumpAction;/// <summary>/// 显示文本/// </summary>public Text RebindText;/// <summary>/// 玩家输入/// </summary>private PlayerInput playerInput;private Rigidbody rigidbody;public Button rebindBtn;private void Awake(){rigidbody = GetComponent<Rigidbody>();playerInput = GetComponent<PlayerInput>();}void Start(){//读取保存的按键输入数据string json =  PlayerPrefs.GetString("InputActions", null);//加载保存的按键输入数据并应用if (!string.IsNullOrEmpty(json))playerInput.actions.LoadBindingOverridesFromJson(json);//显示当前绑定的按键名称,InputControlPath.HumanReadableStringOptions.OmitDevice表示去除设备名称RebindText.text = InputControlPath.ToHumanReadableString(JumpAction.action.bindings[0].effectivePath,InputControlPath.HumanReadableStringOptions.OmitDevice);rebindBtn.onClick.AddListener(RebindKey);}/// <summary>/// 跳跃,使用PlayerInput添加event进行绑定/// </summary>public void OnJump(){rigidbody.AddForce(Vector3.up * 5f, ForceMode.Impulse);}/// <summary>/// 修改绑定的按钮/// </summary>public void RebindKey(){//先切换到其他行为方案playerInput.SwitchCurrentActionMap("UI");RebindText.text = "请输入新键...";//PerformInteractiveRebinding进行改键//WithControlsExcluding剔除鼠标操作//OnComplete改建完成执行//Start开始改键JumpAction.action.PerformInteractiveRebinding().WithControlsExcluding("Mouse").OnComplete(operation =>{Debug.Log("Change Key");//显示改键后按键名称RebindText.text = InputControlPath.ToHumanReadableString(JumpAction.action.bindings[0].effectivePath, InputControlPath.HumanReadableStringOptions.OmitDevice);//将operation释放operation.Dispose();//切换为原行为方案playerInput.SwitchCurrentActionMap("GamePlay");//保存改键信息string json = playerInput.actions.SaveBindingOverridesAsJson();PlayerPrefs.SetString("InputActions", json );}).Start();}
}

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

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

相关文章

LeetCode 接雨水 双指针

原题链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题面&#xff1a; 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a…

CSS实现围绕按钮边框转圈的光线效果

CSS实现围绕按钮边框转圈的光线效果&#xff0c;可以自由改变按钮的光线渐变颜色和按钮边框颜色&#xff0c;背景色等。 效果图&#xff1a; 实现完整代码&#xff1a; <template><view class"btnBlock"><view class"btnBian"></vi…

win11怎么查看之前连过的wifi密码

首先进入到设置 然后就可以看到之前连接过的WIFI&#xff1a; 选一个想要知道密码的WIFI点进去看到如下页面&#xff1a; 然后点击“显示”即可查看密码

Redis 数据类型底层原理

String 内部编码有三种&#xff1a;int、embstr、raw int&#xff1a;如果一个字符串对象保存的是整数值&#xff0c;并且这个整数值可以用 long类型来表示(不超过 long 的表示范围&#xff0c;如果超过了 long 的表示范围&#xff0c;那么按照存储字符串的编码来存储&#xf…

kafka安装部署,和基本操作

kafka下载地址&#xff1a;Apache Kafka 我这里下载3.5.1 ​ 2、通过rz命令上传到linux服务器 3、解压 tar -zxvf kafka_2.12-3.5.1.tgz 4、在config目录下修改配置文件server.properties 主要修改这两处&#xff1a; #监听的端口advertised.listenersPLAINTEXT://自己…

java spring cloud 企业电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

uniapp实现表格冻结

效果图如下&#xff1a; 思路&#xff1a; 1.由于APP项目需要&#xff0c;起初想去插件市场直接找现成的&#xff0c;结果找了很久没找到合适的&#xff08;有的不支持vue2有的不能都支持APP和小程序&#xff09; 2.后来&#xff0c;就只能去改uni-table源码了&#xff0c;因…

【面试高高手】——Spring(12题)

文章目录 1.Spring是什么&#xff1f;2.为什么需要Spring?3.说下你对Spring的AOP、IOC的理解&#xff1f;4.基于java的AOP实现有哪些&#xff1f;5.AOP的原理&#xff1f;6.如何使用Java实现动态代理?7. Spring AOP和AspectJ AOP有什么区别&#xff1f;8.SpringAOP通知类型&a…

联想详解AI导向基础设施 “软硬一体”赋能四大场景

9月25日&#xff0c;联想在杭州举办以“全栈智能 全程陪伴”为主题的新IT思享会&#xff0c;集中展示了联想基于新IT架构的全栈智能产品与服务&#xff0c;引领行业智能变革的强大实力。 当前&#xff0c;以ChatGPT为代表的AI模型席卷全球&#xff0c;不仅实现了AI技术质变性突…

电路常见的通信接口

1,TTL/232/485/422简介 串口 串口通信(Serial Communication)&#xff0c; 是指外设和计算机间&#xff0c;通过数据信号线 、地线、控制线等&#xff0c;按位进行传输数据的一种通讯方式。是我们在硬件调试过程中最常见的一种通信方式。比如开发板和电脑之间&#xff0c;想要…

如何更改注册表使系统暂停更新时间延长

1、创建一个文本文件&#xff0c;命名为&#xff1a;“stopupdate.reg”&#xff0c;然后用记事本或者代码编辑器打开&#xff0c;复制以下代码&#xff1a; Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings] "F…

高手必备!电脑剪辑视频的实用方法

随着数码时代的到来&#xff0c;越来越多的人开始使用电脑剪辑视频。电脑剪辑视频不仅可以为日常生活留下美好回忆&#xff0c;还可以为专业人士提供更多的创作可能性。在本文中&#xff0c;我们将介绍两种电脑剪辑视频的方法&#xff0c;不需要专业技能&#xff0c;只需要一台…

嵌入式MCU都有什么高级用法?

嵌入式MCU都有什么高级用法&#xff1f; 您举的几个例子&#xff0c;确实是MCU外设的一些高端玩法。只是不知道您是否想过&#xff0c;既然这些机制是被 人设计出来的&#xff0c;那它就是种标准用法。从微控制器的发展历程来看&#xff0c;许多硬件机制都是有了实际 需求后才…

工业RFID识别设备可以在哪些行业应用?

工业识别设备主要是用于工业领域的RFID读写设备&#xff0c;它可以在产线、工厂、仓储物流等领域应用&#xff0c;非接触的实时读取标签信息&#xff0c;并且将读取的信息上传到电脑信息管理系统中。 工业RFID识别设备可以在哪些行业应用? 1、汽车行业 汽车制造业的产品结构复…

USB转换方案介绍

随着科技的不断发展&#xff0c;我们的生活中出现了越来越多的电子设备。然而&#xff0c;这些设备通常具有不同的连接端口和协议&#xff0c;这可能会使它们之间的连接变得困难。这时候&#xff0c;使用USB转换就成为了一种非常方便和实用的解决方法。 无论是在家庭、办公室还…

网络编程day03(UDP中的connect函数、tftp)

今日任务&#xff1a;tftp的文件上传下载&#xff08;服务端已经准备好&#xff09; 服务端&#xff08;已上传&#xff09; 客户端&#xff1a; 代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h…

vue实现进度条+背景定位

最近在做一个数字孪生项目&#xff0c;用于展示地铁车辆的进场动画及部件&#xff0c;使用的vueunity&#xff0c;但是 unity模型在加载完成之前会有个加载进度条&#xff0c;页面背景色是黑色&#xff0c;中间只有个一进度条框 可以看到很单调很丑&#xff0c;并且客户也不满…

Linux上的Pip和Python升级指南

在Linux系统上&#xff0c;保持Pip和Python版本的最新状态对于顺利进行Python开发至关重要。通过升级Pip和Python&#xff0c;你可以享受到最新的功能、修复的bug以及提升的开发效率。本文将为你提供在Linux上升级Pip和Python的详细指南&#xff0c;助你打造更强大的开发环境。…

✔ ★ 算法基础笔记(Acwing)(六)—— 贪心【java版本】

贪心 一、 区间问题1. 区间选点2. 最大不相交区间数量3. 区间分组(用 堆top 代表区间 头头)POJ3614Sunscreen(优先队列贪心) 4. 区间覆盖 二、哈夫曼树1. 合并果子 三、排序不等式1. 排队打水 四、绝对值不等式货仓选址 五、推公式耍杂技的牛 一、 区间问题 1. 区间选点 原题…

气传导和骨传导耳机哪个好?气传导耳机好用吗?气传导耳机推荐

​气传导和骨传导耳机都是不入耳设计&#xff0c;骨传导是通过振动颅骨传达声音信号 骨传导耳机是一种能够通过振动颅骨来传达声音信号的耳机&#xff0c;其原理是利用骨传导技术&#xff0c;将声音信号通过颅骨传达到内耳&#xff0c;从而实现听觉效果&#xff0c;不过长时间佩…