【Unity InputSystem】基础教程(保姆级超详细超基础!!!)

2023-11-14

1.基础概念

1-1.前言

随着Unity的不断发展,开发者们对Unity的项目输入系统要求也越来越高,经常会有项目在做多平台适配和跨平台移植时对变更输入系统而感到烦恼。而InputSystem这款插件正是Unity官方为了解决广大开发者而推出的一款新的输入方式。
相较于旧版的InputManager,InputSystem的操作虽然更为繁琐复杂,但应对跨平台项目时面对不同的输入方式InputSystem的输入映射机制则为开发者们提供了巨大的便捷,这也是我们要学习InputSystem的原因。

如果觉得图文教程不够详细的朋友可以移步到 【InputSystem基础教程】观看视频教程。

2.基础操作

2-1插件安装

1.我们打开Unity上方工具栏中的Window =>Package Manager打开Unity插件包管理界面请添加图片描述
2.点击右上角Package选项中Unity Registry,然后在右侧搜索栏中搜索Input
在这里插入图片描述
3.找到InputSystem插件,点击安装
在这里插入图片描述

2-2.如何创建InputActions

1.安装插件后在项目Project中右键点击Creater若出现InputActions选项证明插件安装成功,点击创建InputActions。
请添加图片描述
2.创建InputActions成功后双击打开InputActions编辑页面,此时我们有几个参数需要了解并使用的。

2-3.InputActions概念及结构关系

在我们InputSystem中所用到结构关系为
InputSystem=>InputActions=>ActionMaps=>Actions

ActionMaps

简单来说我们可以将InputActions视为我们项目里其中一个控制器的输入操作管理集,而ActionMaps则为该控制器其中的一个输入映射集。
在这里插入图片描述

Actions

而Actions则为ActionMaps里其中一个动作输入映射

ActionProperties

在Actions中也有许多参数,其中ActionType则是我们最常用到。其概念为我们该动作输入映射的类型,有以下三种类型
请添加图片描述
1.Button 默认设置,包括按钮或者按键触发的一次性动作
2.Value 提供一种连续状态变化事件,如果设置了多个输入,就会切换到最主要的一个。用它进行模拟控制,比如移动。
3.Pass Through 和Value很相似,但它不会像Value一样(如果有多个输入时,不会只选择最主要的那个,而把其他的输入忽略)

在使用Value或者Pass Through Types时,你会看到一个额外的选项 Control Type为该Value的返回值类型请添加图片描述

2-4.InputActions常用实例

在我们Unity项目中输入检测做常用的两种功能实现
1.角色移动时持续输入 - Value
在我们选择ActionType为Value之后会出现Control Type,以下为常用的Control Type列举

Control Type 使用场景
Axis 仅为单轴方向数值
Vector 2 为双轴方向数值
Vector 3 为三轴方向数值

2.攻击或点击菜单栏时一次性输入 - Button

2-5.动作映射调用

官方PlayerInput组件调用

我们需要在场景中在我们需要的对象上添加PlayerInput组件
在这里插入图片描述
随后我们需要在Player组件中选定我们刚刚创建好的InputActions,选择想要使用的输入映射集,再选择对应输入参数返回的调用方式BehaviorType
在这里插入图片描述
再BehaviorType中我们有四种不同的调用方式

1.Send Message

使用Send Message时,每次的触发会盗用一个对应的函数(就是在对应的Actions名前面加个On-)正如下图所示在我们PlayerInput组件当中我们将BehaviorType选择了Send Message后我们的输入参数将会通过Send Message方法发送到我们对应生成的函数中
比如Input Action 名为 Jump,那么对应的函数即为 OnJump
在这里插入图片描述

获取输入时的数据,我们可以写一个输入控制类,在该类中调用我们上述说到的Actions生成函数
可以通过isPressed获取设置了ActionType为Button类型的动作是否点击
可以通过Get 获取设置了ActionType为Value对应类型的数据

public class PlayerController : MonoBehaviour
{
    void OnAction1(InputValue value)
    {
        bool isAction1Pressd = value.isPressed;
        Debug.Log(isAction1Pressd);
    }
    void OnMove(InputValue value)
    {
        Vector2 moveVal = value.Get<Vector2>();
        Debug.Log(moveVal );
    }
    void OnJump(InputValue value) 
    { 
        float triggerVal = value.Get<float>(); 
        Debug.Log(triggerVal );
    }
}
2.Broadcast Messages

Broadcast Messages 与 send Message 很相似(但目前我还没有搞懂具体区别)

3.Invoke Unity Events

区别于上述两种BehaviorType不同的是,在我们选择该方法后会出现Events的选项,我们需要自己写好动作方法后将其挂载到我们对应的ActionMaps中对应的ActionEvents上才能触发对应的动作事件。
在这里插入图片描述
在我们写的动作方法中需要在方法入参处加上InputAction.CallbackContext类型的入参,通过此参数我们才能获取我们对应输入返回(且加入该参数后会将其方法置顶如上图所示)

public class PlayerController : MonoBehaviour
{
    public void moveControl(InputAction.CallbackContext value)
    {
        Vector2 moveVal = value.ReadValue<Vector2>();
        Debug.Log(moveVal);
    }
}
4.Invoke C Sharp Events

与Invoke Unity Events方式其实大致相同,需要我们自己先写好一个带有InputAction.CallbackContext类型入参的动作方法,不同的是我们挂载方式变成了脚本事件加载而不是在Unity界面上的可视化挂载

using UnityEngine;
using UnityEngine.InputSystem;
public class CSharpEvent : MonoBehaviour
{
    public PlayerInput playerInput;
    void OnEnable()
    {
        playerInput.onActionTriggered += MyEventFunction;
    }
    void OnDisable()
    {
        playerInput.onActionTriggered -= MyEventFunction;
    }
    void MyEventFunction(InputAction.CallbackContext value)
    {
        Debug.Log(value.action.name + (" was triggered"));
    }
}

提示:在我自己尝试下发现上述四种的官方组件调用方式都只在输入发生时触发时发送一次输入返回,并不会持续发送,所以如果要实现输入控制角色移动这种需要持续返回输入信号功能的并不适合该方式该方式仅适合如菜单界面点击按钮或者跳跃功能这种仅需输入时触发一次返回的功能。

脚本调用

基于上述提示,所以官方PlayerInput组件调用动作事件函数时并不能满足我们所有的场景需求(也可能是我在持续返回信号上没找到解决方案),所以我们还需要学习一下不借助官方PlayerInput组件的事件调用。我们直接在我们的脚本中调用InputSystem中的动作事件。

在我们使用脚本调用之前我们需要做一件事情,在我们创建好的InputActions属性面板中找到Generate C# Class并勾选,随后点击Apply生成对应的脚本,之后我们就可以在我们自己写的PlayerController 类中调用该脚本了
在这里插入图片描述

不知道怎么说明了,直接上代码(自己看注释理解)

using UnityEngine;
using UnityEngine.InputSystem;
public class CSharpEvent : MonoBehaviour
{
    private PlayerInputActions playerInputActions;
    //将对应的ActionMaps中对应的Action进行传址引用
    public Vector2 keyboardMoveAxes => playerInputActions.keyboard.moveControl.ReadValue<Vector2>();
    
    void Awake() {
    	//实例化InputActions脚本
        playerInputActions = new PlayerInputActions();
    }
    private void OnEnable(){
    	//将要使用的ActionMap开启
        playerInputActions.keyboard.Enable();
    }
    private void OnDisable()
    {
    	//上述同理
        playerInputActions.keyboard.Disable();
    }
    private void Update()
    {
    	//在帧更新方法中调用所写的动作方法
        movePlayer();
    }
    private void movePlayer(){
    	//因为要在Update方法中使用,需要需要先判断是否有输入对应的Input操作
        if(keyboardMoveAxes != Vector2.zero){
        	//判断有输入后便执行对应方法
            Debug.Log(keyboardMoveAxes);
        }
    }
}

3.引用文献

Unity InputSystem官方使用手册

Unity input system 使用记录(实例版)- 作者 : xkxsxkx

Unity New Input System 作者 : 小虫儿飞到花丛中

以上就是本文章全部内容了,如果觉得实用可以点个收藏和关注。博主空间还有更多和Unity相关的实用技巧欢迎大家来一起相互学习。

更详细的视频教程:日醉夜的狗-【Unity】InputSystem基础教程系列

下一期InputSystem进阶实用技巧(实现角色移动跳跃等功能) 【Unity】InputSystem实用教程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Unity InputSystem】基础教程(保姆级超详细超基础!!!) 的相关文章

随机推荐

  • XSS-通关小游戏(1-20)

    在玩游戏之前先简单的了解下 什么是XSS 1 什么是xss XSS攻击全称跨站脚本攻击 是为不和层叠样式表 Cascading Style Sheets CSS 的缩写混淆 故将跨站脚本攻击缩写为XSS XSS是一种在web应用中的计算机安
  • Unity --- UGUI(Unity Graphical user interface)--- Canvas画布

    1 UI User Interface 使用者与机器之间的交互界面 1 所谓的自适应系统指的是分辨率的适应 比如在一个分辨率下做的UI放到另一个分辨率下显示时 如果没有自适应系统的话就会导致UI过大 过小 被辟成一半等等情况 而有了自适应系
  • Android:项目结构

    前言 默认情况下 在 Android Studio 中创建 Android 项目后 将默认生成 Project Packages Scratches Android Project Fines Problems Production Tes
  • 性能指标有哪些

    1 响应时间 Response time 响应时间就是用户感受软件系统为其服务所耗费的时间 对于网站系统来说 响应时间就是从点击了一个页面计时开始 到这个页面完全在浏览器里展现计时结束的这一段时间间隔 看起来很简单 但其实在这段响应时间内
  • 开源GIS浅谈

    开源GIS浅谈 转 http blog csdn net happyduoduo1 article details 51773850 谈到GIS软件 首先让我们想到的是GIS界的龙头大哥ESRI公司旗下的ArcGIS产品 从最初接触的ver
  • js中的微任务和宏任务,附面试题

    因为javascript是一门单线程语言 所以代码的解析执行都要以自上而下的执行 直到任务队列 task queue 的出现 js开始有了异步任务 当一段代码需要稍后执行时 便可以使用异步方案 setTimeout setInterval
  • Eclipse C debug报错Can‘t find a source file at “xxxxx“Locate the file or edit the source lookup path

    笔记备忘 1 操作入下 Debug configerations进入如下界面 双击你的放置器对应的选项 添加新的选项 在source位置记得添加如下选项 2 解决完上面报错还提示如下 no source for main step1 工程右
  • C++构造函数的各种用法全面解析(C++初学面向对象编程)

    文章目录 一 构造函数的基本用法 二 带参构造函数与其调用 三 拷贝构造函数 四 构造函数的重载 一 构造函数的基本用法 1 构造函数概念 一个类的对象被创建的时候 编译系统对象分配内存空间 并自动调用该构造函数 由构造函数完成成员的初始化
  • 解决:如何将pytorch的版本改为和cuda对应、如何使用笔记本电脑自带的NVIDIA使用GPU跑深度学习

    Step1 安装cuda 网址 https developer nvidia com cuda toolkit archive PS 此处必须先看看电脑显卡是否自己就装了cuda 可以通过执行命令行语句nvcc V以此检查cuda是否有 如
  • 字典表设计

    为什么字典表 存在问题 某些变量在多个地方使用 而且一般是固定的 但是随着系统升级和后期变化 可能需要改变 如果这些变量写死在代码里面将会变得难以维护 所以要将其从代码中抽离出来 一般的业务系统客户端与用户交互的时候都会使用下拉框组件 对于
  • Kafka3.0.0版本——消费者(分区的分配以及再平衡)

    目录 一 分区的分配以及再平衡 1 1 消费者分区及消费者组的概述 1 2 如何确定哪个consumer来消费哪个partition的数据 1 3 消费者分区分配策略 一 分区的分配以及再平衡 1 1 消费者分区及消费者组的概述 一个con
  • 样本的均值和方差的无偏估计与测试阶段均值方差的关系

    什么是无偏估计 估计是用样本统计量 可以理解为随机抽样 来估计总体参数时的一种无偏推断 无偏估计的要求就是 估计出来的参数的数学期望等于被估计参数的真实值 所以呢 可以看出 估计值也是一个变量 因为是随机的嘛 真实值谁也不知道啊 因为你不可
  • 数据隐藏之Qt中d指针详解

    最近看到代码有用到了Qt中的Q D指针 就去学习了下 发现真的很好用 因此写一篇文章总结下 student h class CStudent public CStudent CStudent private string m name in
  • LeetCode 1. 两数之和

    题目链接 https leetcode cn problems two sum 思路如下 从前往后遍历 n u m s nums
  • 分销系统开发 分销商城开发 分销功能 Java开发"三级分销"业务功能

    众所周知 互联网时代 分享经济现在随处可见 各行各业都有各种分销系统 最为常见的就是三级分销 那么如何实现这个业务功能了 笔者通过本篇图文案例给大家分享一下实现过程 此处以二级分级分销实现为例 1 什么是二级分销 二级分销其实是一种让用户分
  • 【面试】赢时胜和花旗

    一 赢时胜 1 springmvc的底层 DispatcherServlet gt HandlerMaping gt Handler gt HandlerAda 2 spring注入的方式 spring循环依赖 注解是否解决了循环依赖 3
  • 从setContentView到onResume应用显示过程分析

    之前总体笼统地分析了Acitivity从启动到显示的过程 Activty启动到显示的过程 一 Activty启动到显示的过程 二 发现很多细节没有注意到 后续挑些过程中比较重要的部分重点分析 在上一篇文章分析了一个app从zygote到on
  • 惠普笔记本的Windows10和Ubuntu20.04双系统安装教程

    Windows10和Ubuntu20 04双系统安装教程 1 下载Ubuntu系统镜像到D盘 2 下载安装镜像工具到D盘 3 制作Ubuntu的系统安装盘 4 磁盘分区 5 GPT分区安装Ubuntu 6 结语 7 参考资料 惠普暗影精灵使
  • Python+selenium模块爬虫实战---拉勾网

    Python selenium模块爬虫实战 拉勾网 一 项目需求 二 selenium概述 三 爬虫思路 四 代码实现 五 完整代码 一 项目需求 项目需求 实现一个可以自动获取拉钩网 自定义搜索 的岗位招聘信息的爬虫程序 实现工具 Pyc
  • 【Unity InputSystem】基础教程(保姆级超详细超基础!!!)

    InputSystem基础教程 1 基础概念 1 1 前言 2 基础操作 2 1插件安装 2 2 如何创建InputActions 2 3 InputActions概念及结构关系 ActionMaps Actions ActionPrope