找回密码
 立即注册
查看: 359|回复: 0

[笔记] Unity Input (part 1)

[复制链接]
发表于 2022-1-8 14:01 | 显示全部楼层 |阅读模式
Unity的Input(输入)机制允许用户使用设备(device),触摸(touch)或手势(gestures)等来控制你的应用程序。你可以编写代码实现GUI等应用内的元素如何响应用户的输入。
Unity支持多种输入设备的输入,包括:

  • 键盘和鼠标(Keyboards and mice)
  • 操纵杆(Joysticks)
  • 控制器(Controllers)
  • 触摸屏(Touch screens)
  • 移动设备的运动传感器,如:加速器和陀螺仪( accelerometers, gyroscopes)
  • VR和AR的控制器
Unity通过两个独立的系统来支持输入(input):

  • Input Manager 是Unity平台的核心部分之一,默认就可以使用的。
  • Input System 是一个package,需要通过Package Manager安装后才能使用。它要求.NET 4 runtime,不能在老的.NET 3.5 runtime下工作。
注意:
在Unity 2020.1中,Input System仍然处于预览状态,因此它还不能用于生成项目,且其目前已有的某些特性将来可能会发生变化。
1 Input Manager

Input Manager窗口允许为你的项目定义input axes(输入轴)以及它们关联的动作。打开Input Manager窗口的方法:Edit>Project Settings,然后选择Input类别 (注: 在Unity 2019.3.4f1下要选择Input Manager类别)。


Input Manager使用以下类型的控件:

  • Key 指的是物理键盘上的任意键,如: W, Shift, 或者空格键。、
  • Button 指的是任意物理控制器(如:手柄,gamepads)的任意按钮,如Xbox One控制器的X按钮。
  • 一个virtual axis(虚轴,axis的复数为axes)被映射成为一个控件(control),如:按钮或按键。当用户激活该控件时,对应的虚轴会收到一个范围在[-1..1]的值。你可以在脚本中使用这个值。
1.1 Virtual axes

你创建的每一个项目默认都会有一些输入轴(input axes)。这些轴使得你可以在项目中直接使用键盘、鼠标、操作杆。你可以在Input Manager窗口中看到更多关于这些输入轴的信息。
每一个输入轴有下面这些属性:


轴(axis)的值:

  • 对于操纵轴和键盘输入,axis的值在-1到1之间。这些轴的中性位置为0。一些输入类型,如:按钮和键盘,对输入强度(intensity)不敏感的,因此他们的值只能是-1,0或1。
  • 对于鼠标输入,axis的值可以是Mouse delta(即上一帧,鼠标移动的距离)。因此当用户快速移动鼠标时,鼠标输入的值可能比1大或者比-1小。
1.2 添加、移除和复制虚轴

为了添加一个虚轴,需要增大Input Manager下的Size属性的值。这会在轴列表的底部创建一个新的轴。新的轴会复制前一个轴的属性。
为了移除一个虚轴,你可以:

  • 减小Size的值,这为移除列表中最后一个虚轴。
  • 右击任意一个虚轴,选择Delete Array Element
注意: 这个动作是无法撤消的。
为了复制一个虚轴,右击它,选择Duplicate Array Element
1.3 Mapping virtual axes controls

为了把一个键盘按键或鼠标按钮映射到一个虚轴,只需要在Input Manager中对应虚轴的Positive ButtonNegative Button属性处,输入这些按键或按钮的名字即可。
按键名字遵守以下规则:


鼠标按钮的名字: mouse 0, mouse 1, mouse 2等。
操纵杆按钮命名规则:


你可以使用Input.GetKey函数为查询某个按键或按钮的输入,例如:
Input.GetKey("a");
对于键盘输入,也可以在脚本中使用KeyCode枚举来访问,举例:
using UnityEngine;

public class KeyCodeExample : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Debug.Log("Space key was pressed.");
        }

        if (Input.GetKeyUp(KeyCode.Space))
        {
            Debug.Log("Space key was released.");
        }
    }
}
1.4 在脚本中使用虚轴

你可以利用虚轴的名称在脚本中访问虚轴。
例如,为了查询水平轴(Horizontal axis,一般是用键盘的a,d 以及左右箭头来控制)的值,你可以像这样使用Input.GetAxis:
float horizontalInput = Input.GetAxis ("Horizontal");
对于那些描述一个事件(event)而不是一个移动(movent)的轴(例如,游戏中的开火键firing),请使用Input.GetButtonDown:
如果两个或多个轴具有相同的名字,则查询返回具有最大绝对值的轴。这使得多个输入设备可以具有同一个名字。
例如,你可以创建两个虚轴,它们的名字都为Horizontal,把其中一个虚轴赋给键盘输入,另一个赋给操纵杆输入。如果用户正在使用操纵杆,则输入来自操纵杆,而键盘输入为null。反之亦然。这样你就可以写一个脚本来覆盖来自多个控制器的所有输入了
玩PC游戏时,有时候会同时插着手柄、键盘和鼠标,三者可以无缝切换。
例子
你可以利用来自HorizontalVertical轴的输入和 transform.Translate方法来在XZ平面移动一个GameObject。创建一个脚本,把它的update()方法替换如下,并把这个脚本挂到需要被移动的GameObject上面。
float moveSpeed = 10;
//Define the speed at which the object moves.

float horizontalInput = Input.GetAxis("Horizontal");
//Get the value of the Horizontal input axis.

float verticalInput = Input.GetAxis("Vertical");
//Get the value of the Vertical input axis.

transform.Translate(new Vector3(horizontalInput, 0, verticalInput) * moveSpeed * Time.deltaTime);
//Move the object to XYZ coordinates defined as horizontalInput, 0, and verticalInput respectively.
Time.deltaTime表示自上一帧后经过的时间。用Time.deltaTime乘以速度变量moveSpeed可以保证每帧物体以恒定的速度移动。
想想有些老旧的机器渲染一帧花费的时间较长,则该帧内它移动的距离就长;有些高端机器渲染一帧花费的时间较短,则该帧内它移动的距离就短。
References:

  • Unity Input
  • KeyCode

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-9 18:15 , Processed in 0.105215 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表