概要
インタラクティブなワールドとは、プレイヤーの働きかけ(インタラクション)に対して何らかの応答を返すワールドのことです。プレイヤーがギミックを操作するための入力方法を提供することは、ワールド制作の基本となります。
本記事では、UdonSharpでプレイヤーからの入力を受け取るための主要な方法を解説します。最もシンプルで汎用的なInteractイベントから、キーボードやVRコントローラーの特定のボタン入力を検出する方法までを学びます。
最も基本的な入力: Interactイベント

Interactは、VRChatに標準で組み込まれている最も基本的なインタラクションです。プレイヤーは、オブジェクトに十分近づいて照準を合わせると表示されるツールチップ(操作説明)に向かって、以下の操作を行うことでInteractイベントを発生させることができます。
- デスクトップモード:
Vキーを押す - VRモード: コントローラーのトリガー(人差し指のボタン)を引く
このイベントを処理するには、UdonSharpスクリプト内でInteractメソッドをオーバーライドします。
using UdonSharp;
using UnityEngine;
public class SimpleInteract : UdonSharpBehaviour
{
public override void Interact()
{
Debug.Log("オブジェクトがクリックされました!");
}
}
Interactを有効にするための条件
Interactイベントが発生するためには、対象のGameObjectが以下の条件を満たしている必要があります。
- Colliderコンポーネント: オブジェクトには
Box ColliderやSphere ColliderなどのColliderコンポーネントがアタッチされている必要があります。これにより、VRChatのシステムが「どこをクリックできるか」を認識します。 - Udon Behaviourコンポーネント:
Interactメソッドを持つUdonSharpスクリプトが割り当てられたUdon Behaviourコンポーネントが必要です。 - Interaction Text: Udon Behaviourコンポーネントの
Interaction Textフィールドに、何らかのテキスト(例: 「押す」)が入力されている必要があります。このテキストが、プレイヤーに表示されるツールチップになります。 - 距離: プレイヤーがオブジェクトから一定の距離(デフォルトでは約2メートル)以内にいる必要があります。この距離は
Proximityフィールドで調整可能です。
これらの条件が一つでも欠けていると、Interactは機能しません。反応がない場合は、まずInspectorでこれらの設定を確認しましょう。
高度な入力検出: Inputクラス
Interactは便利ですが、「クリック」という単一のアクションしか検出できません。ジャンプ、ダッシュ、メニューを開くなど、より多様な入力を扱いたい場合は、UnityのInputクラスを使用します。Inputクラスのメソッドは、主にUpdateイベント内で使用し、毎フレーム入力を監視します。
1. キーボード入力の検出 (デスクトップ向け)
特定のキーが押されたことを検出する には、Input.GetKeyDown()を使用します。
Input.GetKeyDown(KeyCode.Space): Spaceキーが押された瞬間にtrueを返します。Input.GetKey(KeyCode.W): Wキーが押されている間、ずっとtrueを返します。Input.GetKeyUp(KeyCode.LeftShift): 左Shiftキーが離された瞬間にtrueを返します。
void Update()
{
// Rキーが押された瞬間にリセット処理を呼ぶ
if (Input.GetKeyDown(KeyCode.R))
{
ResetGimmick();
}
}
void ResetGimmick()
{
Debug.Log("ギミックをリセットします。");
}
2. VRChat Input Events(推奨)

キーボードのキーを直接指定する方法は、VRユーザーがその機能を使えなくなるため、多くの場合は不適切です。VRとデスクトップの両方に対応した入力を実装するには、VRChat提供のInput Eventsを使用するのがベストプラクティスです。
Input EventsはInteractと同様に、オーバーライドして使用するイベントです。
using UdonSharp;
using UnityEngine;
using VRC.Udon.Common;
public class InputEventExample : UdonSharpBehaviour
{
// ジャンプボタンが押された/離されたときに呼び出される
public override void InputJump(bool value, UdonInputEventArgs args)
{
if (value) // true = 押された, false = 離された
{
Debug.Log("ジャンプボタンが押されました!");
}
}
// 使用ボタンが押された/離されたときに呼び出される
public override void InputUse(bool value, UdonInputEventArgs args)
{
if (value)
{
Debug.Log("Useボタンが押されました!");
}
}
}
主要なInput Events
| イベント名 | 発火条件 |
|---|---|
InputJump | ジャンプボタン(Space / A・Xボタン) |
InputUse | 使用ボタン |
InputGrab | グラブボタン |
InputDrop | ドロップボタン |
InputMoveHorizontal | 水平移動入力 |
InputMoveVertical | 前後移動入力 |
InputLookHorizontal | 視点水平入力 |
InputLookVertical | 視点垂直入力 |
3. Unity Input Manager(補助的な方法)
Unity標準のInput Managerで定義された「論理ボタン名」を使用することも可能です。ただし、VRChat環境では上記のInput Eventsの方がより確実に動作します。
Input.GetButtonDown("ButtonName")のように、ボタンの名前で入力を要求します。
Input.GetButtonDown("Jump"): 「ジャンプ」に割り当てられたボタン(デフォルトではキーボードのSpaceキー、VRコントローラーのA/Xボタンなど)が押された瞬間にtrueを返します。Input.GetAxis("Horizontal"): 「水平移動」に割り当てられた軸の入力値(-1.0〜1.0)を返します。キーボードのA/DキーやVRコントローラーのスティックの左右入力に対応します。
void Update()
{
// ジャンプボタンが押されたら、プレイヤーを上に飛ばす
if (Input.GetButtonDown("Jump"))
{
// Networking.LocalPlayerで自分自身の情報を取得
Networking.LocalPlayer.SetVelocity(new Vector3(0, 5f, 0));
}
}
主要な論理ボタン名
| ボタン名 | デフォルトのキー (Desktop) | デフォルトのボタン (VR) | 用途 |
|---|---|---|---|
Jump | Space | A / X ボタン | ジャンプ |
Grab | G | グリップボタン | 物を掴む(VRChat標準の掴むとは別) |
Use | E | ユースボタン | 物を使う(VRChat標準の使うとは別) |
Fire1 | 左クリック | トリガー | 攻撃、決定 |
Horizontal | A / D キー | 左スティック左右 | 水平移動 |
Vertical | W / S キー | 左スティック上下 | 前後移動 |
これらの論理名は、Unityのメニュー [Edit] > [Project Settings] > [Input Manager] で確認・カスタマイズできます。
InteractとInputの使い分け

-
Interactを使うべき場合:- 特定のオブジェクト(ボタン、ドアノブ、レバーなど)を直接操作するギミック。
- 「クリックする」という直感的な操作が適している場合。
- VR/デスクトップの違いを意識せずに、最も基本的な操作を提供したい場合。
-
Inputを使うべき場合:- プレイヤー自身の能力(ジャンプ、ダッシュなど)を実装する場合。
- 特定のオブジェクトに依存しない、グローバルな操作(メニューを開く、視点切り替えなど)を実装する場合。
- 押しっぱなしやアナログ入力(スティックの傾き)など、
Interactでは表現できない複雑な入力を扱いたい場合。
多くの場合、これら二つを組み合わせてギミックを構築します。例えば、「Interactで乗り物に乗り込み、乗り込んでいる間はInputで操縦する」といった実装が考えられます。
まと め
- プレイヤーからの入力を受け取る最も簡単な方法は、
Interactイベントを使用することです。 Interactを機能させるには、ColliderとInteraction Textの設定が不可欠です。- VRとデスクトップの両方に対応するには、VRChat提供のInput Events(
InputJump、InputUseなど)を使用するのがベストプラクティスです。 - より細かい制御が必要な場合は、
Update内でInputクラスのメソッドを使用します。 - オブジェクトに対する操作は
Interact、プレイヤー自身に対する操作はInput Events /Inputクラス、と使い分けるのが基本です。
プレイヤーがどのようにワールドと関わるかを設計することは、ワールド制作の面白さの核心部分です。