Programming in VRChat

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

キーボード入力の使用をプレイヤー単位で制御する方法

まえおき

VRChat にはキーボード入力に対応するトリガーとして

  • OnKeyDown : キーを押した時に発生
  • OnKeyUp : キーを離した時に発生

が用意されています。 オブジェクトに VRC_Trigger を追加してこれを記述すればキー入力に従って動作する装置がワールドに作れます。

ただしデフォルトでは、プレイヤーがワールドのどこに居ても反応しますし、 どのプレイヤーが入力しても反応するものになります。 実用的な装置ではこれでは困ることがあります。 解消するには、プレイヤーごとにキーボード操作の on/off を制御する機構を作る必要があります。

(分かる人向けの短い解説: キーボードフォーカスの機能は備わっていないのでワールド作成者が整える必要があります。 ローカルでのみ VRC_Trigger が有効になる機構を用意すれば、プレイヤーを限定したキー入力が実現できます。)

レシピ

(ここでは OnKeyDown, OnKeyUp トリガーの設定自体の説明は省略します)

  1. OnKeyDown や OnKeyUp を記述したオブジェクトを inactive にしておく
    • インスペクタでの一番左上のチェックを off にする
  2. キー入力使用開始/終了時に触るスイッチのようなオブジェクトを用意する
  3. その OnInteract トリガーの記述を Broadcast TypesLocal で追加する
    • Advanced Mode をチェックしてからプルダウン中の Local を選択
  4. アクションとしてステップ1のオブジェクト対象に SetGameObjectActiveOperationToggle にする

これでスイッチを触った人の所(クライアント)だけでキーに反応するようになります。

f:id:naqtn:20180221203347p:plain f:id:naqtn:20180221203359p:plain

発展、バリエーション

  • 複数種類のキーを扱う場合には、 OnKeyDownOnKeyUp を記述したオブジェクトを子として複数持つ親オブジェクトを作り、 それに対して SetGameObjectActive を行うと簡素に構成できます。
  • 例えばオブジェクトとして Cube を使えば、active になる(つまりキー入力できるようになる)と描画されるので、 「入力できる状態であるか」の表示機構をこのオブジェクト自身で実現できます。
  • 前述の表示機構のようなものが不要であれば SetGameObjectActive ではなく、 SetComponentActiveVRC_Trigger を制御しても構いません。
  • 能動的にスイッチを押すのではなくアバターがあるエリアに居ることで動作するようにするには、Collider の Is Trigger を有効にしたオブジェクトを配置します。その VRC_TriggerOnTriggerEnter でキーボード利用を開始できるようにキー反応のオブジェクトを対象に SetGameObjectActiveTrue で呼び、同様に OnTriggerExit で終了するように False をよびます。

補足

  • この実装方法では「使用開始したい人は誰でもそうできる」ので、複数人が同時に使用可能です。
  • 排他制御はどうやら現在(ver 0.12.0p12)は実装出来ないようです。 VRC_ObjectSyncTakeOwnership を実行したうえで、 Broadcast TypesOwner にすればよさそうですが、 期待したように動作しません。実装不具合のように見えます。 (オブジェクトの owner と ワールドを開いた owner が混同されている?)

関連

  • Broadcast Types
  • Collider でアバターを検出するには layer が適切に設定されている必要があります。(公式の詳しい説明が無いので初期値の Default でさしあたり良さそうではあります。)