記事の内容
MetaQuest3のコントローラー入力でVR空間内を移動するための手順をまとめます。
以下のドキュメントを参考にしながら、自分がハマった点などを補足しています。
公式ドキュメント
Basic XR Locomotion
https://docs.godotengine.org/en/stable/tutorials/xr/basic_xr_locomotion.html
はじめに
2024/03/23現在はまだGodot 4.3ではAssetLibが利用できないため、OpenXR関連のプラグインをインストールすることができません。なので以下の作業はGodot 4.2.1で行っています。
また、今回の視点移動のためにGodot XR Tools for Godot 4を利用します。このaddonにはVRコンテンツを作るのに便利なスクリプトがいろいろ含まれているので、こちらを利用します。
こちらの記事の手順準備したサンプルに手を加えます。
【Godot】MetaQuest3ビルド環境構築
XR Toolsをインストール
まずAssetLibの検索欄にXR Toolsと入力し、Godot XR Tools for Godot 4をダウンロード&インストールします。

Godot XR Tools Pluginを有効にする
プロジェクト>プロジェクト設定を開き、プラグインのタブを開きます。ここに先ほどインストールしたGodot XR Toolsのプラグインが追加されているので「有効」をチェックして利用できるようにします。(有効にしたあと一度Godotを再起動させたほうが無難そう)

太陽の追加
このままではまだ真っ暗なので、ライトを追加します。シーンの直下(※XROrigin3Dノードの下ではありません!)にDirectionalLight3Dを追加して名前をSunに変更します。SunのTransformのPositionYに10メートル、Rotationに-45、-30、0を設定してください。
プレイヤーボディの追加
XROrigin3Dノードを選択して右クリックから「子シーンをインスタンス化を」選択、addons/godot-xr-tools/player/player_body.tscnを選んで作成します。(ファイルシステムからドラッグ&ドロップしても作成できます)

次にPlayerBodyノードの下にCollisionShape3Dを作成し、Shapeに「新規CapsuleShape3D」を選択します。Shapeの名称の所をタップすると詳細が設定できるので、Heightに1.7メートルなど適当な値を入れてください。(僕は自分の身長に合わせてます)
※最新のXR ToolsのPlayerBodyノードにはコリジョンが含まれていて、上記の操作は不要になりました。
手のモデル変更
前回のステップではMeshInstance3Dを使って手をボックスで表示していましたが、XR Toolsには手のモデルも含まれているのでそれに変更します。まずLeftHand、RightHandノードの下に作ったMeshInstance3Dノードを削除してください。
次にLeftHandノードを選択した状態で右クリックから「子シーンをインスタンス化」を選択、addons/godot-xr-tools/hands/scenes/lowpoly/left_hand_low.tscnを選ぶと左手モデルが追加されます。
同様にRightHandノードの下にはaddons/godot-xr-tools/hands/scenes/lowpoly/right_hand_low.tscnを右手モデルとして追加してください。
床の追加
PlayerBodyが移動するための床(Floor)を追加します。シーンの直下(※XROrigin3Dノードの下ではありません!)にStaticBody3Dノードを追加して名前をFloorと変更してください。
Floorノードの下にMeshInstance3DとCollisionShape3Dを追加します。
MeshInstance3DのMeshには「新規PlaneMesh」を選択、メッシュのサムネイルをタップするとサイズを指定できるので100x100メートルを設定します。
CollisionShape3DのShapeには「新規BoxShape3D」を選択、サイズには100x1x100メートルを設定。更にTransformのPositionのY軸に-0.5を設定します。
参考にしているGodotのドキュメントでは床テクスチャ生成のためにTest Grid Generatorを紹介していました。面倒なら以下に僕が生成した画像を張っておくので、ダウンロードして使ってください。

スティック操作で移動する
RightHandノードの下にaddons/godot-xr-tools/functions/movement_direct.tscnと、addons/godot-xr-tools/functions/movement_turn.tscnを追加します。
これで右コントローラーのジョイスティックで移動と回転ができるようになります。
また、LeftHandノードの下にaddons/godot-xr-tools/functions/function_teleport.tscnを追加すると左コントローラーでテレポート移動もできるようになります。
XR Toolsの移動スクリプトの挙動
すっかりハマった点なのですが、XR Toolsの移動スクリプトはシーンのXROrigin3Dを移動したり回転させることでプレイヤーの移動を実現しています。なので、床や太陽ライトをXROrigin3Dノード以下に配置するとスクリプトの移動に合わせて世界全体が動いてしまい自身が動いていないように錯覚してしまっていました。
床や壁など世界を構築するオブジェクトはXROrigin3Dノードの下ではなく、シーンの直下に配置してください!
