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

这篇具有很好参考价值的文章主要介绍了【Unity_Input System】Input System新输入系统(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、导入Input System包

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

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

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

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


一、导入Input System包

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

unity新inputsystem,Unity,unity,游戏引擎

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

unity新inputsystem,Unity,unity,游戏引擎

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

  • 选择输入管理器(旧)代表仅启用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)
        {
            //获取当前Gamepad
            var 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");
        //需要手动启用Action
        moveAction.Enable();
        //需要手动启用Action
        jumpAction.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组件

unity新inputsystem,Unity,unity,游戏引擎

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

unity新inputsystem,Unity,unity,游戏引擎

第三步:设置Input Action Asset

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

unity新inputsystem,Unity,unity,游戏引擎

其中:

  • 最左边的模块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)

unity新inputsystem,Unity,unity,游戏引擎

1>Send Messages

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

unity新inputsystem,Unity,unity,游戏引擎

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

public void OnMove()
{

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

unity新inputsystem,Unity,unity,游戏引擎

2>Broadcast Messages

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

3>Invoke Unity Events

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

unity新inputsystem,Unity,unity,游戏引擎

using UnityEngine;
using UnityEngine.InputSystem;

public class M3_UsePlayerInputComponent : MonoBehaviour
{
    public void OnMove()
    {

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

unity新inputsystem,Unity,unity,游戏引擎

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,点击应用

unity新inputsystem,Unity,unity,游戏引擎

第三步:在代码中创建上面的类的实例,并从该实例获取输入文章来源地址https://www.toymoban.com/news/detail-719620.html

using UnityEngine;
using UnityEngine.InputSystem;

public class M4_GenerateScripts : MonoBehaviour
{
    private MyAction inputActions;
    void Start()
    {
        //创建一个实例
        inputActions = new MyAction();
        //启用Player分组里面的Actions
        inputActions.Player.Enable();
        //事件
        inputActions.Player.Fire.performed += Fire_performed;
    }

    private void Fire_performed(InputAction.CallbackContext obj)
    {
        Debug.Log("Fire");
    }
}

到了这里,关于【Unity_Input System】Input System新输入系统(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第五十二章 Unity Input System 新输入系统

    新输入系统InputSystem是2019年Unity新推出的插件。请注意,Unity默认使用旧的Input Manager,新的Input System处于未启用状态。当你安装Input System组件时,Unity会询问你是否启用新的输入系统。如果你选择Yes,Unity会启用新的并禁用旧的,之后编辑器将重新启动。具体的操作是,打开包

    2024年02月07日
    浏览(26)
  • Unity VR:XR Interaction Toolkit 输入系统(Input System):获取手柄的输入

    输入系统是 VR 应用中非常重要的一部分。我们通常需要获取 VR 手柄上某个按键的输入,然后将其作用到应用中,比如按下手柄的 Grip 键进行抓取。在我的其他 Unity XR Interaction Toolkit 的开发教程里,已经有介绍如何去获取手柄的输入。那么这篇教程我将做一个总结,将相关的

    2024年02月12日
    浏览(28)
  • 【Unity InputSystem】实用教程-实现角色移动跳跃功能(Input System在PC端鼠键!手机端触摸屏!主机手柄!三端使用教程)

    在上一篇文章当中我们手把手的跟大家分享了InputSystem的基础操作(如何使用5种不同的方式获取到InputSystem种的输入检查信息)。那么接下来我们继续分享一下在我们获取到InputSystem输入信息后,如何使用检测到的信息实现我们对应的输入功能。 本次我们使用的Unity编辑器版本为

    2024年02月11日
    浏览(41)
  • Unity全新的输入系统InputSystem

    在Unity中,默认使用的是旧的输入管理器(InputSystemOld) 在脚本中,利用Input类可以获得用户的输入操作,以及访问移动设备的多点触控或加速感应数据,Input类可以读取输入管理器中设置的按键,在Updata函数中监测用户的输入。 1.虚拟轴 在项目设置中可以看到虚拟轴的相关设

    2024年02月05日
    浏览(42)
  • Unity之新版输入系统InputSystem入门

    最近Unity版本全面升级到Unity2021了,着色器也全面使用URP,接下来毫无疑问,输入系统也要全面升级InputSystem,这也是Unity官方希望我们做的,毕竟现在都2023年了,我们的技术是需要跟上时代的步伐。 老版本的InputSysten系统,其实就一个Input静态类,官方给我们预定了一些常用

    2024年02月16日
    浏览(30)
  • unity新输入系统的简单使用(New InputSystem)

    1、在包管理器 unity注册表中下载安装InputSystem 2、给玩家添加组件PlayerInput,点击CreatAction,创建一个InputAct InputAct,这是玩家的输入文件,在里面可以设置玩家输入 3、使用 例如玩家控制角色移动 在InputAct中,默认已经设置好了移动的输入 这里是一个二维向量值 W(0,1)A(-1,0)S(0,-

    2024年02月13日
    浏览(28)
  • Unity使用新输入系统InputSystem制作飞机大战Demo

    @作者 : SYFStrive @博客首页 : HomePage 📌: 个人社区(欢迎大佬们加入) 👉: 社区链接🔗 📌: 觉得文章不错可以点点关注 👉: 专栏连接🔗 💃: 程序员每天坚持锻炼💪 👉 飞机大战专栏 (🔥) 使用Unity创建3D Object 👉 Quad 如 👇 注意❗:背景图片的WrapMode模式改为 Rep

    2024年02月02日
    浏览(35)
  • Unity之新版输入系统InputSystem如何自定义InputActions

    上一篇文章,我们介绍了如何使用新版本的InputSystem,我们知道了InputActionsAsset给我们提供了更多的灵活性,扩展性和复用性。那么这篇文章我们就来介绍一下如何创建自定义InputActionAsset Input Action Asset 包含输入 Actions及其关联的Bindings和Control Schemes 的资源。这些资源文件扩展

    2024年02月11日
    浏览(38)
  • Unity使用新输入系统InputSystem制作飞机大战Demo(后处理配置、子弹的发射……)

    @作者 : SYFStrive @博客首页 : HomePage 📌: 个人社区(欢迎大佬们加入) 👉: 社区链接🔗 📌: 觉得文章不错可以点点关注 👉: 专栏连接🔗 💃: 程序员每天坚持锻炼💪 👉 飞机大战专栏 (🔥) 单例模式是1种设计模式:👉(Design pattern)代表了最佳的实践,通常被有经

    2024年01月22日
    浏览(34)
  • Unity使用新输入系统InputSystem制作飞机大战Demo(对象池设计模式及应用)

    @作者 : SYFStrive @博客首页 : HomePage 📌: 个人社区(欢迎大佬们加入) 👉: 社区链接🔗 📌: 觉得文章不错可以点点关注 👉: 专栏连接🔗 💃: 程序员每天坚持锻炼💪 👉 飞机大战专栏 (🔥) 单例模式是1种设计模式:👉(Design pattern)代表了最佳的实践,通常被有经

    2024年01月23日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包