Unity的输入实现

Unity自己有Input类,之前没怎么深入研究过,都是Input.GetKeyDown(KeyCode)了事。这次为了实现多种方法多个平台的输入(触屏,键盘,鼠标,手柄),特地拿出这一部分探讨。

鼠标&触摸

鼠标与触摸接近,区别在于:

  • 鼠标存在Hover状态,即悬停的情况,而触摸没有。
  • 触摸有多点手势。
  • 触摸输入在设计时对精准度要求需要降低。

对应的平台无非PC/Mac(鼠标)与Android/IOS/部分Win(触摸)。为便捷实现这两种输入方法,推荐一个插件FingerGesture,兼容鼠标和触摸输入。功能全面,包括点击(Tap),拖拽(Drag),双指缩放(Pinch)等都可以简单实现,非常方便。

使用方法待续…

键盘&手柄

两者都为按键输入。只考虑键盘输入时,可以简单的使用Input.GetKeyDown(KeyCode)和Input.GetKey(KeyCode)就能完成绝大部分的逻辑。前者会在按键按下的那一帧返回true(再次触发需要弹起后再按下),后者只要键处于按下状态便会一直返回true。
如果要使用手柄进行输入,就有必要学习一下Input的定义了。在菜单Edit-Project Setting-Input中可以进行自定义输入。

手柄的按键映射和相应键值:(360/XboxOne手柄,每个都亲测过了)

  • A - joystick button 0
  • B - joystick button 1
  • X - joystick button 2
  • Y - joystick button 3
  • LB - joystick button 4
  • RB - joystick button 5
  • Back - joystick button 6
  • Start - joystick button 7
  • 左摇杆水平 - X axis(最上-1~1最下)
  • 左摇杆垂直 - Y axis(最左-1~1最右)
  • 右摇杆水平 - 4th axis(最上-1~1最下)
  • 右摇杆垂直 - 5th axis(最左-1~1最右)
  • 方向键水平 - 7th axis(左-1,1右)
  • 方向键垂直 - 8th axis(上-1,1下)
  • LT - 9th axis(松开0~1完全按下)
  • RT - 10th axis(松开0~1完全按下)

如何编写代码

使用Input中定义的输入方式,在大部分情况下可以实现一句代码同时兼容手柄与键盘输入。

  • Input.GetButtonDown()和Input.GetButtonDown()
    手柄中所有按键类和键盘输入使用这个方法进行判断。
  • Input.GetAxis()和Input.GetAxisRaw()
    手柄的方向杆类输入使用这个方法返回数值。GetAxisRaw()会忽略Unity对数值的平滑作用。