深入了解Unity的Input类:一份详细的技术指南(六)

前言

在Unity开发中,我们通常需要获取并处理用户的输入,这时我们就需要用到Unity的Input类。它允许我们通过键盘,鼠标,触摸屏,游戏手柄等多种方式从用户那里接收输入。在本篇文章中,我会用一万字以上深度解析Unity的Input类,并提供其属性和方法的详细使用方式。


  1. 按键状态相关
    属性:
    Input.anyKey:如果用户按下任何键,返回true(只读)
    Input.anyKeyDown:如果用户在当前帧中按下任何键,返回true(只读)
    方法:
    Input.GetKey(KeyCode key):如果按着指定的键,则返回 true
    Input.GetKeyDown(KeyCode key):如果按下了指定的键,则返回 true
    Input.GetKeyUp(KeyCode key):如果释放了指定的键,则返回 true

Input.anyKey: 检测最后一帧中是否有任何键被按下(bool)
如果用户按下了任何键,或者按下了鼠标按钮,或者触控设备有任何的触控输入,这里的"任何键"包括键盘按键,鼠标按键,以及触控输入。它会在用户按住键不放的整个过程中一直返回 true

void Update()
{
    
    
    if (Input.anyKey)
    {
    
    
        Debug.Log("按着一个键");
    }
}

Input.anyKeyDown: 检测在当前帧中是否有任何键被按下(bool)
只在用户刚刚开始按下任何键的那一帧,也就是说,只有在按键刚被按下的那一帧,它才会返回 true,之后的帧,即使按键仍然被按住,它也会返回 false。同样的,这里的"任何键"也包括键盘按键,鼠标按键,以及触控输入

void Update()
{
    
    
    if (Input.anyKeyDown)
    {
    
    
        Debug.Log("刚按了一个键");
    }
}

Input.GetKey(KeyCode key):这个方法可以用来检测用户是否按下了任何指定的键。如果用户按下了指定的键,该方法会返回true,否则返回false,键的名称以KeyCode的形式作为参数。
如果用户一直按住该键,那么此方法会在每一帧都返回 true。

Input.GetKeyDown(KeyCode):只在用户开始按下指定的键的那一帧返回 true。也就是说,只有在按键刚被按下的那一帧,它才会返回 true,之后的帧,即使按键仍然被按住,它也会返回 false

Input.GetKeyUp(KeyCode):只在用户释放指定的键的那一帧返回 true。当用户松开按键时,这个方法在那一帧返回 true,其余时间返回 false

void Update() {
    
    
    if (Input.GetKey(KeyCode.Space)) {
    
    
        Debug.Log("空格键被按着");
    }
    if (Input.GetKeyDown(KeyCode.Space)) {
    
    
        Debug.Log("空格键被按下");
    }
     if (Input.GetKeyUp(KeyCode.Space)) {
    
    
        Debug.Log("空格键被松开");
    }
}

  1. 按钮状态相关
    方法:
    Input.GetButton(string buttonName):如果按着指定的虚拟按钮,则返回 true
    Input.GetButtonDown(string buttonName):如果按下了指定的虚拟按钮,则返回 true
    Input.GetButtonUp(string buttonName):如果释放了指定的虚拟按钮,则返回 true
    上面这三个方法用于检测特定的游戏按钮的状态,它们都需要一个字符串参数,这个字符串是你在 Unity 的 Input Manager 中定义的按钮名

Input.GetButton(string buttonName):如果用户按下了指定的虚拟按钮,该方法会返回true,否则返回false。按钮的名称以字符串的形式作为参数。如果一直按住该按钮,那么此方法会在每一帧都返回 true

Input.GetButtonDown(string buttonName):只在用户开始按下指定的按钮的那一帧返回 true。也就是说,只有在按钮刚被按下的那一帧,它才会返回 true,之后的帧,即使按钮仍然被按住,它也会返回 false

Input.GetButtonUp(string buttonName):只在用户释放指定的按钮的那一帧返回 true。当用户松开按钮时,这个方法在那一帧返回 true,其余时间返回 false。

void Update() {
    
    
    if (Input.GetButton("Jump")) {
    
    
        Debug.Log("Jump按钮被按住.");
    }
    if (Input.GetButtonDown("Jump")) {
    
    
        Debug.Log("Jump按钮被按下.");
    }
    if (Input.GetButtonUp("Jump")) {
    
    
        Debug.Log("Jump按钮被松开.");
    }
}

  1. 鼠标状态、位置和移动相关
    属性:
    Input.mousePresent:如果有鼠标设备连接上,返回 true(只读)
    Input.mousePosition:返回当前的鼠标位置(只读)
    Input.mouseScrollDelta:返回鼠标滚轮的滚动量(只读)
    方法:
    Input.GetMouseButton(int button):如果按着鼠标按钮,则返回 true
    Input.GetMouseButtonDown(int button):如果按下了鼠标按钮,则返回 true
    Input.GetMouseButtonUp(int button):如果释放了鼠标按钮,则返回 true

Input.mousePresent:这是一个布尔值,如果用户的设备支持并且连接了鼠标设备,则返回 true,否则返回 false。在下面这个例子中,我们在游戏启动时检查鼠标是否连接。

void Start()
{
    
    
    if (Input.mousePresent)  
    {
    
    
        Debug.Log("“鼠标已连接");
    }
    else
    {
    
    
        Debug.Log("“鼠标未连接");
    }
}

Input.mousePosition:获取鼠标在屏幕上的位置,这是一个 Vector3 类型的值,表示当前鼠标在屏幕上的位置。位置的 x 和 y 值表示鼠标在屏幕上的像素坐标,z 值通常为 0(在 2D 空间中)。请注意,此坐标的原点(0,0)在屏幕的左下角。

void Update()
{
    
    
    Vector3 mousePosition = Input.mousePosition;
    Debug.Log(mousePosition); //(-16.0, 221.0, 0.0)
}

Input.mouseScrollDelta:这是一个 Vector2 类型的值,表示自上一帧以来鼠标滚轮的滚动量。x 值表示水平滚动,y 值表示垂直滚动。

void Update()
{
    
    
    Vector2 scrollDelta = Input.mouseScrollDelta;
    if (scrollDelta.y > 0){
    
    
        Debug.Log("鼠标滚轮向上滚动: " + scrollDelta.y);
    }
    else if (scrollDelta.y < 0){
    
    
        Debug.Log("鼠标滚轮向下滚动: " + scrollDelta.y);
    }
}

Input.GetMouseButton(int button):此方法接收一个整数参数,代表鼠标的按钮索引(0 表示左键,1 表示右键,2 表示中键),并在按钮被持续按下时返回 true

Input.GetMouseButtonDown(int button):此方法同样接收一个整数参数代表鼠标的按钮索引,并只在按钮被首次按下的那一帧返回 true

Input.GetMouseButtonUp(int button):此方法同样接收一个整数参数,代表鼠标的按钮索引,并只在按钮被释放的那一帧返回 true

void Update()
{
    
    
    if (Input.GetMouseButton(0)){
    
    
        Debug.Log("“正在按鼠标左键");
    }
    if (Input.GetMouseButtonDown(0)){
    
    
        Debug.Log("“按下了鼠标左键");
    }
    if (Input.GetMouseButtonUp(0)){
    
    
        Debug.Log("“松开了鼠标左键");
    }
}

  1. 其他输入控制相关方法:
    Input.GetAxis(string axisName):根据指定的轴名返回轴的值
    Input.GetAxisRaw(string axisName):根据指定的轴名返回轴的值,没有平滑过滤。
    Input.IsJoystickPreconfigured(string joystickName):检查名为 joystickName 的手柄是否已在 Unity 输入管理器中预配置
    Input.GetJoystickNames():返回当前连接的所有游戏控制器的名称

Input.GetAxis(string axisName): 返回指定虚拟轴的值,轴的名称以字符串的形式作为参数。该值在 -1 和 1 之间,这个值会在没有输入时平滑地返回到 0。这个方法非常有用,可以用来获取预定义的虚拟轴的值,如“Horizontal”或“Vertical”:

void Update() {
    
    
    float horizontalInput = Input.GetAxis("Horizontal");
    float verticalInput = Input.GetAxis("Vertical");
    Debug.Log("水平输入: " + horizontalInput);
    Debug.Log("垂直输入: " + verticalInput);
}

Input.GetAxisRaw(string axisName):提供和GetAxis方法类似的功能,但是该方法不会对值进行平滑处理,它直接返回输入值。当你需要更精确的控制时可以使用该方法,示例同上。

Input.IsJoystickPreconfigured(string joystickName):检查名为 joystickName 的手柄是否已经在 Unity 的输入管理器中预配置。返回 true 表示已经预配置,false 表示没有预配置。

bool isPreconfigured = Input.IsJoystickPreconfigured("Xbox360Controller");

Input.GetJoystickNames():返回当前连接的所有游戏控制器的名称,返回的是一个字符串数组。

string[] joystickNames = Input.GetJoystickNames();
foreach(string joystickName in joystickNames)
{
    
    
    Debug.Log(joystickName);
}

  1. 触摸相关
    属性:
    Input.touchCount:返回当前帧中的触摸数量(只读)
    Input.touches:返回从触摸屏接收的所有触摸信息的数组(只读)
    Input.multiTouchEnabled:设置或获取是否启用多点触控。
    Input.touchSupported:如果设备支持触摸输入,则返回true
    Input.simulateMouseWithTouches:如果启用,则将触摸事件作为鼠标事件进行处理,返回布尔值
    Input.stylusTouchSupported:如果设备支持使用触摸笔作为输入,则返回true
    Input.touchPressureSupported:如果设备支持检测触摸压力,则返回true
    方法:
    Input.GetTouch(int index):返回触摸数据。可以访问正在发生触摸的特定指数

Input.touchCount: 返回一个整数,代表在当前帧被触摸的触摸点数量。对于多点触控设备非常有用,例如在触摸屏设备上实现手势操作。

void Update()
{
    
    
    int touchCount = Input.touchCount;
    Debug.Log("触摸数量: " + touchCount);   //触摸数量:2
}

Input.touches: 返回一个 Touch[] 数组,包含了当前帧所有的触摸点。每个 Touch 对象包含了该触摸点的详细信息,如位置、压力、相对于上一帧的移动等。

void Update()
{
    
       //遍历所有的触摸点,并在控制台输出它们的位置
    foreach (Touch touch in Input.touches)
    {
    
    
        Debug.Log("触摸位置: " + touch.position);
    }
}

Input.multiTouchEnabled: 这个属性是一个布尔值,用于开启或关闭多点触控功能。默认情况下该功能是开启的。如果设为 false,则不论设备上有多少个触摸点,Input.touches 只会返回最早的那个触摸点。

void Start()
{
    
    
    //多点触控功能关闭
    Input.multiTouchEnabled = false;
}

Input.touchSupported:是一个只读的布尔值属性,它用于检查当前设备是否支持触摸输入。如果支持,它将返回 true,否则返回 false。

if (Input.touchSupported)
{
    
    
    Debug.Log("“本设备支持触摸");
}
else
{
    
    
    Debug.Log("“本设备不支持触摸");
}

Input.simulateMouseWithTouches: 获取或设置是否应该模拟鼠标输入的触摸事件(bool)。
默认情况下,Input.simulateMouseWithTouches 为 true,触控点将模拟鼠标事件,这意味着在多点触控设备上,你可以像在使用鼠标一样处理用户的输入。然而,如果你的应用程序需要处理多点触控,你可能需要将此设置为 false,以防止对触控事件的鼠标模拟。

     //禁用模拟触摸鼠标
    Input.simulateMouseWithTouches = false;

Input.stylusTouchSupported: 获取设备是否支持手写笔输入(bool),在开发针对触控笔的应用程序时,这是非常有用的

if (Input.stylusTouchSupported)
{
    
    
    Debug.Log("本设备支持手写笔");
}
else
{
    
    
    Debug.Log("本设备不支持手写笔");
}

Input.touchPressureSupported:是一个只读的布尔值属性,它用于检查当前设备是否支持触摸压力(深度触摸)。如果支持,它将返回 true,否则返回 false。对于像 Apple 的 3D Touch 功能这样的技术,这是非常有用的。

if (Input.touchPressureSupported)
{
    
    
    Debug.Log("该设备支持触摸压力");
}
else
{
    
    
    Debug.Log("该设备不支持触摸压力");
}

Input.GetTouch(int index): 这个方法返回指定索引的 Touch 对象。索引应该小于 Input.touchCount数量,否则会抛出异常。下面例子中,如果存在触摸点,就获取第一个触摸点,并输出它的位置。

void Update()
{
    
    
    if (Input.touchCount > 0)
    {
    
    
        Touch firstTouch = Input.GetTouch(0);
        Debug.Log("第一个触摸点: " + firstTouch.position);
    }
}

  1. 加速度相关属性:
    Input.acceleration:返回由加速度传感器测量的设备当前加速度(只读)
    Input.accelerationEventCount:返回当前帧中发生的加速度事件的数量(只读)
    Input.accelerationEvents:返回一个包含所有在当前帧中发生的加速度事件的数组(只读)

Input.acceleration: 返回从加速度传感器中获取的设备加速度(Vector3)

void Update()
{
    
    
    Vector3 acceleration = Input.acceleration;
    Debug.Log(acceleration);//可能会输出如"(-0.00, -0.70, 0.10)"这样的三维向量,这些数字表示设备在x, y, z轴上的加速度。
}

Input.accelerationEventCount: 返回加速度传感器事件的数量(int)

void Update()
{
    
    
    int accelerationEvents = Input.accelerationEventCount;
    Debug.Log(accelerationEvents);//可能会输出类似于"1"或"0"的数字,这取决于最后一帧中发生了多少加速度事件。
}

Input.accelerationEvents: 这个属性返回一个 AccelerationEvent[] 数组,包含了当前帧所有的加速度事件。每个 AccelerationEvent 对象包含了该事件的详细信息,如加速度和时间戳。这个属性通常用于处理设备的加速度数据。

void Update()
{
    
    
    //遍历所有的加速度事件,并在控制台输出它们的加速度值
    foreach (AccelerationEvent accEvent in Input.accelerationEvents)
    {
    
    
        Debug.Log("加速度: " + accEvent.acceleration);
    }
}

  1. 设备行为相关属性:
    Input.backButtonLeavesApp:当这个值为 true 时,按下返回按钮会导致应用程序退出,否则,操作系统将处理返回按钮

Input.backButtonLeavesApp: 设置 Android 的返回按钮是否会让应用程序离开(bool)。以下示例设置返回按钮使应用退出:(只能在Android、Windows Phone或Windows平板电脑上使用)

void Start()
{
    
    
    Input.backButtonLeavesApp = true;
}

  1. 游戏控制器相关属性:
    Input.compensateSensors:启用或禁用输入传感器是否根据屏幕方向进行自动补偿
    Input.deviceOrientation:设备的方向(只读)
    Input.compass:访问设备的指南针,返回一个Compass对象
    Input.gyro:访问设备的陀螺仪,返回一个Gyroscope对象。

Input.compensateSensors: 这是一个布尔值类型的属性,用于启用或禁用是否应补偿设备的自然方向,默认值为 false。当启用此设置时,Unity将尝试自动调整传感器数据,以便自然方向对应于屏幕向上的方向。注意,此设置可能会影响到陀螺仪、加速度计和指南针的数据。

void Start()
{
    
    
    Input.compensateSensors = true;//启用了自动补偿
}

Input.deviceOrientation: 返回设备的物理方向

void Update()
{
    
    
    DeviceOrientation orientation = Input.deviceOrientation;
    Debug.Log(orientation);//可能会输出"Portrait", "LandscapeLeft", "LandscapeRight"等等,这取决于设备的当前方向。
}

Input.compass: 提供设备罗盘的访问
这个属性返回一个 Compass 对象,它可以提供设备指南针的数据。在使用指南针数据之前,需要先通过调用 Input.compass.enabled = true 来启用指南针

void Start()
{
    
    
    Input.compass.enabled = true;
}

void Update()
{
    
    
    Debug.Log("罗盘方向: " + Input.compass.trueHeading);
}
//上述代码首先启用了指南针,然后每一帧都打印出真实的地理方向。

Input.gyro: 提供设备陀螺仪的访问
这个属性返回一个 Gyroscope 对象,可以提供设备陀螺仪的数据。在使用陀螺仪数据之前,需要先通过调用 Input.gyro.enabled = true 来启用陀螺仪

void Start()
{
    
    
    if (SystemInfo.supportsGyroscope) //利用SystemInfo类,判断设备是否支持陀螺仪
    {
    
    
        Input.gyro.enabled = true;
    }
    void Update()
    {
    
    
        Debug.Log("陀螺仪旋转速度: " + Input.gyro.rotationRate);
    }
}

  1. 其他
    属性:
    Input.compositionCursorPos:获取或设置输入法编辑器(IME)的位置。返回一个Vector2,表示IME的屏幕坐标
    Input.compositionString:返回用户正在使用输入法编辑器(IME)输入的字符串
    Input.imeCompositionMode:获取或设置当前的输入法编辑器(IME)组合模式
    Input.imeIsSelected:检查输入法编辑器(IME)是否在活动状态并且已选择一个区域进行组合(只读)
    Input.inputString:返回上一帧中键盘或按键输入的字符(只读)
    Input.location:访问设备的位置功能,返回一个LocationService对象
    方法:
    Input.ResetInputAxes():重置所有输入,这将忽略所有的按键/按钮输入和轴移动

Input.compositionCursorPos:这是一个Vector2类型的属性,表示IME组合字符串的屏幕位置。你可以通过设置这个属性来改变屏幕上组合字符串的位置。

Input.compositionCursorPos = new Vector2(100, 200);
//上面的代码将组合字符串的位置设置为屏幕上的(100, 200)的位置

Input.compositionString:这是一个字符串属性,表示当前正在由IME组合的字符串。这在处理非拉丁字符输入时非常有用,如中文输入

string composition = Input.compositionString;
Debug.Log(composition);  // 输出:正在输入的IME组合字符串

Input.imeCompositionMode:控制系统如何处理在屏幕键盘中的文本输入
①这是一个枚举类型的属性(IMECompositionMode枚举),用于控制IME的组合模式。
②允许用户通过标准键盘输入复杂的字形,如中文、日文或韩文等非拉丁语系的语言。
③这个属性有三个值:Auto和On、Off。

On:开启IME。当你希望用户使用IME输入文本时,应将此属性设置为On
Off:关闭IME。如果你不希望用户使用IME输入文本,例如在需要处理原始键盘输入的情况下,应将此属性设置为Off
Auto:自动开启或关闭IME。Unity将根据用户是否正在编辑可输入的文本字段来自动开启或关闭IME。如果用户正在编辑文本字段,IME将开启;否则,IME将关闭。

例如:在用户打开一个需要输入文本的UI界面时,你可能想要开启IME,以便用户可以输入复杂的字形。在用户关闭这个界面时,你可能想要关闭IME,以便可以直接处理键盘输入。

// 开启IME,以便用户可以输入复杂的字形
Input.imeCompositionMode = IMECompositionMode.On;

// 当用户完成输入后,关闭IME
Input.imeCompositionMode = IMECompositionMode.Off;

// 或者,让Unity根据是否有文本字段正在编辑,自动处理IME的开启或关闭
Input.imeCompositionMode = IMECompositionMode.Auto;

Input.imeIsSelected:是一个只读的布尔型属性,用于判断当前是否选中了输入法编辑器(IME)的输入字段。
当IME正在编辑状态时,这个属性值为true,否则为false

Input.inputString: 返回自上次帧的字符输入(string)

void Update()
{
    
    
    string input = Input.inputString;
    if (!string.IsNullOrEmpty(input))
    {
    
    
        Debug.Log(input);
    }
}

Input.location: 提供了一个用于获取设备的地理位置信息的服务。这个服务可以提供如经度、纬度、海拔、方向和速度等信息
注意:这个服务默认是关闭的,你需要通过调用 Input.location.Start() 来启动位置服务。启动服务可能会消耗一些时间,所以你可能需要一些机制来等待服务完全启动。在启动服务后,你可以通过检查 Input.location.status 来确认位置服务的状态。

    //检查用户是否开启服务
    if (!Input.location.isEnabledByUser)
    {
    
    
        Debug.Log("用户未启用位置服务");
    }
    
    //开启位置服务
    Input.location.Start();
    
    //检查位置服务是否可用
    if (Input.location.status == LocationServiceStatus.Failed)
    {
    
    
        Debug.Log("无法确定设备位置");
    }
    else
    {
    
    
        Debug.Log("位置: " + Input.location.lastData.latitude + " " + Input.location.lastData.longitude);  //Location: 37.785834 122.406417
    }
    
    //停止位置服务
    Input.location.Stop();

注意:当你不再需要位置服务时,应通过调用 Input.location.Stop() 来停止服务,以节省设备的电池寿命。
如果想了解更多关于location里的方法和属性的相关内容,有需要的话我会在之后的文章详细说明。

Input.ResetInputAxes() :重置所有输入,这通常用于情况更改时,需要重置可能已经启动并影响输入的动作。
例如,您可能在游戏暂停并重新开始时使用它,以防止玩家在暂停菜单中按下按钮并在游戏恢复后立即生效。

public void ResumeGame()
{
    
    
    // 假设我们当前的游戏暂停了,并且在这里正在恢复游戏...
    
    // 在恢复游戏之前,我们需要重置输入输入,以防止在暂停期间发生的任何输入影响游戏
    Input.ResetInputAxes();
    // 然后我们可以继续游戏...
}

在上面例子中,Input.ResetInputAxes() 在游戏恢复之前被调用,以清除在暂停期间发生的任何输入


通过使用Unity的Input类,我们可以轻松地获取和处理用户的输入,它是我们在Unity开发中处理用户输入的关键,它使我们能够创建出交互丰富、响应流畅的游戏,希望这篇文章能帮助你更好地理解和使用Unity的Input类。

猜你喜欢

转载自blog.csdn.net/qq_33795300/article/details/131737034
今日推荐