Unity之xbox手柄控制交互逻辑

一、手柄按键及轴向

在这里插入图片描述

1)按键

  • Unity引擎的KeyCode中已经包含了手柄按键的枚举。
  • 按键从0到19,JoystickButton0和Joystick1Button0都表示0键,只是两个手柄而已。
  • 通过Input.GetKeyDown(KeyCode.JoystickButton0)可以验证对应的按键值。

2)轴向

  • 3rd axis triggers控制着LT和RT;主摇杆是X axis和Y axis,即Horizontal和Vertical;副摇杆是5th axis和4th axis;十字键是6th axis和7th axis。
  • 轴向需要在Edit->Project Settings->Input里面自行设定。
    在这里插入图片描述

二、手柄管理类

通过步骤一,我们得知了手柄的按键及轴向的设置及调用,接下来我们需要整合一个管理类。

1)通过十字键(上下左右移动)控制聚焦UI物体的选中态切换
float x = Input.GetAxis(“对应十字键6th axis的名字”);
float y = Input.GetAxis(“对应十字键5th axis的名字”);

通过x和y值绑定四个方向的函数SetAxisDir(AxisDir dir);方向函数存储在list容器中,使用计时器在Update中执行对应方向的委托事件(可以自定义执行间隔时间)。
在这里插入图片描述

ps:当本场景被注销时,需要调用CancelAllDirEvents,不然会有上个场景的事件执行时找不到对象的错误(管理类常驻,DontDestroyOnLoad)。

2)通过主摇杆控制人物(摄像机)移动
如果仅通过单个轴向去做处理的话,不能适配摇杆360°可旋转的特性。这里介绍一个原生API解决这个问题:Vector2.ClampMagnitude(new Vector2(x, y), 1f);

ps:Vector3也有这个方法。

3)通过副摇杆控制人物(摄像机)旋转
因为业务的需求,不可让人物360°旋转,即需要一定的角度限制。这里介绍一个原生API解决这个问题:float angle = Mathf.Clamp(angle, minAngle, maxAngle);

pps:所有轴向的调用获取是通过Input.GetAxis(“对应轴向名称”);具体轴向对应方向获取的值的正负请自行验证 =_=