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

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实用教程

猜你喜欢

转载自blog.csdn.net/JavaD0g/article/details/131027152