【VRChat】ユーザー入力の検出をマスター:Interact・Input Eventsの活用法

作成: 2025-12-19

プレイヤーがワールドと対話するための入力検出方法。Interactイベント、VRChat Input Events、キーボード・VRコントローラー入力の実装パターン。

概要

インタラクティブなワールドとは、プレイヤーの働きかけ(インタラクション)に対して何らかの応答を返すワールドのことです。プレイヤーがギミックを操作するための入力方法を提供することは、ワールド制作の基本となります。

本記事では、UdonSharpでプレイヤーからの入力を受け取るための主要な方法を解説します。最もシンプルで汎用的なInteractイベントから、キーボードやVRコントローラーの特定のボタン入力を検出する方法までを学びます。

最も基本的な入力: Interactイベント

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が以下の条件を満たしている必要があります。

  1. Colliderコンポーネント: オブジェクトにはBox ColliderSphere ColliderなどのColliderコンポーネントがアタッチされている必要があります。これにより、VRChatのシステムが「どこをクリックできるか」を認識します。
  2. Udon Behaviourコンポーネント: Interactメソッドを持つUdonSharpスクリプトが割り当てられたUdon Behaviourコンポーネントが必要です。
  3. Interaction Text: Udon BehaviourコンポーネントのInteraction Textフィールドに、何らかのテキスト(例: 「押す」)が入力されている必要があります。このテキストが、プレイヤーに表示されるツールチップになります。
  4. 距離: プレイヤーがオブジェクトから一定の距離(デフォルトでは約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(推奨)

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)用途
JumpSpaceA / X ボタンジャンプ
GrabGグリップボタン物を掴む(VRChat標準の掴むとは別)
UseEユースボタン物を使う(VRChat標準の使うとは別)
Fire1左クリックトリガー攻撃、決定
HorizontalA / D キー左スティック左右水平移動
VerticalW / S キー左スティック上下前後移動

これらの論理名は、Unityのメニュー [Edit] > [Project Settings] > [Input Manager] で確認・カスタマイズできます。

InteractInputの使い分け

InteractとInputの使い分け
  • Interactを使うべき場合:

    • 特定のオブジェクト(ボタン、ドアノブ、レバーなど)を直接操作するギミック。
    • 「クリックする」という直感的な操作が適している場合。
    • VR/デスクトップの違いを意識せずに、最も基本的な操作を提供したい場合。
  • Inputを使うべき場合:

    • プレイヤー自身の能力(ジャンプ、ダッシュなど)を実装する場合。
    • 特定のオブジェクトに依存しない、グローバルな操作(メニューを開く、視点切り替えなど)を実装する場合。
    • 押しっぱなしやアナログ入力(スティックの傾き)など、Interactでは表現できない複雑な入力を扱いたい場合。

多くの場合、これら二つを組み合わせてギミックを構築します。例えば、「Interactで乗り物に乗り込み、乗り込んでいる間はInputで操縦する」といった実装が考えられます。

まとめ

  • プレイヤーからの入力を受け取る最も簡単な方法は、Interactイベントを使用することです。
  • Interactを機能させるには、ColliderInteraction Textの設定が不可欠です。
  • VRとデスクトップの両方に対応するには、VRChat提供のInput EventsInputJumpInputUseなど)を使用するのがベストプラクティスです。
  • より細かい制御が必要な場合は、Update内でInputクラスのメソッドを使用します。
  • オブジェクトに対する操作はInteract、プレイヤー自身に対する操作はInput Events / Inputクラス、と使い分けるのが基本です。

プレイヤーがどのようにワールドと関わるかを設計することは、ワールド制作の面白さの核心部分です。