1. Unity 的输入系统
Size之后的一些属性,例如:Horizontal,Vertical。顾名思义这是水平方向和前后方向上的定义(针对于轴向在X轴上)。点击 Horizontal旁边的三角形,可以看到其中定义了许多内容。例如:Name表示的是这个虚拟轴的名称,Negative Button表示的是水平位置上负方向的按钮(向左),Positive Button表示的是水平位置上正方向的按钮(向右)。下两个带Alt的选项是备选方案。Gravity代表的是按钮恢复到正常值的恢复速度,值越大越 快。Dead表示当对应按钮的数值小于此处定义的数值时,都认为按钮已经复位。Axis项定义虚拟轴的方向,可以使X轴Y轴或者其他多位控件的轴。
(2) 调用Input.GetAxis方法来获取虚拟轴的当前状态值
虚拟轴中负方向和正方向的数值范围时-1到1之间。例如:GetAxis("Horizontal"); 这时候如果按住left按钮,此函数会返回-1 ,松开之后恢复到0。一样的如果按住Right按钮,此时函数会返回1。因此可以认为在-1到0之间是按了虚拟轴的负方向,在等于0时是什么都没有按,在 0到1之间是按了虚拟轴的正方向。因此可以把这个值作为transform或者rotation的值,来控制物体的移动和旋转方向,也可以控制物体的移动速度随按键力度的变化等。
1.2 鼠标输入检测
对于鼠标的检测。主要的是 Input 类中的 GetMouseButton / GetMouseButtonDown / GetMouseButtonUp,入参为0/1/2,分别对应鼠标左键/右键/中键盘。返回值为bool,表示该键是否处于该状态。
例如,当按下鼠标左键的一瞬间,GetMouseButtonDown(0) 的返回值为true。
GetMouseButtonDown()当鼠标按下时执行,但只会执行一次。GetMouseButton()当鼠标长按时,会一直执行。GetMouseButtonUp()是当松开鼠标时执行,且只会执行一次。
1.3 键盘输入检测
键盘的检测,主要是 Input 类的 GetButtonDown / GetButton / GetButtonUp 和 GetKeyDown / GetKey / GetKeyUp 两组。
GetButton 组方法的参数是虚拟轴的名称,返回值为 bool 类型,可以检测到该虚拟轴定义的按键状态,如虚拟轴 "Horizontal" 中定义了lef/right/a/d 键,当这几个键被按下时,GetButton("Horizontal") 返回true
GetKey 组方法的参数为 string 或 Unity 定义的 枚举类型KeyCode,例如当字母键A被按下时,GetKey(KeyCode.A) 以及 GetKey("A") 返回值都为true
1.4 触摸检测
Unity 定义了枚举类型TouchPhase
Touch.GetTouch(0).phase 返回最近一帧的触摸状态。
Input.toucheCount,触摸持续帧数。
Touch.deltaPosition 最后一阵滑动的值,只返回xy坐标,一般用vector2接收。
2. XGame游戏的输入管理系统
2.1 InputManager
InputManager 负责检测底层设备输入,派发输入事件。
(1) 定义枚举类型 InputState 表示当前的输入
(2) 枚举类型eTouchPhase表示 上一帧的输入状态
(3) 枚举类型GestureEvent 表示判定出的输入事件
(4) 类InputEvent 表示输入事件,包含了一个 GestureEvent 成员,具体的子类还定义了各自的数据字段,比如 TouchEvent 定义了触摸点的坐标等。
(5) InputManager 中定义一系列的代理类型,并定义了对应的事件
在 InputManager 的 Update() 方法中,调用GetTouchPhase获得上一帧的触摸状态(eTouchPhase),结合当前的输入状态(InputState),确定并修改输入状态,并判定输入产生何种效果(GestureEvent),然后获取相应的数据信息,填充 InputEvent,调用 RaiseEvent 派发事件,RaiseEvent的实现就是根据 参数的 GestureEvent 枚举值,执行不同的代理方法。
2.2 InputDelegate
InputDelegate 负责管理当前的输入模式,根据输入模式往 InputManager 注册当前模式下各种 InputEvent 的回调方法。
(1) 定义枚举 InputModule 表示游戏不同状态下的输入模式
(2) 定义方法 SubscribeHandlersAndEvents 来注册输入模式,以注册相应的回调方法
(3) 相应的有UnsubscribeHandlersAndEvents 注销回调