REALITY iOSをゲームパッドに対応させてみた REALITY Advent Calendar #16
はじめに
本記事はREALITY Advent Calendar 2021の12月16日の記事です。
REALITY開発合宿で試したREALITYのゲームパッド対応について解説します。
この記事はデモとして機能を実装した話であり、将来REALITYにリリースされることを約束するものではありません。
ゲームパッド対応とは?
今回は、こちらのELECOM社製のVRコントローラJC-VRR01BKに対応してみました。
このゲームパッドには、1つのジョイスティックと8個のボタンが搭載されており、ゲームモードで起動するとiCade互換の信号が出力されます。
iCade互換とは、キーボードとして認識され、ジョイスティックやボタンに入力があると、対応したキーの入力としてiPhoneに送信するコントローラです。
なぜゲームパッド対応するのか?
ずばり、マイクを使っている時の操作性の向上です。
こちらがマイクを利用している時の様子です。
マイクを利用していると、スマホと顔の間にマイクが入るため、小さい画面の操作が難しい場合があります。
特に、「スワイプ」と「長押し→スワイプ」の区別や小さいアイコンなどの操作が非常に難しいです。
開発したもの
こちらが開発した成果です。
ジョイスティックの上下左右の操作でアバターがエモートします。
ホームボタンを押すとスクショが撮影されます。
シェア画面が開いた状態で、もう一度ホームボタンを押すとシェア画面を閉じます(便利!)
ABYボタンを押すと、衣装の切り替えができます。
このような配置です。
サイドにもボタンが付いているのですが、今回はジョイスティックとボタン5つに機能を追加しました。
実装
今回は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」です!
お楽しみに!