首页 > 其他分享 >InputSystem学习记录

InputSystem学习记录

时间:2023-09-04 18:23:50浏览次数:48  
标签:InputSystem Log 记录 void System 学习 Debug using public

安装

image.png

概念

一、创建 Input Actions

image.png

Input Actions概念及结构关系

在我们InputSystem中所用到结构关系为
InputSystem=>Input Actions=>Action Maps=>Actions

ActionMaps (表)

简单来说我们可以将InputActions视为我们项目里其中一个控制器的输入操作管理集,而ActionMaps则为该控制器其中的一个输入映射集。
9045e468c0c4075b27e3e31c2177ebef_f1c9f0648cd14deaa9467224e684cace.png

image.png

Actions (动作)

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

ActionProperties (值类型)

在Actions中也有许多参数,其中ActionType则是我们最常用到。其概念为我们该动作输入映射的类型,有以下三种类型

1.Button 默认设置,包括按钮或者按键触发的一次性动作
2.Value 提供一种连续状态变化事件,如果设置了多个输入,就会切换到最主要的一个。用它进行模拟控制,比如移动。
3.Pass Through 和Value很相似,但它不会像Value一样(如果有多个输入时,不会只选择最主要的那个,而把其他的输入忽略)

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

二、获取输入

1.直接读取装置状态

:::success
这是最简单、最直接的工作流程,但最不灵活。如果您想使用一种类型的设备快速实现,这将非常有用。如果要为用户提供多种类型的输入,或者要面向多个平台,则它可能不是最佳选择。
可以通过引用设备的控件并读取它们当前生成的值,使用如下代码直接从连接的设备读取值:
:::

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class Test1 : MonoBehaviour
{
    Gamepad gamepad; //手柄
    Keyboard keyboard; //键盘
    Mouse mouse; //鼠标
    Pointer pointer; //指针

    void Start()
    {
        gamepad = Gamepad.current; //手柄
        keyboard = Keyboard.current; //键盘
        mouse = Mouse.current; //鼠标
        pointer = Pointer.current; //指针
    }

    // Update is called once per frame
    void Update()
    {
        if (gamepad != null)
        {
            Debug.Log(gamepad.leftStick.ReadValue());//手柄遥感的偏移
            if (gamepad.bButton.wasPressedThisFrame)
                Debug.Log("按下B键");
        }
        
        if (keyboard != null)
        {
            //执行顺序 isPressed = false ->
            //按下:wasPressedThisFrame = true ->
            //中途:isPressed = true ->
            //松开:wasReleasedThisFrame = true ->
            //结束 isPressed = false
            if (keyboard.wKey.wasPressedThisFrame)
                Debug.Log("w键按下(一直按住w键的话,也只执行一次)");
            if (keyboard.wKey.wasReleasedThisFrame)
                Debug.Log("w键松开");
            Debug.Log("是否按住w键:" + keyboard.wKey.isPressed);
        }
        
        
        if (mouse != null)
        {
            Debug.Log(mouse.scroll.ReadValue());//滚轮的滚动值,向前滚Y的值为正,向后滚为负
 
            if (mouse.leftButton.wasPressedThisFrame)
                Debug.Log("按鼠标左键");
            if (mouse.rightButton.wasPressedThisFrame)
                Debug.Log("按鼠标右键");
            if (mouse.middleButton.wasPressedThisFrame)
                Debug.Log("按滚轮键");
        }
        
        
        if (pointer != null)
        {
            Debug.Log("位移量 "+pointer.delta.ReadValue());//与上一帧的偏移
            Debug.Log("在空间中的坐标 "+pointer.position.ReadValue());//在空间中的坐标
        }
    }
}

image.png
image.png

2. 使用嵌入式操作
10dd1f72e1ef97f4f5a6c99eb30e12d6_Workflow-Embedded.svg

image.png

image.png

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class test2 : MonoBehaviour
{
    public InputAction MoveAction;

    public InputAction JunpAction;


    private void Start()
    {
        JunpAction.performed += Junp;
    }

    private void Junp(InputAction.CallbackContext obj)
    {
        Debug.Log("跳了");
    }

    void Update()
    {
        // 读取每帧 的值
        Vector2 moveAmount = MoveAction.ReadValue<Vector2>();
        Debug.Log(moveAmount);
    }
    
    //操作必须启用 禁用
    public void OnEnable()
    {
        MoveAction.Enable();
        JunpAction.Enable();
    }

    public void OnDisable()
    {
        MoveAction.Disable();
        JunpAction.Disable();
    }
}

image.png

3.资产调用

3.1 在检查器中引用动作资源

要通过检查器参考使用动作资源:

  1. 在脚本中创建一个字段。public InputActionsAsset
  2. 在检查器中指定引用
  3. 使用字符串按名称访问脚本中的操作。

image.png

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class test3 : MonoBehaviour
{
    //表
    public InputActionAsset actions;
    //动作
    private InputAction moveAction;
    void Start()
    {
        // 获得move映射
        moveAction = actions.FindActionMap("PC").FindAction("Move");

        // 订阅跳方法
        actions.FindActionMap("PC").FindAction("Junp").performed += OnJump;
    }

    private void OnJump(InputAction.CallbackContext obj)
    {
        //跳
    }


    void Update()
    {
        //得到输入值
        Vector2 moveVector = moveAction.ReadValue<Vector2>();
    }
    
    void OnEnable()
    {
        actions.FindActionMap("PC").Enable();
    }
    void OnDisable()
    {
        actions.FindActionMap("PC").Disable();
    }
}

3.2 通过 C# 包装器引用操作资产

若要通过 C# 包装器使用操作资源,请执行以下操作:

  1. 在项目窗口中选择您的动作资源
  2. 在检查器中,启用“生成 C# 类”,然后选择“应用”。应在项目窗口中看到与操作资源同名的 C# 资源。
  3. 在脚本中创建操作 C# 类的实例。
  4. 使用操作 C# 类的 API 访问脚本中的操作。

image.png

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class test4 : MonoBehaviour
{
    private AAA Actions;


    private void Start()
    {
        //创建实例
        Actions = new AAA();
        //订阅跳方法
        Actions.PC.Junp.performed += OnJump;
    }

    private void OnJump(InputAction.CallbackContext obj)
    {
        Debug.Log("跳");
    }
    
    void Update()
    {
        // 读取每帧 的值
        Vector2 moveAmount = Actions.PC.Move.ReadValue<Vector2>();
        Debug.Log(moveAmount);
    }
    
    void OnEnable()
    {
        Actions.PC.Enable();
    }
    void OnDisable()
    {
        Actions.PC.Disable();
    }
    
}

4.播放器输入组件(Player Input)

4.1 Send Messager(通知)

:::info
选择这个模式,这个物体的脚本添加生命周期方法。会自动调用这个方法
:::
image.png
image.pngimage.png

4.2 Broadcast Messages (广播)

:::success
一样使用周期方法调用
子物体挂载也能触发(通知肢体发生动作?
:::
image.png
image.pngimage.png

4.3 Invoke Unity Events (事件)

image.png

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class test6 : MonoBehaviour
{
    public void Jump(InputAction.CallbackContext context)
    {
        Debug.Log("Jump:");
    }

    public void Move(InputAction.CallbackContext context)
    {
        Debug.Log("Move:"+context.ReadValue<Vector2>());
    }
}

image.png
:::success
会有三次调用
分别是 Started 开始 、和回调 performed 正在执行 、 canceled 结束
:::

只执行一次

:::info
添加参数
:::
image.png
image.png

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class test6 : MonoBehaviour
{
    public void Jump(InputAction.CallbackContext context)
    {
        if (context.phase == InputActionPhase.Performed)
        {
            Debug.Log("Jump:"+context.ReadValueAsButton());
        }
        
    }

    public void Move(InputAction.CallbackContext context)
    {
        if (context.phase== InputActionPhase.Performed)
        {
            Debug.Log("Move:"+context.ReadValue<Vector2>());
        }
        
    }
}

标签:InputSystem,Log,记录,void,System,学习,Debug,using,public
From: https://www.cnblogs.com/Lmck/p/17677766.html

相关文章

  • [个人笔记][C#]反射和特性学习笔记
    反射通过Type类型的实例来访问类型的元数据通过obj.GetType()或typeof()获取一个Type类型的实例在Type类型的实例上通过GetProperties(),GetMethods(),GetCustomAttributes()访问类型的各种东西GetType()只能在实例上调用,typeof()给一个类型名就行,它是在编译时求值的验证一个......
  • 学习CAE软件有什么方法技巧?
    在工程设计和制造领域,计算机辅助工程(CAE)软件已经成为不可或缺的工具。然而,学习使用这类复杂软件需要投入大量时间和精力。为了帮助您更快地掌握CAE软件,本文将分享一些高效的学习方法与技巧。   明确学习目标在开始学习之前,明确您的学习目标非常重要。您希望掌握哪些技能?您......
  • 学习10
    近两周申请调岗、小投标等等破事太多,而且原来教程的后面部分感觉挺混乱的,可能这就是培训机构B站免费版的弊端吧哈哈哈……1、IP地址(InternetProtocolAddress)的全称叫作互联网协议地址,它的本义是为互联网上的每一个网络和每一台主机配置一个唯一的逻辑地址,用来与物理地址作区分......
  • 收藏学习!10个让你事半功倍的Python高级库
    对于初学者而言,Python是一门简单易懂、语法清晰、容易上手的编程语言,这也是很多人喜欢Python的原因之一。还有一部分原因,是因为Python拥有大量开箱即用的第三方库,这也是它与其他编程语言最与众不同的地方。本文为大家推荐10个让你事半功倍的Python高级库,建议收藏学习!1、Da......
  • 在线找 K8s 学习搭子,急!
    如果说传统云计算时期的操作系统是Linux,那云原生时代的操作系统就是K8s,其重要性不言而喻。学好K8s,能够帮助开发者更好地掌握云时代的重要趋势。然而,很多开发者一想到K8s较高的上手门槛和学习成本,往往望而生畏,一直缺少机会和动力真正上手。如果你也一直想解决这个问题,从而快......
  • 【Python-装饰器】【示例】日志记录装饰器
    #一个简易的日志记录装饰器,用于记录函数执行信息deflog(func):defwrapper(*args,**kwargs):print(f"调用函数{func.__name__},参数:{args},{kwargs}")result=func(*args,**kwargs)print(f"函数{func}执行结果:{result}")retu......
  • IDL学习笔记(1)--可视化组件编程
    作者:fbysss关键字:IDL!开头的是一些内置变量,比如!PI,!PATH等按Ctrl+Space可以打开代码提示发布可执行文件只能使用MAKE_RT命令,而不是Export菜单WIDGET_BASE这个函数是窗口程序的基础。所有窗口元素都放置在WIDGET_BASE返回的窗口上。base=WIDGET_BASE(/ROW,TITLE='标题')表示......
  • DTD学习笔记
     作者fbysss关键字:XML一个定义Email的例子<?xmlversion="1.0"><!DOCTYPEmessage[<!ELEMENTmessage(header,body,signature,footer)>--定义了message的子元素<!ELEMENTheader(date,from,to,subject,banner)>--header还有子元素<!ELEMENTfoo......
  • IDL学习笔记(5)-IDL中菜单的创建方法
    作者:fbysss关键字:IDL一、下拉菜单promenutestbase=WIDGET_BASE(MBAR=bar)menu1=WIDGET_BUTTON(bar,VALUE='MENU1',/MENU)button1=WIDGET_BUTTON(menu1,VALUE='ONE')button2=WIDGET_BUTTON(menu1,VALUE='TWO')button3=WIDGET_BUT......
  • IDL学习笔记(4)-字体设置
    作者:fbysss关键字:IDL   在WIDGET_系列方法中,字体可以使用FONT='宋体*12*bold*Italic'的形式来设置(Widget_Label和Widget_Button都有),但是字体颜色好像没法改变,对于Widget_Button,只能折衷使用BITMAP实现,而Widget_Label就无法了。   IDLgrFont实现方式:myFont=OBJ_NEW('ID......