Upgrade to Pro — share decks privately, control downloads, hide ads and more …

『ALTDEUS: Beyond Chronos』におけるマルチプラットフォーム向けコントローラーの対応 / Support for multi-platform controllers in "ALTDEUS: Beyond Chronos

Nakaji Kohki
November 15, 2021

『ALTDEUS: Beyond Chronos』におけるマルチプラットフォーム向けコントローラーの対応 / Support for multi-platform controllers in "ALTDEUS: Beyond Chronos

2021/11/15にXR Kaigi 2020にて使用した発表資料です。

Nakaji Kohki

November 15, 2021
Tweet

More Decks by Nakaji Kohki

Other Decks in Technology

Transcript

  1. ©MyDearest, Inc. All Rights Reserved. 本講演について 2 • 講演資料 発表後すぐに公開予定

    • スクショ撮影可否 OK • SNS投稿 OK SNS投稿大歓迎です、是非たくさんツイートしてください! ハッシュタグ:#XRKaigi #アルトデウスBC     
  2. ©MyDearest, Inc. All Rights Reserved. 自己紹介 3 Unity/VRエンジニア Nakaji Kohki

    / なかじ 略歴: CyberAgent(AbemaTV VR)→メルカリR4D XR→現在 MyDearest株式会社には2020年1月にジョイン →インタラクション全般やCI整備を担当 • 日本VR学会認定上級VR技術者 • Podcast『xR.fm』のパーソナリティ • エンジニア系勉強会のオーガナイザー Twitter: @nkjzm
  3. ©MyDearest, Inc. All Rights Reserved. エンジニアチームの紹介 4 放浪エンジニア 増谷 海人

    2017年にMyDearestへ入社 し、『東京クロノス』『アル トデウス:BC』のプログラ マーとして活躍。 リードボードゲーマー 下嶋 健司 リードプログラマーのふりを して会社の棚を私物ボドゲで 埋めたり、会社でボドゲを普 及する活動を日々行っている エンジニア 大川大輝 『東京クロノス』『アルトデ ウス:BC』のプログラマーと してキャラなどのアニメー ション制御回りを担当。
  4. ©MyDearest, Inc. All Rights Reserved. 背景 5 VRゲーム市場ではマルチプラットフォーム戦略をとる場合が多い • ターゲットユーザー層の拡大や売り上げアップが目的

    • ゲームエンジンや規格化による共通化は進んでいるが、 少なくとも現状ではタイトル毎の対応がほぼ必須 • プラットフォームによってはコントローラーによる差異も問題に →多くのVRゲーム開発者が対応に苦労している 画像引用元: https://www.playstation.com https://www.oculus.com タイトルによって状況や選択肢は様々だが、本セッションでは弊社VRタイトル 『ALTDEUS: Beyond Chronos』におけるプラクティスを紹介する
  5. ©MyDearest, Inc. All Rights Reserved. “ALTDEUS: Beyond Chronos”(アルトデウスBC) 7 VRインタラクティブストーリーアクション

    • VRインタラクションと物語体験を両立した作品 • 対応プラットフォーム ◦ 2020/12/04: Oculus Quest(Android) ◦ 2020/12/04: Oculus Rift(PC) ◦ 2021/02/19: SteamVR(PC) ◦ 2021/04/15: PlayStation®VR(コンソール) 🏅ファミ通 電撃ゲームアワード2020 アドベンチャー部門 最優秀賞 🏅Oculusストア内ユーザー評価 世界No.1 (Road to VR調べ)
  6. ©MyDearest, Inc. All Rights Reserved. 本セッションの内容 8 1. プラットフォーム毎の対応デバイス比較 2.

    プラットフォームSDKの共通化 3. コントローラーの共通化 4. パフォーマンスの最適化 5. PSVR向けのゲームパッド対応 [基礎編] [応用編]
  7. ©MyDearest, Inc. All Rights Reserved. 免責事項 9 本発表中には下記の製品に関する話題が出てきますが、 公知である内容を超えた製品独自の具体的な開発情報については言及しません。 -

    PlayStation®VR(『PSVR』の呼称を併用する) - PlayStation®Move - DUALSHOCK®4(一般的な呼称である『ゲームパッド』を併用する) 画像引用元: https://www.playstation.com
  8. ©MyDearest, Inc. All Rights Reserved. アルトデウスBCの対応デバイス比較 11 プラットフォーム Oculus Quest

    Oculus Rift SteamVR PlayStation®VR タイプ モバイル PC PC コンソール デバイス 9種類/4カテゴリ [キーワード] ・SDK ・処理スペック ・解像度 Oculus Quest Oculus Quest 2 Oculus Rift Oculus Rift S VIVE VIVE Pro Valve Index PlayStation®VR コントローラー 5種類 [キーワード] ・キーコンフィグ ・ゲームパッド 画像引用元: https://www.playstation.com https://www.oculus.com https://amzn.to/3CVTYaS https://amzn.to/3qgTHvW https://www.gizmodo.jp/2021/08/oculus-quest-2-128gb.html https://www.ask-corp.jp/products/htc/vr-device/vive-pro.html https://www.ark-pc.co.jp/i/34999759/ https://www.gizmodo.jp/2019/12/valve-index.html ※ 厳密にはOculusRift / Oculus Rift Sも動作する
  9. ©MyDearest, Inc. All Rights Reserved. プラットフォームSDKの共通化 (1/3) 13 プラットフォーム毎に固有機能がある •

    頭や手のトラッキング座標 • コントローラーのボタン入力 • コントローラーの振動制御 • ポジションリセット • アチーブメント解放 → 各プラットフォームのSDKを通じて取得/操作する必要がある → 実装時に各プラットフォームの固有機能を把握するのは大変(作業量が倍増) プラットフォームを意識せず実装できるように共通化を図る 例:Oculus IntegrationのOVRCameraRigプレハブ
  10. ©MyDearest, Inc. All Rights Reserved. プラットフォームSDKの共通化 (2/3) 14 基底クラス:BaseVRPlatform VRPlatformOculus

    Game Code VRPlatformOpenVR VRPlatformPlaystation Oculus Integration SteamVR Plugin 画像引用元: https://www.playstation.com https://amzn.to/3CVTYaS https://www.ask-corp.jp/products/htc/vr-device/vive-pro.html https://www.ark-pc.co.jp/i/34999759/ https://www.gizmodo.jp/2021/08/oculus-quest-2-128gb.html VRPlatformNone VR機器を接続せずに 実行できる デバッグ機能
  11. ©MyDearest, Inc. All Rights Reserved. プラットフォームSDKの共通化 (3/3) 15 BaseVRPlatform は

    MonoBehaviour(Unityのオブジェクトクラス)を継承 →派生クラスは各プラットフォームで用意されているプレハブにアタッチ可能 • 固有機能はプレハブとして 提供されることが多いので、 シンプルな修正に留められる • コンポーネントを参照しやすい • SDKの更新にも対応しやすい OVRCameraRigから派生したVRPlatformOculusプレハブ (Unityのプレハブバリアント機能を使用)
  12. ©MyDearest, Inc. All Rights Reserved. プラットフォーム Oculus Quest Oculus Rift

    SteamVR PlayStation®VR デバイス Oculus Quest Oculus Quest 2 Oculus Rift Oculus Rift S VIVE VIVE Pro Valve Index PlayStation®VR コントローラー 決定/テキスト送り A / X / トリガー トリガー A / トリガー ◦ / PS / トリガー ◦ / L1 / L2 / R1 / R2 メニューの開閉 B / Y / スタート メニューボタン B △ / □ △ / □ カーソル移動 スティック トラックパッド スティック - 方向キー つかむ トリガー / グリップ トリガー / グリップ トリガー / グリップ トリガー ◦ / L1 / L2 / R1 / R2 アルトデウスBCのキーコンフィグ(一部) 18 画像引用元: https://www.playstation.com https://www.oculus.com https://amzn.to/3qgTHvW https://www.gizmodo.jp/2019/12/valve-index.html
  13. ©MyDearest, Inc. All Rights Reserved. プラットフォーム Oculus Quest Oculus Rift

    SteamVR PlayStation®VR デバイス Oculus Quest Oculus Quest 2 Oculus Rift Oculus Rift S VIVE VIVE Pro Valve Index PlayStation®VR コントローラー 決定/テキスト送り A / X / トリガー トリガー A / トリガー ◦ / PS / トリガー ◦ / L1 / L2 / R1 / R2 メニューの開閉 B / Y メニューボタン B △ / □ △ / □ カーソル移動 スティック トラックパッド スティック - 方向キー つかむ トリガー / グリップ トリガー / グリップ トリガー / グリップ トリガー ◦ / L1 / L2 / R1 / R2 アルトデウスBCのキーコンフィグ(一部) 19 3種類 1種類 2種類 3種類 5種類 画像引用元: https://www.playstation.com https://www.oculus.com https://amzn.to/3qgTHvW https://www.gizmodo.jp/2019/12/valve-index.html アクションとボタンの種類が「一対多」の関係になっている 一般的なゲームのキーコンフィグは「一対一」なので、少し特殊 ※コントローラーによっては左右で同じ位置のボタンに対して同様の割り当てを行っているため、種類の数の表記は正確ではない
  14. ©MyDearest, Inc. All Rights Reserved. 入力モジュールの共通化 (1/3) 20 やりたいこと •

    コントローラー毎に「一対多」の対応関係を定義したい • 同時に、ゲーム機能の実装時にはプラットフォームを意識したくない → 2段階に分けて「コントローラー入力」を「アクション」に変換 1. BaseVRPlatformで共通化: 各コントローラー入力→ 共通Buttons定義 2. ゲーム側のキーコンフィグ: 共通Buttons定義 → アクション ボタンとアクションの対応を柔軟に記述できる
  15. ©MyDearest, Inc. All Rights Reserved. BaseVRPlatform VRPlatformOculus VRPlatformOpenVR 入力モジュールの共通化 (2/3)

    21 MainAction SubAction Menu Buttons Oculus ボタン トリガー グリップ A / X B / Y スタート アクション メニューの開閉 決定/テキスト送り つかむ(右手) つかむ(左手) Primary Right Left Both Right Left OpenVR ボタン トリガー グリップ メニュー 撃つ(右手) HandType 撃つ(左手)
  16. ©MyDearest, Inc. All Rights Reserved. BaseVRPlatform VRPlatformOculus VRPlatformOpenVR 入力モジュールの共通化 (3/3)

    22 MainAction SubAction Menu Buttons Oculus ボタン トリガー グリップ A / X B / Y スタート アクション メニューの開閉 決定/テキスト送り つかむ(右手) つかむ(左手) Primary Right Left Both Right Left OpenVR ボタン トリガー グリップ メニュー 撃つ(右手) HandType 撃つ(左手) ゲーム側でも柔軟なキーコンフィグが可能
  17. ©MyDearest, Inc. All Rights Reserved. アルトデウスBCのパフォーマンス最適化 (1/2) 24 [パフォーマンスを考慮したグラフィック表現の方針] 1.

    ライティングを使用しない(全編を通じてアニメ調の作品である利点) 2. テクスチャ焼きこみやシェーダーを活用してリッチに見せる 3. 描画負荷が高い半透明表現はできる限り避け、点滅などで代替
  18. ©MyDearest, Inc. All Rights Reserved. アルトデウスBCのパフォーマンス最適化 (2/2) 25 『Oculus Quest

    1』をベンチマークにしてパフォーマンスチューニング • 対応デバイスの中で最も処理スペックが低いため • 処理負荷の最適化も行ったが、基本的にはグラフィック側がネックだった • 計測開始時点ではFPSが2程度しか出ないシーンもあった ゲーム中のデバッグ機能 最低FPS, 現在のFPS, 最高FPS FPSの測定グラフ(右端が最新)
  19. ©MyDearest, Inc. All Rights Reserved. プラットフォーム別グラフィック切り替え機能 26 処理スペックに余裕があるプラットフォームではグラフィックをリッチにしている → UnityのAddressableを用いてリソースを切り替える仕組みを作成

    • 通常版/リッチ版のリソースを 別々のGroupに同名パスで登録 • ビルド時にプラットフォームに応じて 使用するGroupを切り替え (BundledAssetGroupSchemaのIncludeInBuild) ビルド時に自動的にGroup単位で切り替えるので、実装側での対応が不要!
  20. ©MyDearest, Inc. All Rights Reserved. ゲームパッド対応の背景 28 アルトデウスBCのPSVR版では多くの人に遊んでもらうため ハンドコントローラー(Move)に加えゲームパッド(Dualshock®4)にも対応 →

    PSVRにはハンドコントローラーが同梱されておらず、所持していないユーザーが一定数いるため しかし、アルトデウスBCでは元々手を使ったインタラクション要素を推してる… ゲームパッド版でも手を使ったインタラクションを実現したい! 手による没入感はゲームの重要な体験に深く影響する
  21. ©MyDearest, Inc. All Rights Reserved. ゲームパッドで手の感覚を生み出す方法を考える 30 『身体所有感』の考え方からヒントを得る • あるモノが自分の身体の一部だと感じる感覚のこと

    • 自分の身体以外のモノにも生起することが知られている ◦ 例:マウスカーソル、ラバーハンド錯覚、VRアバター • 体性感覚(指を動かす、など)と視覚が連続的に同期していることが条件 ◦ 位置や方向に対応関係がある ◦ 動きの対応が直観的に理解できる → ゲームパッドでも自分の手の感覚を生み出せるかも?
  22. ©MyDearest, Inc. All Rights Reserved. 手の感覚を生み出せる操作方法を考える (1/3) 31 手の感覚を生み出すためには、左手と右手それぞれを別々に動かす必要がありそう →

    左手用のキーと右手用のキーが必要 →左右対称になっているキーを使って手を動かしてみる 画像出典元: Tokyoship, Wikimedia Commons, CC 表示 3.0, https://commons.wikimedia.org/w/index.php?curid=24802891 https://commons.wikimedia.org/w/index.php?curid=24820899 候補①: トリガー 候補②: スティック
  23. ©MyDearest, Inc. All Rights Reserved. 手の感覚を生み出せる操作方法を考える (2/3) 32 • 取得できる値:float[0-1]

    ◦ 通常は0, 押し込み具合に応じて1まで変化 • 動かし方 ◦ 押し込み具合に応じて手を前に移動させる [やってみて感じたこと] • 「トリガーを引く動き」と「手を前に出す動き」が逆向きで直感に反する • 前後のみの単調な動きになりやすい 候補①: トリガーの検証 画像出典元: Tokyoship, Wikimedia Commons, CC 表示 3.0, https://commons.wikimedia.org/w/index.php?curid=24820899
  24. ©MyDearest, Inc. All Rights Reserved. 手の感覚を生み出せる操作方法を考える (3/3) 33 • 取得できる値:Vector2(二次元ベクトル)

    ◦ 通常は(0,0)で倒した方向の単位ベクトルを返す • 動かし方 ◦ 倒した方向に手を動かす(奥に倒すと前に移動) [やってみて感じたこと] • 「スティックを奥に倒す動き」と「手を前に出す動き」が直観的 • 左右方向にも動かせるので自由に動かしている感覚が強い 候補②: スティックの検証 画像出典元: Tokyoship, Wikimedia Commons, CC 表示 3.0, https://commons.wikimedia.org/w/index.php?curid=24802891
  25. ©MyDearest, Inc. All Rights Reserved. 手の感覚を生み出せる操作方法を考える (3/3) 34 • 取得できる値:Vector2(二次元ベクトル)

    ◦ 通常は(0,0)で倒した方向の単位ベクトルを返す • 動かし方 ◦ 倒した方向に手を動かす(奥に倒すと前に移動) [やってみて感じたこと] • 「スティックを奥に倒す動き」と「手を前に出す動き」が直観的 • 左右方向にも動かせるので自由に動かしている感覚が強い 候補②: スティックの検証 採用 画像出典元: Tokyoship, Wikimedia Commons, CC 表示 3.0, https://commons.wikimedia.org/w/index.php?curid=24802891
  26. ©MyDearest, Inc. All Rights Reserved. 手の感覚を生み出せる座標移動を考える (1/3) 35 ハンドコントローラーでは「現実の手の座標」と「VR空間の手の座標」が同期 →ゲームパッドでは「スティックの小さな動き」で「VR空間の手の座標」を制御

    移動方法の候補① 画像出典元: Tokyoship, Wikimedia Commons, CC 表示 3.0, https://commons.wikimedia.org/w/index.php?curid=24802891 VR空間の手の座標にどうやって反映させるかが操作感に大きく影響 スティックを倒している間だけ 手がその方向に移動 while(傾けている){ 手の座標 += スティックのベクトル } 移動方法の候補② スティックを倒している角度と 手の相対座標が常に同期 手の座標 = 基準座標 + スティックのベクトル 実際はスティックを離したら元に戻る処理もある
  27. ©MyDearest, Inc. All Rights Reserved. 手の感覚を生み出せる座標移動を考える (2/3) 36 画像出典元: Tokyoship,

    Wikimedia Commons, CC 表示 3.0, https://commons.wikimedia.org/w/index.php?curid=24802891 [やってみて感じたこと] • 良かったこと ◦ ゆっくり倒すとゆっくり進み、早く倒すと早 く進むので、自然な動きになりやすい • 課題に感じたこと ◦ スティックと手の位置が一致しないように感 じる(ラジコン操作している感覚) 移動方法の候補① スティックを倒している間だけ 手がその方向に移動 while(傾けている){ 手の座標 += スティックのベクトル } 実際はスティックを離したら元に戻る処理もある
  28. ©MyDearest, Inc. All Rights Reserved. 移動方法の候補② 手の感覚を生み出せる座標移動を考える (3/3) 37 画像出典元:

    Tokyoship, Wikimedia Commons, CC 表示 3.0, https://commons.wikimedia.org/w/index.php?curid=24802891 [やってみて感じたこと] • 良かったこと ◦ 対応関係が明らかで直感的 ◦ 瞬時に手を伸ばすことができる • 課題に感じたこと ◦ 操作がピーキーで手の動きが早すぎる ▪ イージングである程度は改善した ▪ 操作していると意外とすぐに適応できた スティックを倒している角度と 手の相対座標が常に同期 手の座標 = 基準座標 + スティックのベクトル
  29. ©MyDearest, Inc. All Rights Reserved. 移動方法の候補② 手の感覚を生み出せる座標移動を考える (3/3) 38 画像出典元:

    Tokyoship, Wikimedia Commons, CC 表示 3.0, https://commons.wikimedia.org/w/index.php?curid=24802891 [やってみて感じたこと] • 良かったこと ◦ 対応関係が明らかで直感的 ◦ 瞬時に手を伸ばすことができる • 課題に感じたこと ◦ 操作がピーキーで手の動きが早すぎる ▪ イージングである程度は改善した ▪ 操作していると意外とすぐに適応できた スティックを倒している角度と 手の相対座標が常に同期 手の座標 = 基準座標 + スティックのベクトル 採用
  30. ©MyDearest, Inc. All Rights Reserved. [検証結果に基づいた実際の動かし方] • スティックのy座標 (0→1) ◦

    初期位置とターゲット位置の間を移動 ◦ yの値に応じて位置と角度の補完を行う • スティックのx座標 (-1↔1) ◦ 左右方向の遊び • この動かし方のメリット ◦ 角度の補完ができるので動きが自然になる ◦ 状況によってターゲット位置を変更できる 汎用的な手の動きを実装する 39 初期位置 ターゲット位置
  31. ©MyDearest, Inc. All Rights Reserved. • スティックを奥に倒すことで 対象のインタラクションが発火する (コライダとの接触判定がされる) •

    元々インタラクションは触れられる位置 にしかないので破綻もしづらい →ほぼ全てのインタラクションに対応できた ターゲット位置 初期位置 インタラクション時の手の動かし方 40 触りたい位置にターゲット位置を変更するだけ!
  32. ©MyDearest, Inc. All Rights Reserved. 手の感覚を強めるための工夫(一部紹介) 41 自然な手の動きにみえるように、様々な調整を入れている • 左右に動かした時に手首の角度を調整(骨格の構造を考慮)

    • 特定の状況でターゲット座標をこっそり変更している ◦ 例:写真を持った時は手が目の前に来るような設定に 外側に動かした時 通常時 内側に動かした時
  33. ©MyDearest, Inc. All Rights Reserved. ゲームパッド版の操作の様子 42 ハンドコントローラー並みの操作感が実現できた ↑の実装方法の解説(おまけ) 1.

    ターゲット位置を小パネルに設定 して、触るたびに切り替える 2. 左右の遊びの幅を全体の横幅分に 変更することでなぞる操作を実現
  34. ©MyDearest, Inc. All Rights Reserved. 本セッションのまとめ [基礎編] 44 1. プラットフォーム毎の対応デバイス比較

    ◦ デバイス毎やコントローラー毎に色々な差異が存在 2. プラットフォームSDKの共通化 ◦ 抽象クラスでプラットフォームを意識せず実装できるように共通化した 3. コントローラーの共通化 ◦ アクションとボタンが「一対多」の関係になっていることに注目 ◦ 入力の変換を2段階に分け、対応関係を柔軟に記述できるように 4. パフォーマンスの最適化 ◦ グラフィック表現の方針を立て、Oculus Quest 1を基準にチューニング ◦ Addressableのグループ機能でグラフィック切り替え機能を実現
  35. ©MyDearest, Inc. All Rights Reserved. 本セッションのまとめ [応用編] 45 5. PSVR向けのゲームパッド対応

    ◦ ゲームパッドの対応と手を使った体験を両立させる必要があった ◦ 身体所有感が生起する条件から操作方法の仮説検証を行った a. 二次元ベクトルを取得できるスティック操作を採用 b. スティック角度と手の位置を同期させて操作を直観的に ◦ 汎用的に使うため「ターゲット位置」に補完して移動する仕組みを実装 a. ターゲット位置の変更でほとんどのインタラクションに対応 →ハンドコントローラーと同様の手の感覚を生み出すことができた