デコシノニッキ

デコシノニッキ

ホロレンジャーの戦いの記録

HoloLensでXboxコントローラが動かない場合

ちょくちょく社内でも動かないという話があがったので、この問題を調べるとどうやらUnity側の問題のようです。

MRTKでも同様の問題が報告されています。
github.com

UnityのInputのAPIからJoyStickなどの値が取得できないみたいです。

FogBugz

対処

先のリンクの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;
       }

トリガーやジョイスティックはこれでいいのですが、ボタンは別途押下、押下中、離すなどの処理を作る必要があります。

[デコシノニッキ]は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」