キーボード入力の使用をプレイヤー単位で制御する方法
まえおき
VRChat にはキーボード入力に対応するトリガーとして
- OnKeyDown : キーを押した時に発生
- OnKeyUp : キーを離した時に発生
が用意されています。 オブジェクトに VRC_Trigger を追加してこれを記述すればキー入力に従って動作する装置がワールドに作れます。
ただしデフォルトでは、プレイヤーがワールドのどこに居ても反応しますし、 どのプレイヤーが入力しても反応するものになります。 実用的な装置ではこれでは困ることがあります。 解消するには、プレイヤーごとにキーボード操作の on/off を制御する機構を作る必要があります。
(分かる人向けの短い解説: キーボードフォーカスの機能は備わっていないのでワールド作成者が整える必要があります。 ローカルでのみ VRC_Trigger が有効になる機構を用意すれば、プレイヤーを限定したキー入力が実現できます。)
レシピ
(ここでは OnKeyDown, OnKeyUp トリガーの設定自体の説明は省略します)
- OnKeyDown や OnKeyUp を記述したオブジェクトを inactive にしておく
- インスペクタでの一番左上のチェックを off にする
- キー入力使用開始/終了時に触るスイッチのようなオブジェクトを用意する
- その
OnInteractトリガーの記述をBroadcast TypesをLocalで追加するAdvanced Modeをチェックしてからプルダウン中のLocalを選択
- アクションとしてステップ1のオブジェクト対象に
SetGameObjectActiveをOperationをToggleにする
これでスイッチを触った人の所(クライアント)だけでキーに反応するようになります。

発展、バリエーション
- 複数種類のキーを扱う場合には、
OnKeyDownやOnKeyUpを記述したオブジェクトを子として複数持つ親オブジェクトを作り、 それに対してSetGameObjectActiveを行うと簡素に構成できます。 - 例えばオブジェクトとして Cube を使えば、active になる(つまりキー入力できるようになる)と描画されるので、 「入力できる状態であるか」の表示機構をこのオブジェクト自身で実現できます。
- 前述の表示機構のようなものが不要であれば
SetGameObjectActiveではなく、SetComponentActiveでVRC_Triggerを制御しても構いません。 - 能動的にスイッチを押すのではなくアバターがあるエリアに居ることで動作するようにするには、Collider の
Is Triggerを有効にしたオブジェクトを配置します。そのVRC_TriggerのOnTriggerEnterでキーボード利用を開始できるようにキー反応のオブジェクトを対象にSetGameObjectActiveをTrueで呼び、同様にOnTriggerExitで終了するようにFalseをよびます。
補足
- この実装方法では「使用開始したい人は誰でもそうできる」ので、複数人が同時に使用可能です。
- 排他制御はどうやら現在(ver 0.12.0p12)は実装出来ないようです。
VRC_ObjectSyncのTakeOwnershipを実行したうえで、Broadcast TypesをOwnerにすればよさそうですが、 期待したように動作しません。実装不具合のように見えます。 (オブジェクトの owner と ワールドを開いた owner が混同されている?)
関連
- Broadcast Types
- Collider でアバターを検出するには layer が適切に設定されている必要があります。(公式の詳しい説明が無いので初期値の
Defaultでさしあたり良さそうではあります。)