UnityVR--插件1--新版InputSystem

news2024/11/24 20:12:11

目录

新版的InputSystem

安装新版InputSystem插件

配置新的InputSystem

在项目中配置新版输入方式实现移动和开火

添加并绑定移动事件

添加并绑定开火事件

总结(啰嗦几句)


新版的InputSystem

  在最初的Unity系统中,只有键盘、鼠标、操作手柄等常见的输入设备,但随着数码产品的不断升级,越来越多的输入方式出现在游戏使用过程中,比如手机、XBox、switch,还有VR、AR设备等,因此旧的InputSystem已经不再方便,新的InputSystem应运而生。并且,新的InputSystem运基于事件中心的设计方式,将输入设备与动作逻辑相分离,而通过配置、映射对输入信息进行处理,更符合我们现在的项目设计理念。

安装新版InputSystem插件

  在前面的文章中我们多次使用到了Input.GetAxis("Mouse X")等方法,这些都是在Unity自带的Input Manager中设置的(位置:Edit->ProjectSettings->InputManager)

   新版的InputSystem可以在Window->PackageManager中,选择UnityRegistry,在列表中找到InputSystem,点击安装,等待自动安装进度即可:

   下载完成后,Unity会自动安装并重启,在Packages文件夹中就能看到InputSystem:

  安装完成后,在有些组件使用时需要重新设置一下,比如在使用UI控件时,UI的EventSystem会显示一个警告,只要点击按钮,同意使用新版的InputSystem即可:

在PackageManager->InputSystem中,还有许多的示例可以下载参考:

配置新的InputSystem

  1. 在菜单Edit->ProjectSettings中,选择Player->OtherSettings->Configuration->Active Input Handling* 中可以选择使用老版还是新版的InputSystem,如果两者都需要,可以选择"Both"

   2. 在同一面板中,选择“InputSystemPackage”,点击“Create settings asset”按钮,这样在Assets文件夹下就会新建一个InputSystem.inputsettings的配置文件,在InputSystemPackage面板中的设置将会被记录在这个文件中

   

在项目中配置新版输入方式实现移动和开火

  1. “Player Input”组件:在场景的空节点上点击“Add Component”按钮,挂载“Player Input”组件。建议挂载在SingleMono上,这是挂载所有Mono单例的脚本的节点,它在场景切换时不会被消除,详见(单例

 2. 新建配置文件:在放Input脚本的文件夹上点右键,"Create->Input Actions(最下面)",将新建的配置文件设置一个名字,这里叫做“Input Controls”,然后点击“Edig asset”配置文件。

 

   3. 配置Player移动的输入:在弹出的面板中“ActionMap”按“+”号,新建一个输入配置的组,可以根据需要修改名称,这里改成了”PlayerMap“。在右边的"Action"栏中就是管理各种移动、开火、点击等输入的配置,也可以根据需要修改"New Action"的名字:

   4. 绑定输入,这里以主角在场上的移动为例,它的移动是在XZ平面上的,因此要添加一个二维向量的输入,获取输入的数值。在右边的“Action Type”中,选择类型为"Value",下面的“Control Type”为Vector2

 

  5. 点击"Action->Move"右边的“+”号,添加绑定一个监听“Add Positive\Negative Binding”,会加入一个“2DVector”的项目:

  自动会在“2D Vector”下面出现上、下、左、右四个方向的绑定。在右边的Path下拉菜单中,可以看到各种输入设备,根据需要选择合适的输入,有摇杆、键盘、鼠标……直接在搜索栏中输入按键即可,这里还是使用W按键:

 

   6. 按照同样的方式设置开火fire。开火只要一个按钮按下即可,所以“Action Type”选择为“Button"即可,这里开火按钮设置为Space按键:

 7. 设置完成后,保存并退出。将SingleMono节点上的”Player Input“组件的"Action"设置为上面配置好的InputControls文件。

   在DefaultMap中可以看到上面配置完成的PlayerMap这一项,现在它是默认的输入项目。

 添加并绑定移动事件

   (设置方式与UI中的按钮监听事件比较相同)

  1. 在"PlayerInput"组件的下方,设置事件“Event”。这里能够看到上面设置的"Move"和"Fire"两个输入响应的项目。分别点击这两个项目下面的+号,然后绑定脚本中设置的相应事件:

   2. 在脚本中注册并发送事件,以主角移动为例。

    关于事件的概念以及事件中心的建立详见(事件中心、InputManager),这里不再赘述。仅记录一下关于主角移动,如何以监听事件的方式发送移动数据和实现移动。

  (1)修改之前写的HeroMove.cs(组件2--Rigidbody--移动控制),这是挂在主角身上控制主角移动的脚本,在其中注册一个移动事件,并发送数据(移动位置的二维向量)

public class HeroMove : MonoBehaviour
{
    private Rigidbody rb;
    private Vector2 moveInput;
    private Vector3 movement;
    private Quaternion targetRotation;
    public float moveSpeed = 2;
    public float rotateSpeed = 2;
    GameObject Bullet;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        //增加
        EventManager.Instance.AddEvent(EventType.OnPlayerMove, this, data =>
        { //注册一个移动的事件,这个事件由InputManager中的OnMove发送给
          //场景中的PlayerInput绑定监听
            var eventData = data as EventDataPlayerMove;
            moveInput= eventData.position; //传递移动时的XZ方向的位置
        });
    }

    void FixedUpdate()
    {
        //删除:
        //moveInput = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical")); //坐标数据不再由Input.GetAxis获得
        //下面都一样
        movement.Set(moveInput.x, 0, moveInput.y);//坐标数据通过事件数据发送
        movement.Normalize();
        //检测是否有输入
        bool hInput = !Mathf.Approximately(moveInput.x, 0);
        bool vInput = !Mathf.Approximately(moveInput.y, 0);
        if (hInput || vInput)
        {
            movement = Quaternion.Euler(0, Camera.main.transform.eulerAngles.y, 0) * movement;
        }
        Vector3 lookForward = Vector3.RotateTowards(transform.forward, movement, rotateSpeed * Time.fixedDeltaTime, 360);
        targetRotation = Quaternion.LookRotation(lookForward);
        rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime);
        rb.MoveRotation(targetRotation);
    }
}

  (2)另外,新建脚本(或直接在InputManager.cs中)添加发送事件。(其中关于SendEvent、EventType、InputManager等定义详见事件中心、InputManager

public class InputManager : SingleMono<InputManager>
{
    //定义移动和开火的事件
    public void OnMove(InputAction.CallbackContext context)
    {//绑定新版InputSystem中的PlayerMap-Move事件
        EventManager.Instance.SendEvent(EventType.OnPlayerMove, new EventDataPlayerMove()
        {
            position=context.ReadValue<Vector2>()
        });
    }
    public void OnFire(InputAction.CallbackContext context)
    {//绑定新版InputSystem中的PlayerMap-Fire事件
        EventManager.Instance.SendEvent(EventType.OnPlayerFire, null);
    }
}

  3. 将上面这个InputManager.cs挂载在场上的单例节点上(所有继承SingleMono的脚本都挂在这里,详见单例

  4. 把挂有发送事件的脚本(现在是InputManager.cs)的节点(SingleMono)拖到Object这栏:

   并在监听的函数这栏点小三角形,选脚本名称,就看到上面已经定义好的两个监听函数,这里控制的是移动,因此选择“OnMove”函数:

 

 添加并绑定开火事件

  1. 注册一个开火事件:随便新建一个脚本,挂载在主角身上(其他GO也可以),在其中注册一个事件,并设置回调callback

public class BulletFireEvent : MonoBehaviour
{
        public GameObject bullet;
        void Start()
        {
            EventManager.Instance.AddEvent(EventType.OnPlayerFire, this, callback =>
            {
                bullet = Resload.Instance.LoadPrefab("Bullet");//从资源库加载
                bullet.SetActive(true);
                //赋予子弹初始值和角度
                bullet.transform.position = transform.position;
                bullet.transform.rotation = transform.rotation;
                Destroy(bullet, 2);//2秒后销毁
            });
        }
    }

  2. 与上面设置OnMove函数一样,在Event->PlayerMap->Fire中设置OnMove函数:

总结(啰嗦几句)

  1. 按上面的设置,运行的效果与没有使用新版InputSystem和事件中心是一样的,所以就不在放运行结果的图了;

  2. 上面的脚本使用的是自定义的事件中心(EventManager),这是项目设计中的重要一环(详见EventManager--事件中心),当然也可以使用Unity定义的事件管理;

  3. 在PlayerInput中的监听函数设置,也可以在脚本中完成,与UI系统中的按钮监听是很相似的;

  4. 需要其他功能,可以到Windows->PackageManager->InputSystem中下载示例,参照它的设置方式;

  5. 使用InputSystem的优点:原先我们在制作第一人称控制器时,用了很多的if来拿到输入按键(详见第一人称控制器),如果在项目中需要多次使用键盘输入,就有可能需要修改多处键盘按键,而使用InputSystem只要在面板中直接修改输入方式的定义即可,非常方便!

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

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

相关文章

html实现好看的浪漫爱情回忆录(附源码)

文章目录 1.设计来源1.1 主界面1.2 主题描述1.3 照片墙详细界面1.4 相关跳转界面 2.效果和源码2.1 效果演示2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/130946811 html实现好看的浪漫爱情回忆录…

Unity发布WebGL报错il2cpp.exe did not run properly

解决&#xff1a;路径中不能有任何中文&#xff0c;包括用户名都不能是中文 win10修改用户名为英文&#xff1a; 1、开启administrator账户。 1&#xff09;、右键我的电脑&#xff0c;选择管理。 2&#xff09;、本地用户和组—用户—Administrator 3&#xff09;、右键—属性…

C++11新特性:decltype类型推导

上一节所讲的 auto&#xff0c;用于通过一个表达式在编译时确定待定义的变量类型&#xff0c;auto 所修饰的变量必须被初始化&#xff0c;编译器需要通过初始化来确定 auto 所代表的类型&#xff0c;即必须要定义变量。若仅希望得到类型&#xff0c;而不需要(或不能)定义变量的…

yum安装最新版的PHP、MySQL

本地环境&#xff1a;AlmaLinux9.2 在阿里的镜像源站点有一个叫remi的源&#xff0c;这个源专门提供了php的各种版本&#xff0c;目前这个源只针对Redhat、Centos和Fedora系统 Remi镜像简介 Remi镜像主页 配置Remi镜像源 这里以Enterprise Linux 9 为例 配置向导 根据配置向…

关于机器人状态估计(15)-VIO与VSLAM精度答疑、融合前端、主流深度相机说明与近期工程汇总

VIOBOT种子用户有了一定的数量&#xff0c;日常大家也会进行交流&#xff0c;整理总结一下近期的交流与答疑。 VIO-SLAM(作为三维SLAM&#xff0c;相对于Lidar-SLAM和LIO-SLAM)在工程上落地的长期障碍&#xff0c;不仅在算法精度本身&#xff0c;还有相对严重的鲁棒性问题&…

【Linux】iptables防火墙

文章目录 一、Linux防火墙基础1.Linux防火墙概术2.netfilter/iptables3.四表五链4.规则链之间的匹配顺序 二、iptables 安装1.常用的控制类型2.常用的管理选项 三、示例演示1.添加新的规则2.查看规则列表3.删除规则4.清空规则 四、规则的匹配1.通用匹配2.隐含匹配3.显式匹配 一…

浅谈安科瑞无线测温技术在大功率整流器上的应用

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要&#xff1a;随着整流器运行电流的增加 &#xff0c;运行温度成为影响整 流器安全运行的主要因素 。针对目前大功率整流器运行温度通过出口水温表和纽扣继电器来监测 &#xff0c;运行人员不能及时、准确地掌握整…

【测试开发】第四节.测试开发(测试分类)

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;Java测试开发 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录 前…

程序员有哪些绝对不能踩的坑?

本文概要 程序员编写高质量、可维护、安全且高效的代码&#xff0c;通常需要大量研究和经验。但也需要避免许多技术陷阱。一起来聊聊程序员有哪些绝对不能踩的坑吧&#xff01; &#x1f31f;&#x1f31f;&#x1f31f;个人简介&#x1f31f;&#x1f31f;&#x1f31f; ☀️…

Spring Boot拦截器与过滤器的区别

Spring Boot拦截器与过滤器的区别 在使用Spring Boot开发Web应用程序时&#xff0c;您可能需要在处理请求之前或之后执行某些操作。这些操作可以包括身份验证、日志记录、性能监测等。在这种情况下&#xff0c;您可以使用两种不同的机制&#xff1a;拦截器和过滤器。本文将介绍…

Spring Boot如何实现缓存的自动刷新

Spring Boot如何实现缓存的自动刷新 在Web应用程序中&#xff0c;缓存是提高性能的重要手段之一。在Spring Boot应用程序中&#xff0c;我们可以使用Spring Cache来实现缓存功能。然而&#xff0c;当缓存的数据发生变化时&#xff0c;我们可能需要手动刷新缓存&#xff0c;这可…

C语言---分支和循环语句

1、什么是语句 C语言语句可以分为五类&#xff1a; 表达式语句函数调用语句控制语句复合语句空语句 C语言有九种控制语句 可以分成一下三类&#xff1a; 条件判断语句也叫分支语句&#xff1a;if语句&#xff0c;switch语句&#xff1b;循环执行语句&#xff1a;do while语…

基于html+css的图展示100

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

安卓手机使用Termux搭建Hexo个人博客网站【内网穿透公网访问】

文章目录 1. 安装 Hexo2. 安装cpolar内网穿透3. 公网远程访问4. 固定公网地址 转载自cpolar极点云的文章&#xff1a;安卓手机使用Termux搭建Hexo个人博客网站【内网穿透公网访问】 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章&#…

Ansible基础1——介绍安装、清单文件、配置文件、临时命令参数、常用功能模块

文章目录 一、发展起源1.1 自动化工具对比1.2 Ansible介绍 二、安装流程2.1 安装清单2.2 系统初始化2.3 安装验证 三、清单文件3.1 默认静态清单3.2 自定义静态清单 四、配置文件4.1 优先级4.2 配置参数4.2.1 [defaults]配置4.2.2 [privilege_escalation]配置4.2.3 其他配置 4.…

C++ new delete

可执行程序(进程) 的虚拟地址空间: 内核: 操作系统 栈区:函数的形参&#xff0c;非静态的局部变量&#xff0c;函数现场保护数据等等&#xff0c;栈是向下增长的。 共享库的内存映射区域:用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存&#xff0c;做进程间通…

四足机器人A1目标跟踪

四足机器人A1目标跟踪 前期准备工作1.安装TeamViewer2.将四足机器人所有线连接好3.将四足机器人调至运动模式 运行流程1.开机阶段2.运行阶段 效果展示代码配置 前期准备工作 1.安装TeamViewer 由于外接屏幕损坏&#xff0c;故四足机器人内部配置了TeamViewer&#xff0c;因此…

VM——编写脚本,TCP发送16进制字符串

1、参考&#xff1a; &#xff08;1&#xff09;​​​(246条消息) TCP中发送接收16进制数&#xff08;16进制字符串与字节数组之间的转换&#xff09;_tcp发送16进制字符串_start_continue的博客-CSDN博客 &#xff08;2&#xff09;(246条消息) C#byte String转换_c# byte转…

【网络编程二】UDP与TCP协议你学会了吗~

目录 &#x1f31f;需要知道 1、什么是网络编程&#xff1f; 2、怎么进行网络编程&#xff1f; 3、TCP与UDP的区别&#xff1f; &#xff08;面试题&#xff09; &#x1f31f;一、UDP &#x1f308;1、UDP数据报套接字编程 &#x1f308;2、实现一个简单的UDP回显服务…

java服务端如何接入WebSocket?

日常工作中&#xff0c;我们都是使用http请求&#xff0c;来进行前后交互&#xff0c;那么我们也会有使用websocket来进行前后交互的时候&#xff0c;那么它俩有什么区别呢&#xff1f; http和websocket区别 WebSocket是双向通信协议&#xff0c;模拟Socket协议&#xff0c;可…