この記事は制作途中です。制作を進めながら書いていって後で清書します。
なのでこの通りにすすめても変わる可能性しかないし、エラーも吐きまくりです。
気になる人は1年後ぐらいにもう一度訪れることをおすすめします。
開発環境
Windows10
Unity 2022.3.25f1
→XR Interaction Toolkit
MetaQuest2
大前提としてVR上でできる野球ゲームを今回は作成する
そしてほとんどプログラムはChatGPT4oを用いて制作している。
フローチャート(AI作成)
Unityのインストールとセットアップ
Unityプロジェクトの作成
XR Interaction Toolkitのインストールと設定
基本的なシーンの作成(バッティングエリア)
ボールとバットのモデルの作成と配置
ボールの物理的な動きの設定
バットの動きの設定とインタラクションの追加
ゲームの調整(速度、ヒット判定など)
UIの追加(ボールの軌道ガイドなど)
ゲームのテストとデバッグ
ここに書いてあるとおりにしても動きません!
なので自分で気付き次第いろんな機能を追加してたりします。
参考文献
AIだけだと限度があったので日本語の記事でよかったもの

XR Interaction Toolkitのインストールと設定
3Dでプロジェクトを作成する

Window→PackageManager

UnityRegistryを選択

XR Interaction Toolkitをダウンロード。(右上にDownloadと出る。写真はダウンロード後なのでRemove)

ダウンロード後、再起動しろと出るのでYes

Edit→ProjectSettings

XR Pulg-in ManagementからOculusをONに
こんなのがなかったら多分XR Pulgin なんちゃらみたいなのが上に別であってそこのボタン押してダウンロードしたら出てくる

一応ここもONに。

というかAndroidの方は絶対やね。PCマークのほうが逆にいらんかも
ボールとバットのモデルの作成と配置
基本的なシーンの作成(バッティングエリア)
- 「Hierarchy」ウィンドウで右クリックし、「3D Object」 > 「Plane」を選択して地面を作成。
- 「Hierarchy」ウィンドウで右クリックし、「3D Object」 > 「Cube」を選択してバットの位置を示すベースを作成。
5. ボールとバットのモデルの作成と配置
- 「Hierarchy」ウィンドウで右クリックし、「3D Object」 > 「Sphere」を選択してボールを作成。
- 「Hierarchy」ウィンドウで右クリックし、「3D Object」 > 「Cylinder」を選択してバットを作成。
- それぞれのオブジェクトの位置とサイズを調整。





適当なので後で変える可能性しかないです
6. ボールの物理的な動きの設定
- ボールに「Rigidbody」コンポーネントを追加(「Inspector」ウィンドウの「Add Component」ボタンから)。
- 「Rigidbody」の設定で「Use Gravity」をオフにする。


実行するとボールだけ重力がある。Rigidbodyで重力が加わることが理解できる。

7. バットの動きの設定とインタラクションの追加
- バットに「XR Grab Interactable」コンポーネントを追加。
- バットの「XR Grab Interactable」コンポーネントの設定で「Movement Type」を「Velocity Tracking」に変更。
パスは画像下部に書いてる。検索してもでてくる(SearchをAllにしてね)

「Movement Type」を「Velocity Tracking」に変更。

「XR Grab Interactable」コンポーネントの「Movement Type」を「Velocity Tracking」に変更すると、バットをプレイヤーが動かした際の動きが物理的によりリアルに反映されるようになります。具体的には、以下のような動作になります。
「Velocity Tracking」とは
「Velocity Tracking」は、プレイヤーがバットを動かす際に、その動き(速度と方向)を追跡し、物理エンジンを使用してバットを動かします。これにより、以下の特性が生まれます:
- リアルな物理挙動:
- バットの動きが物理エンジンを通じて計算されるため、実際のバッティングのようなリアルな動きになります。
- 突然の停止や動きの変化が物理的に自然に反映されます。
- 衝突と力の伝達:
- ボールにバットが当たったとき、バットの速度や力がボールに正確に伝わり、ボールの飛び方にリアルな影響を与えます。
VR上のカメラの設置
VR上で見える画面用のカメラを設定する。
もともとあるカメラは消すか非表示にする必要がある。
新規追加からXR→XR Origin(VR)

この2つが出てくる。

ここでデバイスか部屋かどっちに高さを合わせるか選べる
今回は一旦Deviceでしてみる。

一旦実行して確かめる
Unityを起動しているPCとMetaQuest2をUSBCでつなぎます。
USBはサンダーボルト対応してないとだめだった気がします。公式のは一万ぐらいしますが、自分は中華製のやすいのを使っています。長さも動くなら2か3mはいります。
再生ボタンをおすだけでUnityがVRで起動します。(QuestLinkを起動している必要があります)

起動するとVRゴーグルで作った世界に入れました。

周りを見渡せます。まだ動いたりコントローラーで操作はできません。
後で実装します。
Deviceの高さを認識するので立って見渡すと上から見下ろす形になります。
赤い線はコントローラーが向いているものですが、まだコントローラーの設定をしていないので0,0,0で伸びているだけです。

移動できるようにしよう
コントローラーからの入力を管理する為のオブジェクトInput Action Managerを作成します。

Input Action Managerと名付けます。
AddComponentからInput Action Manageを入れます。

ActionAssetsのプラスを押します

あー終わった
参考文献が古すぎてこのあといれるファイルがありません。仕方なく別の記事を参考にします。
自分の見落としでした。
PackageManagerから新しくXRInteractionToolkitのSamplesからStarterAssetsをImportしてみます
なんせここからは最新版2.5.4の記事がない中やっているので手探りです。

XRI Default Input Actionsを検索してこれをさっきのInput Action Manageにアタッチします。
Input Action Manager が受け取った入力データを、どこに保持しておくかが、Input Action Manager 内の Action Assets ですね。


コントローラーの設定
左右のコントローラーにアクションのマッピング情報を設定します。
XROriginの下にLeftとRightがあります。まずはLeftから

XRI Default Left Controllerを検索してこれを…

LeftControllerのXRControllerのなまえの上にドラッグアンドドロップします。

すると勝手に設定してくれます。

Reftも同じようにしてください。XRI Default Right Controllerを使います。
移動を管理するコンポーネントの追加
平行移動や回転、テレポートなど移動全般を行うLocomotion SystemコンポーネントをXR Rigに追加します
XR RIgを開いてAddComponentでLocomotion Systemを追加します。

XR Originの枠はHistoryビューのXROriginを投げてください

平行移動を行うContinuous Move Providerコンポーネントを追加します。ここでは、左コントローラーのスティックで平行移動するように設定します。コントローラーのスティックで平行移動を行うアクションのマッピング情報は、サンプルで用意されているものを使用します。
HierarchyビューのXR Rigを選択し、Inspectorビューの「Add Component」ボタンからContinuous Move Provider ( Action-based )コンポーネントを追加します。

XRI Default Continuous Moveを検索してContinuous Move Provider ( Action-based )コンポーネントのタイトル部分に投げます。

左だけで移動するのでRight Hand Move Actionの「Use Reference」チェックを外します。

SystemにLocomotion System(Script)コンポーネントが含まれたオブジェクトを設定します。(ここでは、XR Rig)。
・Forward Sourceに、HierarchyビューのXR OriginのMain Cameraを設定します。これは、正面の基準となるオブジェクトに設定しています。

向きの変更を行うコンポーネントの追加
向きの変更を非連続で行うSnap Turn Providerコンポーネントを追加します。向きの変更を連続的に行うには、Continuous Tune Providerコンポーネントを使用します。ここでは、Snap Turn Providerコンポーネントを使用し、右コントローラーのスティックの左右で行うようにします。このスティックのアクション情報もサンプルのものを使用します。
XR RigにSnap Turn Provider ( Action-based )コンポーネントを追加します。

XRI Default Snap Turnを検索して、タイトル部分に投げます
右スティックのみ使用するので、Left Hand Move Actionの「Use Reference」チェックを外します。
・SystemにLocomotion System(Script)コンポーネントが含まれたオブジェクトをHierarchyビューから設定します(ここでは、XR Rig)。
無事動くことができました。視点操作も可能です。

足が遅くていらいらしたので五倍の速度に変えました

継続的なターンをする場合は
継続ターンにするには
今の設定だと、右スティックを倒すと45度一瞬でターンします。
けど、スティックを倒している間中ずっと回転していたいという時もありますよね。
そんな時は「Continuous Turn Provider (Action-based)」です。
まず、Snap Turn Provider を削除します。
Snap Turn Provider コンポーネントの右の点々をクリックして「Remove Component」で削除できます。

そして、Inspector の下にある Add Component から「Continuous Turn Provider (Action-based)」を選択しましょう。

後は、大体 Snap Turn の時と同じです。
違うのは、「XRI Default Snap Turn」ではなく「XRI Default Continuous Turn」でデフォルト設定にする点と、「Turn Amount」ではなく「Turn Speed 」となっている点くらいでしょうか。
Turn Speed は、1秒間に何度回転するかの設定だと思います。例えば360と設定しておけば1秒で一回転します。3600で10回転、36000で100回転です。
コメント