見出し画像

VRChat ワールドに配置する車や乗り物の作り方

*********************************************************************************
* 注意 *
この記事で記述している内容は古く、2023年以降では非推奨な方法が書かれています。参考として記事は残してありますが新しくワールド作成する場合には他の記事を参考にしたほうがよいです。
*********************************************************************************

こんにちは!Klueleです。
この記事は2019年AdventCalendarの記事として書いています。環境はUnity2017.4.28f1を前提としているため、Unity2018に移行後は同じ方法で動作しなくなる可能性があります。修正する場所が判明したら更新しますので、気長にお待ちください。

なお、この記事はUnityの基本操作、ワールドの基本的な作成方法、アップロード方法は分かっている人向けに書いています。極力画像を使って誤解のないように書いていますが、初めての人には難しい箇所があるかもしれません。

ここから本題です。VRChatには様々な乗り物があります。椅子に座って自由に操縦できるオブジェクトは、初めての人でも気軽に楽しめるコンテンツなので、ワールドを作るときに知っていると便利なこともあります。

一方で、単純に物理演算だけでオブジェクトをスムーズに動かすのはとても大変な調整作業が必要です。この記事では、ほとんど調整作業なしでも簡単に乗り物(主に車のような挙動をするもの)を作成する方法を説明します。

大まかな手順は以下のようになります。
1.Standard AssetのVeheclesをインポートする
2.Carをワールドに配置する
3.不要なオブジェクトを無効化する
4.椅子と退出用オブジェクトを追加する
5.同期と挙動に関するパラメータを調整する

1.Standard AssetのVeheclesをインポートする
Unity2017のStandard AssetにはVeheclesのアセットがあります。メニューのImport Package > Vehiclesからインポートしましょう。

画像1

Unity2018, Unity2019の場合はUnityAssetStoreからStandard Assetsをダウンロード、インポートしましょう。

画像21

2.Carをワールドに配置する

インポートするとCarのPrefabが使えるようになります。CarのPrefabをHierarchyにドラッグして、ワールドに配置しましょう。

画像2
画像3

3.不要なオブジェクト・コンポーネントを無効化する
CarのPrefabには不要なオブジェクトがかなり含まれています。
以下のオブジェクトを無効にしていきます。
Car/Colliders/ColliderBody
Car/Colliders/ColliderBottom
Car/Particles/ParticleBurnoutSmoke
Car/SkyCar/SkyCarBody
Car/SkyCar/SkyCarBrakeLightsGlow
Car/SkyCar/SkyCarComponents
Car/SkyCar/SkyCarHeadLightsGlow
Car/SkyCar/SkyCarMudGuardFrontLeft
Car/SkyCar/SkyCarMudGuardFrontRight
Car/SkyCar/SkyCarSuspensionFrontLeft
Car/SkyCar/SkyCarSuspensionFrontRight
Car/SkyCar/SkyCarWheelFrontLeft
Car/SkyCar/SkyCarWheelFrontRight
Car/SkyCar/SkyCarWheelRearLeft
Car/SkyCar/SkyCarWheelRearRight

このリストの中でCar/Colliders/ColliderFrontが抜けているのは間違いではありません。コライダーを1個残しておかないと挙動がおかしくなるので必ず1個は残しておきます。

■変更前のHierarchy■

画像5

■変更後のHierarchy■

画像5

1個だけ残したコライダーCar/Colliders/ColliderFrontは、あまり影響がないようにTransform Position Yを2以上にするとか、LayerをPickupNoEnvironmentなど他と反応しないようなレイヤーにしておきます。コライダーとして機能しないような使い方でも、とりあえず残しておく必要があります。

初期状態で無効にしておくコンポーネントをここから書いておきます。
最初のCar User Control以外は好みで残しておいたり、編集してもいいのですがはじめは無効にしておくのが無難だと思います。
CarのCar User Control
CarのCar Audio
Car/WheelsHub/WheelFrontRightのAudio Source、Wheel Effects
Car/WheelsHub/WheelRearRightのAudio Source、Wheel Effects
Car/WheelsHub/WheelFrontLeftのAudio Source、Wheel Effects
Car/WheelsHub/WheelRearLeftのAudio Source、Wheel Effects

画像7
画像8

4.椅子と退出用オブジェクトを追加する

CarのPrefabの中央付近に椅子となるオブジェクトを配置します。
今回は例としてCube(Cube-Enter)を配置します。大きさはなんとなく各辺0.6mくらいにしています。椅子として座れるようにBox Collider、VRC_Trigger、VRC_Stationコンポーネントを追加します。
椅子となるオブジェクトの形やトリガーの大きさは必要に応じて変えても大丈夫です。

画像18

Box ColliderにはIs Triggerにチェックを入れてトリガー判定とします。
VRC_Triggerには、トリガーの種類をOnInteract、AlwaysBufferOneとし、4種類のActionsを追加します。
①SendRPC (UseStation) : ReceiversはCube-Enter
SetComponetActive : ReceiversはCar、ComponentはUnityStandardAssets.Vehicles.Car.CarUserControl、EnableはTrueとします。
③SetComponetActive : ReceiversはCuber-Exit、ComponentはUnityEngine.BoxCollider、EnableはTrueとします。
④SetComponetActive : ReceiversはCuber-Enter、ComponentはUnityEngine.BoxCollider、EnableはFalseとします。
VRC_StationのPlayer MobilityはImmobilize For Vehecle、Disable Station Exitにチェックを入れる、Seatedにチェックを入れます。必要に応じて、Station Enter Player Locationに座る位置を調整するためのオブジェクトを指定してください。

VRC_Triggerの①~④の説明:
①はプレイヤーがCube-EnterのトリガーをInteractしたときに座るために必要になります。
②はプレイヤーが座った後に、CarのPrefabがプレイヤーの操作に反応して動きだすための設定です。(初期状態ではCar/CarUserControlはFalseにしておく必要があります)
③は、一部説明が前後しますが、プレイヤーが乗り物から降りるためのトリガーを有効にするための設定です。
④は、椅子に座った後に他のプレイヤーが椅子に座れないようにトリガーを無効にするための設定です。

画像9
画像10
画像11
画像12

また、CarのPrefabにプレイヤーが乗り物から降りるために操作するオブジェクト(Cube-Exit)を配置します。Cube-Enterと逆のような設定をしますが、一応設定内容を羅列していきます。

大きさはなんとなく各辺0.3mくらいにしています。できれば色やテクスチャも変えておくと分かりやすいです。椅子に座った後に操作できるようにBox Collider、VRC_Triggerコンポーネントを追加します。

画像13

Box ColliderにはIs Triggerにチェックを入れてトリガー判定を入れるとともに、初期状態ではBox Colliderコンポーネントをoffにしておきます。
VRC_Triggerには、トリガーの種類をOnInteract、AlwaysBufferOneとし、4種類のActionsを追加します。
⑤SendRPC (ExitStation) : ReceiversはCube-Enter
SetComponetActive : ReceiversはCar、ComponentはUnityStandardAssets.Vehicles.Car.CarUserControl、EnableはFalseとします。
⑦SetComponetActive : ReceiversはCuber-Enter、ComponentはUnityEngine.BoxCollider、EnableはTrueとします。
⑧SetComponetActive : ReceiversはCuber-Exit、ComponentはUnityEngine.BoxCollider、EnableはFalseとします。

VRC_Triggerの⑤~⑧の説明:
⑤はプレイヤーがCube-ExitのトリガーをInteractしたときに乗り物から降りるために必要になります。
⑥はプレイヤーが降りた後に、CarのPrefabがプレイヤーの操作に反応しなくするための設定です。(乗っているプレイヤーがRespawnして降りてしまった場合は・・・なんとかしてCarをdestroyしてRespawnさせてください(他力本願))
⑦は、プレイヤーが乗り物に乗るためのトリガーを有効にするための設定です。
⑧は、乗り物から降りた後に降りるためのトリガーを無効にするための設定です。

画像14
画像15
画像16
画像17

5.同期と挙動に関するパラメータを調整する

ワールドにいる他のプレイヤーからもCarの同期を取るため、Carの中にVRC_Object Syncを追加します。VRC_Object Syncのチェックボックスは両方チェックした状態にします。

Cube-Enterには、VRC_TriggerにSendRPCを追加し、先ほど追加したCarのVRC_ObjectSyncのTakeOwnershipを指定します。

画像19

また、CarにはVRC_Pickupを追加し、pickupableのチェックは外します。

画像20

挙動の調節は主にCarにアタッチされているRigid bodyやCar Controllerコンポーネントの数値を変更して行います。この記事では必要最小限の内容を説明します。
安定して動くようであれば、Car/WheelsHubs/WheelHub* のWheel Colliderを変更してもよいのですが、Wheel Colliderのサスペンション関連のパラメータは極端に挙動が変わってしまうこともあり最初は変更しないのが無難です。

CarのRigidbodyでは、DragとAngular Dragの数値を変更します。
Dragは速度の落ちやすさ、Angular Dragは回転の止まりやすさを指定します。Dragは1~2の範囲、Angular Dragは10程度が操作性としてはやさしく、酔いづらいと思います。どちらも1以下にすると激しい挙動となり、初めての人には操作が難しくなるかもしれません。

Car ControllerではSpeed TypeをMPHTopspeedは20程度にします。Topspeed(最高速度)を36以上にすると同期もかなりずれやすいので、ある程度ゆっくりの数値に制限する必要があります。

画像6

なお、乗り物の種類によっては、滑りやすい挙動にしたいことがあるかもしれません。その場合は、Steer HelperやTraction Controlをデフォルトの値から小さくしていくと滑りやすくなります。

ここまでで、VRChatで使いやすい乗り物のオブジェクトの作り方を説明しました。文字だけだと分かりづらいかもしれません。画像を見ながら、まずは同じパラメータにして動かしてみると、理解は深まると思います。
それでは、楽しいVRChatライフを!

この記事が気に入ったらサポートをしてみませんか?