Programming in VRChat

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

Station

プレイヤーを通常の移動操作から一次的に切り離しオブジェクトに関連付ける仕組み。 Station は「プレイヤーがとどまる場所」ぐらいの意味と思われる。 椅子や乗り物(Vehicle)の搭乗席などが実現できる。

Prefab

椅子: VRCChair を配置する。

任意の GameObject を椅子にする最小の手順

  1. VRC_Station コンポーネントを追加
  2. VRC_Trigger コンポーネントを追加
  3. VRC_Trigger の設定項目 OnInteract を選び Add
  4. Actions の追加操作して、 "Events from Scene" > このオブジェクト > "UseStation" を選択

Low level

  • VRC_Station が中心となるコンポーネント
  • Station Enter Player Location (Transform)
    • プレイヤーが station を使っている間、居る場所
    • 指定しない場合その VRC_Station (が属している GameObject の Transform)が使われる
    • この場所にとどまるようにプレイヤーのアバターは制御される。
    • この座標は椅子で言うところの座面中央ではない。
      • この場所の高さ(y座標)にアバターの足底が置かれ、脚を直角にまげてアバターとして自然な尻の高さが決まるようだ。
      • よって標準的なサイズより小さいアバターでは椅子にめり込み、大きなアバターでは尻が上空に浮く。
      • (小さいアバター向けに椅子を作るには、標準よりも少し持ち上げる必要があるということ)
  • station を使用開始する(station が椅子ならば、つまり座る)には SendRPC action で VRC_Station の UseStation メソッドを呼ぶ
  • Disable Station Exit が無効な場合、通常の移動操作で station の使用を終了し抜け出すことができる。
    • これが有効に働くにはその VRC_Station が属している GameObject が VRC_Trigger を備えている必要がある
      • その VRC_Trigger に Action の定義は必要無い。
      • (暗黙の action 定義があるということなのだろう)
  • Disable Station Exit を有効にすると通常操作では使用終了できなくなる(椅子から立てない)
    • この場合には SendRPC で VRC_Station の ExitStation を呼ぶと終了できる
  • トリガー
    • VRC_Station を追加したオブジェクトでは、VRC_Trigger でのトリガー選択肢に OnStationEnteredOnStationExited が増える。
    • OnStationEntered はプレイヤーが station を使用開始した時に発生する
    • OnStationExited はプレイヤーが station を使用終了した時に発生する

不明、不具合点

  • Can Use Station From Station は 「station から station へと直接移動ができるか」を指定する
    • ようなのだが、現在(version w_0.12.0p3)機能していないように見える。
    • 移動元、移動先の両方で有効にしていると操作 UI が表示されるが実際操作すると単に Exit する。
  • Seated は station 使用中にアバターが座る場合に有効にする
    • 無効にすると立ったままになるのだが、現在(version w_0.12.0p3)exit した時にそこから動けない不具合があるようだ。
    • さらに別の station があると抜け出せる。
    • 実用的に使うには、Disable Station Exit を有効にして(移動操作でなく)何らかのトリガーを使って ExitStation するようにし、そのトリガーの続きのアクションで別途の Seated が有効な VRC_Station に UseStation させるとよいだろう。ただし二番目の station からの ExitStation までを連続して行うと視点移動が正しく行われないとのこと。
  • Controls Object は station に居る間に移動操作などの影響の先がそれになるという形で乗り物を作るためのものらしい、が使用用法は分からなかった。
    • (筆者に Unity の常識的な知識が足りないため?)
  • VRC_Station が属している GameObject が VRC_Trigger を備えて いない 場合、なぜか "Sit" の表示が出て、実際 use できる。
    • だが、これだけでは抜け出せなくなる station になってしまう
    • そこに VRC_Trigger を追加して通常移動での exit 操作できるようにすると、今度は "Sit" が消えてしまう。 (こうしている意味が不明。)