ちょくちょく社内でも動かないという話があがったので、この問題を調べるとどうやらUnity側の問題のようです。
MRTKでも同様の問題が報告されています。
github.com
UnityのInputのAPIからJoyStickなどの値が取得できないみたいです。
対処
先のリンクのUnityさんからの回答の通り、問題はUnity2018.2時点では解消しているようです。
どうしてもUnity2017を使いたい際は、自前で書きましょうとのこと。
大きな変更を行っているようで、LTSにも反映されなそうです。
実装はこちらが参考になるかと思います。
github.com
MRTKと組み合わせたいという場合は、XBoxInputSourceというスクリプトがあるので継承するなり新規に作るなりで対応はできると思います。
初期化処理
#if WINDOWS_UWP gamepad = (Gamepad.Gamepads.Count > 0) ? Gamepad.Gamepads[0] : null; Gamepad.GamepadAdded += (sender, e) => { gamepad = e; }; #endif
ネイティブとそれ以外で処理を書き分ける
#if WINDOWS_UWP if (gamepad != null) { var reader = gamepad.GetCurrentReading(); controllerData.XboxLeftStickHorizontalAxis = Filter((float)reader.LeftThumbstickX); controllerData.XboxLeftStickVerticalAxis = Filter((float)reader.LeftThumbstickY); controllerData.XboxRightStickHorizontalAxis = Filter((float)reader.RightThumbstickX); controllerData.XboxRightStickVerticalAxis = Filter((float)reader.RightThumbstickY); controllerData.XboxLeftTriggerAxis = Filter((float)reader.LeftTrigger); controllerData.XboxRightTriggerAxis = Filter((float)reader.RightTrigger); controllerData.XboxSharedTriggerAxis = controllerData.XboxLeftTriggerAxis - controllerData.XboxRightTriggerAxis; } #else controllerData.XboxLeftStickHorizontalAxis = Input.GetAxis(XboxControllerMapping.XboxLeftStickHorizontal); controllerData.XboxLeftStickVerticalAxis = Input.GetAxis(XboxControllerMapping.XboxLeftStickVertical); controllerData.XboxRightStickHorizontalAxis = Input.GetAxis(XboxControllerMapping.XboxRightStickHorizontal); controllerData.XboxRightStickVerticalAxis = Input.GetAxis(XboxControllerMapping.XboxRightStickVertical); controllerData.XboxLeftTriggerAxis = Input.GetAxis(XboxControllerMapping.XboxLeftTrigger); controllerData.XboxRightTriggerAxis = Input.GetAxis(XboxControllerMapping.XboxRightTrigger); controllerData.XboxSharedTriggerAxis = Input.GetAxis(XboxControllerMapping.XboxSharedTrigger); #endif
絶対値0.19未満をカットする
private float Filter(float val) { if ((val < 0.19 && val > -0.19)) return 0; return val; }
トリガーやジョイスティックはこれでいいのですが、ボタンは別途押下、押下中、離すなどの処理を作る必要があります。