Programming in VRChat

VRChat でのプログラミングについて調べたことの書き溜め

移動可能な椅子の作り方

概要

椅子の prefab である VRCChair をベースに、 座る機能はそのままに持って(=pickupして)運べるようにする機能を追加する。

f:id:naqtn:20180130030652p:plain

完成品:MovableChair.unitypackage

レシピ

  1. VRCChair をシーンに置く。
  2. 移動するための取っ手となるオブジェクトを作る。形や位置など調節する。
  3. ステップ1で作った VRCChair を取っ手オブジェクトの子に移動する。
  4. 取っ手オブジェクトに VRC_Pickup を付加する。
  5. VRCChair の床に接する底面になっている Cube に BoxCollider を付加する。
  6. 全体(つまり取っ手オブジェクト)に VRC_ObjectSync を追加する。

解説

  • 現在(バージョン 0.12.0p10)は、VRC_Pickup で動かす物体は、 その子以降に属している必要があるようです。
    • Phyical Root で任意の物体を動かせるようにしようとも見えるのですが、機能しません。
    • Unity の物理演算の仕組みのうち joint を使って連結する方法もあり得ますが、pickup した物体の動きに遅れて付いて来るので少し具合が悪いです。
  • VRCChair には collider の設定が無いので、追加しています。
    • これが無いと VRCChair 部分が床へすり抜けてしまいます。
  • 動かした状態を他のプレイヤーのマシンに伝達するために VRC_ObjectSync を追加しています。

追加レシピ:座った状態で運べないようにする

VR モードで椅子に座った状態で他の人に運ばれると、ものすごく酔います。 以下では、これを防止するために座った状態では運べないようにします。

  1. 上記で作成した、移動可能な椅子に含まれる VRCChair を選択する。 (つまり VRC_Station を持つオブジェクト)
  2. その VRC_Trigger の OnStationEntered トリガーを追加する。
  3. そのアクションに SetComponentActive を加える。
  4. Receivers に取っ手オブジェクトを設定する。
  5. Component に UnityEngine.BoxCollider を設定し、Enable は False にする。
  6. 同様に、OnStationExited を追加、アクション、Receivers、Component は同じく SetComponentActive、取っ手オブジェクト、UnityEngine.BoxCollider にして、Enable は True にする。

補足、ポイント

  • 椅子の上を歩くとプレイヤーが瞬間移動するように少し飛ばされてしまうことがあるようです。
    • BoxCollider を付加したオブジェクトのレイヤーを Walkthrough に設定するとこの現象を防ぐことができます。(ただしプレイヤーが椅子をすり抜けて歩くようになってしまいますが。)
  • 取っ手オブジェクトの形状や位置は、椅子がひっくり返っても困らないように工夫する必要があるでしょう。

Recipe: to make a movable-chair

  1. Put a VRCChair
  2. Make an object. adjust its shape and location as "handle" of the chair.
  3. Move handle object to be a child of the VRCChair in object hierarchy.
  4. Add VRC_Pickup component to the handle
  5. Add BoxCollider component to bottom Cube of the chair.
  6. Add VRC_ObjectSync component to whole of this movable chair (that is the handle object)

Additional recipe to prevent moving while someone seated:

  1. Select VRCChair of movable chair. (That has VRC_Station)
  2. Add OnStationEntered tigger to the VRC_Trigger
  3. Add SetComponentActive action to that trigger definition.
  4. Add handle object to Receivers of the definition.
  5. Select UnityEngine.BoxCollider Component from selection list, and set Enable to False.
  6. Same as step 2-4, add OnStationExited, set action, Receivers and Component as SetComponentActive, the handle, UnityEngine.BoxCollider. Then set Enable as True