VRChat 水平面を走るバイクを作りました

こんにちは!Klueleです。

初めてのワールドができたので、次はPublic化できるワールド作成に挑戦しました。バイクが走るワールドは今まで見たことがなかったので、今回はバイクが走るワールドを作ってみました。

できるだけ本物に近いバイクの挙動をするオブジェクトを作ったつもりですが、一部有料のアセットを使っている都合上BOOTH等で公開することができません。代わりに、バイクの作り方をここに書いておきたいと思います。

まず、構成要素は全体で次の画像のようになっています。bike5_main以下のツリーを見てください。

・Sphere:バイクの挙動を安定させる役割を持つオブジェクト

・Cylinder:バイクの方向を制御するオブジェクト

・bike5:バイク本体

・Cube:バイクの進行方向、アクセルを制御するためのオブジェクト

画像では4つとも見えていますが、実際にはbike5以外のMeshRendererをoffにして見えなくします。

バイク周辺を拡大した図です。Cylinderの上にバイクが固定されたような構成になっています。バイクのハンドル付近にCubeを配置します。

各オブジェクトは各種jointで固定されています。

・Sphere-Cylinder間:Fixed Joint

・Cylinder-bike5間 : Hinge Joint

・bike5-Cube間 : Spring Joint

Cubeの設定を表示した図です。CubeにはRigidbodyとFixed Jointを設定する必要があります。TransformのZ=-30はバイクの安定性を変えるために調整します。バイクがアンダーステアな場合はZを0に近づけ、オーバーステアな場合はZをマイナスにしてバイクから遠くに配置します。

RigidbodyのDragはやや小さめな値(図では0.22)にすると、バイクの速度に影響がでにくいです。FixedJointはCylinderに固定しておきます。

Cylinderの設定を表示した図です。CylinderにはRigidbodyとConstantForceを設定する必要があります。バイクの速度を上げるため、Dragは小さい値(0.1)にします。また、アクセルをかけたときに方向が不安定にならないよう、Angular Dragはやや大きめ(100)にします。ConstraintsにはFreezePositionのYにチェックを入れ、上下方向に動かないよう固定します。また、バイクが水平方向のみ回転するようにFreezeRotationのXとZにチェックをいれておきます。

ConstantForceはアクセルの強さを記述します。RelativeForceのZにアクセルの強さ(80)を設定します。値が大きすぎると上にあるバイク本体が傾きやすくなるため、ちょうどよい範囲を探す必要があります。RelativeTorqueは今回はあまり意味がありませんが念のため数値を入れています。

バイク本体の設定を表示した図の2枚です。バイクにはRigidbodyとHingeJoint、BoxCollider、ConstantForce、VRC_Station、VRC_Triggerを設定する必要があります。

ある程度加速度が必要なため、RigidbodyのMassにはそれほど大きな値はいれなくてよいです。また、傾きすぎないようAngularDragにはやや大きな値(80)を設定します。

HingeJointはCylinderと固定し、Z軸を中心に回転できるようにします。Anchorは地面に近い場所がよいですが、バイクを傾けたときにタイヤが地面にめり込まないよう少し高さのある場所(Y=0.15)を設定しています。Springはある程度強めのSpring(180)とDamper(45)を設定します。DamperはSpringの1/5~1/3程度が操作しやすいようです。Limitは必要に応じて設定しますが、今回はSpringを固めにしたのでoffにしています。

BoxColliderはsitするためのトリガーになるので、1辺0.5~1.0くらいの立方体にしておきます。

ConstantForceは、バイクを傾けたときに内側に曲がるトルクをかけたいので、RelativeTorqueにX=-150を設定します。Cylinderに固定しないとバイクの前輪が浮いてしまいます。

VRC_StationはPlayerMobilityをImmobilize For Vihecleにして、乗車中のアバターが取り残されないようにします。

VRC_TriggerはOnInteractにSendRPC(UseStation)を設定し、BoxColliderをトリガーすると座るようにしておきます。

Cubeの設定を表示した図3枚です。Cubeには、VRC_TriggerとRigidbody、VRC_Pickup、SpringJointを設定する必要があります。

VRC_TriggerにはOnPickupUseDownとOnPickupUseUpを設定し、CylinderのConstantForceをToggleするように入力します。

Rigidbodyには、Use Gravityをoffにし、Is Kinematicをonにします。

VRC_Pickupの設定では、UseTextの文字列変更(Accel)とPickupableがonの状態にします。

SpringJointはbike5に接続するようにし、Springは大きな値(700)、Damperは小さな値(5)を設定します。Damperが大きいとバイクを傾ける動作が継続しすぎてしまい、操作性が悪くなってしまいます。

ここまで、水平面だけを走るバイクの設定の主な内容を列挙してみました。今後の調整で細かな数値は変わるかも知れませんが、だいたいここまで書いた内容で同じ挙動が再現できると思います。私自身はUnityに詳しいわけではないので、もっといい方法があるかも知れません。

私は、ここに書いた内容をもとにして、あまり酔わないレースができるワールドが増えればいいかなと思っています。

それでは、楽しいVRChatライフを!


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