見出し画像

REALITY iOSをゲームパッドに対応させてみた REALITY Advent Calendar #16

はじめに

本記事はREALITY Advent Calendar 2021の12月16日の記事です。
REALITY開発合宿で試したREALITYのゲームパッド対応について解説します。
この記事はデモとして機能を実装した話であり、将来REALITYにリリースされることを約束するものではありません。

ゲームパッド対応とは?

今回は、こちらのELECOM社製のVRコントローラJC-VRR01BKに対応してみました。

画像1

このゲームパッドには、1つのジョイスティックと8個のボタンが搭載されており、ゲームモードで起動するとiCade互換の信号が出力されます。
iCade互換とは、キーボードとして認識され、ジョイスティックやボタンに入力があると、対応したキーの入力としてiPhoneに送信するコントローラです。

なぜゲームパッド対応するのか?

ずばり、マイクを使っている時の操作性の向上です。

こちらがマイクを利用している時の様子です。

画像2

マイクを利用していると、スマホと顔の間にマイクが入るため、小さい画面の操作が難しい場合があります。
特に、「スワイプ」と「長押し→スワイプ」の区別や小さいアイコンなどの操作が非常に難しいです。

開発したもの

こちらが開発した成果です。

ジョイスティックの上下左右の操作でアバターがエモートします。

画像4

ホームボタンを押すとスクショが撮影されます。
シェア画面が開いた状態で、もう一度ホームボタンを押すとシェア画面を閉じます(便利!)

画像5

ABYボタンを押すと、衣装の切り替えができます。

画像6

このような配置です。
サイドにもボタンが付いているのですが、今回はジョイスティックとボタン5つに機能を追加しました。

スクリーンショット 2021-12-07 17.46.54

実装

今回はiOSのみで実装しました。

JC-VRR01BKはキーボードとして認識されます。
iOSの実装的に言うと、UITextFieldを使わずに、キーボードの入力を受け取れるようにします。

今回は、keyCommandsを利用しました。

class StreamingViewController: UIViewController {
    override var keyCommands: [UIKeyCommand]? {
       // 検出する入力パターン
       return "wdxa".map({ (c: Character) -> UIKeyCommand in
           return UIKeyCommand(input: String(c), modifierFlags: [], action: #selector(handlerKeyInput(command:)))
       })
   }
   override func viewDidAppear(_ animated: Bool) {
       self.becomeFirstResponder()
   }
   @objc private func handlerKeyInput(command: UIKeyCommand) {
       guard let input = command.input else { return }
       switch input {
       case "w":
           // ジョイスティックが上に倒された時の挙動
       case "d":
           // ジョイスティックが右に倒された時の挙動
           // == 中略 ==
       default:
           break
       }
   }
}

keyCommandsに登録された入力があると、handlerKeyInputが呼ばれます。
入力に応じてUnityへ通知し、エモートなどを実行してもらいます。

まとめ

REALITY iOSをゲームパッドに対応させてみた話でした。
MFi認証のゲームパッドは高価なのですが、iCadeの入力に対応することで、比較的安価で簡易なゲームパッドに対応することが出来ました。
今後は、MFi認証のゲームパッドやXboxやPS4などのゲームパッドにも対応してみたいです!

明日のアドベントカレンダーは

メガネを外すと本気を出すと噂の、かむいさんによる「needleを使った画面遷移とDI」です!
お楽しみに!