機体 3Dモデル・同期設定
この節を始める前に、(ワールドの設定)を必ず終わらせてください。
チェックリスト
Packages/FDMi - Example/Prefabsから機体のテンプレート (PlaneTemplate.FDMi、またはEarly_Jet_1.FDMi)を用意するPlaneTemplate.FDMi/DataBus/Vehicle/Model/に機体の3Dモデルが入っているDatabus/Vehicle/NotInZone/EnterZone- コライダー
- 位置・大きさが正しいか?
- "Is Trigger" ⇒ ☑
RelativeSyncPositionTriggerの設定- "Detect Enter" ⇒ ☑ (有効)
- "Detect Exit" ⇒ ☐ (無効)
Databus/Vehicle/NotInZone/On When Disable⇒ ☑ (有効)
- コライダー
Databus/Vehicle/OnlyIsRoot/OnlyInZone/ExitZoneの設定- コライダー
- 位置・大きさが正しいか?
- "Is Trigger" ⇒ ☑
RelativeSyncPositionTriggerの設定- "Detect Enter" ⇒ ☐ (無効)
- "Detect Exit" ⇒ ☑ (有効)
Databus/Vehicle/OnlyIsRoot/OnlyInZone/On When Disable⇒ ☐ (無効)
- コライダー
Databus/Vechicle/Colliders以下に、機体の外形コライダーを設置- 椅子の設定(PilotSeat)
- 配置を設定します。コライダーの判定を、
Box Colliderを調節して修正 Box ColliderのIs Trigger⇒ ☑ (有効) -Databus/Vechicle/Model/SeatManager/PilotSeat/Seatの位置を椅子の座面あたりに設定Databus/Vechicle/Model/SeatManager/PilotSeat/Exitの位置を、降りるときの位置に設定Databus/Vechicle/Model/SeatManager/PilotSeat/OnlyInSeat/ExitButtonの位置を調整
- 配置を設定します。コライダーの判定を、
FDMi/Setup All FDMi Componentsを押す。
1.3Dモデルの配置
まず、機体の3Dモデルを配置します。 このとき、下図の様に機体の脚が静止時の状態(タイヤがすべて水平な地面に接地した状態)を作成してください。

次に、プロジェクト内の Packages/FDMi - Example/Prefabs にある Prefab PlaneTemplate.FDMiを、モデルの子に入れます。
そのうえで
- TransformのPositionをすべて0にします
- TransformのRotationを以下のように調節します。
- X軸(赤)を、機体の右手側
- Y軸(緑)を、水平な地面に垂直
- Z軸(青)を機体正面

ここで、一度 PlaneTemplate.FDMiを、3Dモデルの外に出します。このとき、PlaneTemplate.FDMiのRotationのX軸が0以外の場合、0を代入してください。
そのうえで、3Dモデルを PlaneTemplate.FDMi/DataBus/Vehicle/Model/の子にいれます。
PlaneTemplate.FDMiを含む、飛行機の親GameObjectは、シーンの一番上の階層に配置してください。
飛行機の親GameObjectとは、FDMiObjectManagerを含むGameObjectを指します。

ここまでできましたら、この時点で一度Prefab Variantを作成することを推奨します。
まず、PlaneTemplate.FDMiの名称を変更します。今回はEarly_Jet_1.FDMiとします。
適切なフォルダ(通常 /Assets以下)にドラッグアンドドロップします。
このとき、選択肢が現れますので、Original Prefab または Prefab Variant を選択してください。
基本的にはFDMiのバージョン更新による不特定な仕様変化を避けるため、Original Prefabをお勧めします。
本チュートリアルではPrefab Variantで設定を進めます。
2. 同期の設定
機体の位置の同期は Databus/Sync が行います。これは後程でてくるSetup All FDMi Componentsで自動設定されますので、放っておいてください。
FDMiにおける同期の仕組みを簡単に説明します。(読み飛ばしてかまいません)
- 飛行機の外にいるときは、普通のVRChatワールドとほぼ同じ感じです。
- 飛行機の中に入る(もしくは飛行機の椅子に座る)と、Unity上の原点に飛行機を固定し、地面が動くようになります。
- 飛行機の外に出ると、元の状態に戻ります。
これらの”原点の管理”は Databus/Syncで行われています。
FDMiは、DataBus/Syncを含むFDMiReferencePointが、Transformを動的に組み替え、原点の位置を常にLocalPlayerの近くに移動させます。
これにより、地球程度の大きさであれば、自由に移動ができます。
さて、FDMiでは同期を含む様々な挙動に 「機体内にLocalPlayerが入った・機体からLocalPlayerが出た」判定が重要になります。
その判定にはRelativeSyncPositionTriggerを使用します。
RelativeSyncPositionTriggerは、今回二か所にあります。
Databus/Vehicle/NotInZone/EnterZoneDatabus/Vehicle/OnlyIsRoot/OnlyInZone/ExitZone
それぞれについて見ていきます
2.1 Databus/Vehicle/NotInZone/EnterZone(機内に"入る")
Databus/Vehicle/NotInZone/EnterZoneを見ていきます。

PlaneTemplate.FDMiから機体を制作している場合、まずコライダーの位置がずれているはずです。いい感じに修正してください。(Transformを動かしてかまいません。)
今回のような単座機では、判定は極小でかまいません。(逆に旅客機や爆撃機の場合、大き目にとると良いでしょう)。
更に、Databus/Vehicle/NotInZone/EnterZoneのコライダー "Is Trigger" が ☑ になっていることを確認して下さい。
Box ColliderのComponentの中身が見えないときは、一度ほかのGameObjectを選択後、再度Databus/Vehicle/NotInZone/EnterZoneを選択してください。
次に、RelativeSyncPositionTriggerの設定を確認して下さい
- "Detect Enter" ⇒ ☑ (有効)
- "Detect Exit" ⇒ ☐ (無効)
次に、一つ上の階層、Databus/Vehicle/NotInZone/にあるFDMiObjectActivateInZoneついて、以下の設定を確認してください。
On When Disable⇒ ☑ (有効)

PlaneTemplate.FDMiから機体を制作している場合、InZoneの項目は設定されていませんが、後から自動で設定されます。
RelativeSyncPositionTriggerは、OnTriggerEnter/OnTriggerExitにより、Box Colliderからの出入りを取得します。
Detect Enterが☑(有効)なときは、以下のような動作を行います。
- ワールドの原点を飛行機中心にする
InZone = trueを設定する。- InZoneが自身の変更を検知し、あらかじめ登録されたGameObjectを呼び出す。
- InZoneは”LocalPlayerが機内にいる”状態を示す。
- InZoneが自身の変更を検知し、あらかじめ登録されたGameObjectを呼び出す。

また、FDMiObjectActivateInZoneは、InZoneの情報を基に、自身のGameObjectを入切します。
これにより、”飛行機の中にいるときのみ見える/動く”と”飛行機の外にいるときのみ見える/動く”を実現しています。

2.2 Databus/Vehicle/OnlyIsRoot/OnlyInZone/ExitZone
2.1と同様に、今度は”機体から出た”を検出するコライダーを作ります。Databus/Vehicle/OnlyIsRoot/OnlyInZone/ExitZoneを見ていきます。
まずコライダーの位置をいい感じに修正してください。(Transformを動かしてかまいません。)
ExitZoneでは、必ず判定を、機内の椅子・歩ける箇所を全て含む、大きな囲いで囲ってください。
更に、Databus/Vehicle/OnlyIsRoot/OnlyInZone/ExitZoneのコライダー "Is Trigger" が ☑ になっていることを確認して下さい。
次に、RelativeSyncPositionTriggerの設定を確認して下さい。
※ 2.1と反対のセッティングです!
- "Detect Enter" ⇒ ☐ (無効)
- "Detect Exit" ⇒ ☑ (有効)

次に、一つ上の階層、Databus/Vehicle/OnlyIsRoot/OnlyInZoneにあるFDMiObjectActivateInZoneついて、以下の設定を確認してください。
On When Disable⇒ ☐ (無効)
Databus/Vehicle/OnlyIsRootにあるFDMiRelativeSyncOnlyIsRootは、機内にいるとき、ワールドの中心に機体を固定するために使用されます。
Databus/Vehicle/OnlyIsRootの直下には、OnlyInZone以外を入れないでください。
スクリプト実行時、Databus/Vehicle/ModelにあるFDMiRelativeSyncModelTransformとFDMiRelativeSyncOnlyIsRootは協調して動作します。
Start()のタイミングで、FDMiRelativeSyncOnlyIsRootは自身をDatabus/Vehicleの外に出し、ワールド原点に固定します。InZone=trueになると、FDMiRelativeSyncModelTransformは自身をFDMiRelativeSyncOnlyIsRootの子に設定します。InZone=falseになると、FDMiRelativeSyncModelTransformは自身をDatabus/Vehicleの子に設定します。
機内にものを配置したいときは、Databus/Vehicle/Model以下に置くことをお勧めします。
2.3 機内の床コライダー
ここで、Databus/Vehicle/OnlyIsRoot/OnlyInZone/FloorColliderをみてみます。
先程のOnlyInZoneの機能を用い、機内だけで見える床を設定します。
機内で、人を立たせたい位置にコライダーを配置してください。

Databus/Vehicle/OnlyIsRoot/OnlyInZone/FloorColliderのLayerは"BoardingCollider"に設定します。
設定されていない場合、Unityの上部メニュー "FDMi/Setup/Setup Layer"をクリックしてください。
FDMi機は、InZoneの判定にあれば、制限なく何人でも乗れてしまいます。
ゲーム性に問題が生じる場合、床コライダー自体を消してしまいましょう。
2.4 機体外形コライダー
2.3は”機内”のときだけ有効になるコライダーです。機外の、機体同士の当たり判定などは、Databus/Vechicle/Colliders以下にコライダーを配置して設定してください。
LayerはWalkThroughを推奨します。
3. 椅子の配置
次に、機内で座れる”椅子”を配置します。
Databus/Vechicle/Model/SeatManager/PilotSeatを見てください。
- 配置を設定します。コライダーの判定を、
Box Colliderを調節して修正してください。 Box ColliderのIs Trigger⇒ ☑ (有効)- 座る位置を設定します。
Databus/Vechicle/Model/SeatManager/PilotSeat/Seatの位置を、座面あたりに設定します。 - 降りる際の位置を設定します。
Databus/Vechicle/Model/SeatManager/PilotSeat/Exitの位置を、降りるときの位置に設定します。 - 椅子から降りるボタンを設定します。
Databus/Vechicle/Model/SeatManager/PilotSeat/OnlyInSeat/ExitButtonの位置を調整します。

パイロット以外の椅子を増やしたいときは、Databus/Vechicle/Model/SeatManager以下にPilotSeatをコピーしてください。
その際、OnlyInSeat以下のInputの項目は、必ずメンテナンスしてください。
4. Setup All FDMi Components
ここまでの設定が終わったら、上部メニューのFDMi/Setup All FDMi Componentsを押します。
自動でワールド・機体の設定を行います。
上手くいけたら、DataBus/Data以下にたくさんのGameObjectが生成されているはずです。これらは、自動生成されたFDMiDataです。
DataBus/Dataの中にはInZoneもあるはずです。2.2で説明したInZoneがあります。
試しに、Databus/Vehicle/NotInZoneのInZone項目を空にした後、FDMi/Setup All FDMi Componentsを押してみてください。
自動でInZoneが割り振られているはずです。
Setup All FDMi Componentsは、可能な限り自動で設定を行います。 以下の場合は一度押してください。
- 新しく機体等を配置したとき。もしくは設定を変更したとき。
- 機体が上手く動かないとき