【VRChat】UdonSharpのライフサイクル:Start・Update・Interactを理解する

作成: 2025-12-19

スクリプトの実行タイミングを制御するイベントシステム。Start、Update、Interactなど主要なライフサイクルイベントの役割と実装パターン。

概要

UdonSharpスクリプトは、ただ書いただけでは実行されません。特定の「きっかけ」が発生したときに、対応する処理が自動的に呼び出される仕組みになっています。この「きっかけ」のことをイベントと呼びます。

例えば、「ワールドが始まった時」「プレイヤーがオブジェクトをクリックした時」「毎フレーム更新される時」など、VRChatのシステムは様々なタイミングでイベントを発生させます。私たちは、これらのイベントに対応するメソッドをスクリプト内に定義しておくことで、目的のタイミングで処理を実行させることができます。

本記事では、UdonSharpにおける最も基本的で重要なライフサイクルイベントについて、その役割と実行タイミング、そして具体的な使い方を解説します。

ライフサイクルとは

UdonSharpスクリプトがアタッチされたGameObjectは、シーンに配置されてから破棄されるまでの一連の状態変化を経ます。これをオブジェクトのライフサイクル(一生) と呼びます。ライフサイクルイベントは、この一生の特定の節目で自動的に呼び出されるイベントです。

UdonSharpイベントの実行タイミング

主要なライフサイクルイベント

ここでは、ワールド制作で特に頻繁に使用される5つの重要なイベントを紹介します。

1. Start

  • 実行タイミング: スクリプトが有効化されてから最初のフレームの更新前に、一度だけ呼び出されます。
  • 主な用途: 変数の初期化、他のコンポーネントの参照の取得(GetComponent)、ギミックの初期設定など、ワールド開始時に一度だけ行いたい準備処理に使用します。
using UdonSharp;
using UnityEngine;

public class StartExample : UdonSharpBehaviour
{
    private Rigidbody rb;

    void Start()
    {
        // このスクリプトがアタッチされているオブジェクトのRigidbodyコンポーネントを取得して変数に保存しておく
        rb = GetComponent<Rigidbody>();

        // コンソールにメッセージを一度だけ表示する
        Debug.Log("ゲームが開始されました!");
    }
}

2. Update

  • 実行タイミング: 毎フレーム(1秒間に何十回も)繰り返し呼び出されます。呼び出される間隔はPCの性能(フレームレート)に依存し、一定ではありません。
  • 主な用途: オブジェクトの移動や回転、プレイヤーからの入力の監視、時間の経過に伴う状態変化など、継続的に実行する必要がある処理に使用します。
public class UpdateExample : UdonSharpBehaviour
{
    public float rotationSpeed = 20.0f;

    void Update()
    {
        // このオブジェクトをY軸周りに毎フレーム回転させる
        // Time.deltaTimeを掛けることで、フレームレートに依存しない滑らかな回転になる
        transform.Rotate(0f, rotationSpeed * Time.deltaTime, 0f);
    }
}

注意: Updateは非常に高い頻度で呼び出されるため、この中で負荷の高い処理(特にGetComponentなど)を行うと、ワールドのパフォーマンスが低下する原因になります。準備処理はStartで行い、Update内は必要最小限の処理に留めるのが基本です。

3. Interact

  • 実行タイミング: プレイヤーがそのオブジェクトに対してインタラクト(デフォルトではPCのVキー、VRコントローラーのトリガーなど)した時に呼び出されます。
  • 主な用途: ボタン、スイッチ、ドアノブなど、プレイヤーが直接操作するギミックの作成に不可欠です。

Interactが動作するための前提条件:

  • オブジェクトにColliderコンポーネントが必要です(Box Collider、Sphere Colliderなど)
  • Udon BehaviourコンポーネントのInspectorで、Interaction Text(ホバー時に表示されるテキスト)とInteract Distance(インタラクト可能な距離)を設定できます
  • これらが正しく設定されていないと、Interactイベントは発火しません
public class InteractExample : UdonSharpBehaviour
{
    public GameObject targetLight;

    public override void Interact()
    {
        // targetLightのON/OFFを切り替える
        targetLight.SetActive(!targetLight.activeSelf);
    }
}

4. OnPlayerJoined / OnPlayerLeft

  • 実行タイミング:
    • OnPlayerJoined: 新しいプレイヤーがワールドのインスタンスに参加した時に呼び出されます。
    • OnPlayerLeft: プレイヤーがワールドのインスタンスから退出した時に呼び出されます。
  • 主な用途: 参加/退出メッセージの表示、プレイヤーリストの管理、ゲームの参加人数のカウントなどに使用します。引数として、対象プレイヤーの情報を格納したVRCPlayerApiオブジェクトを受け取ります。
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;

public class PlayerEventExample : UdonSharpBehaviour
{
    public override void OnPlayerJoined(VRCPlayerApi player)
    {
        Debug.Log($"ようこそ、{player.displayName}さん!");
    }

    public override void OnPlayerLeft(VRCPlayerApi player)
    {
        Debug.Log($"さようなら、{player.displayName}さん。");
    }
}

イベントの実行順序と分類

イベント名分類実行タイミング主な用途
Start初期化最初のフレーム更新前に1回変数の初期化、コンポーネント取得
Update更新毎フレームオブジェクトの移動、入力監視
Interactユーザー入力プレイヤーがインタラクトした時ボタン、スイッチなどの操作
OnPlayerJoinedネットワークプレイヤーが参加した時参加処理、プレイヤーリスト管理
OnPlayerLeftネットワークプレイヤーが退出した時退出処理、プレイヤーリスト管理

イベント駆動プログラミングの考え方

UdonSharpのプログラミングは、このように「イベントが発生したら、対応する処理を実行する」というイベント駆動モデルに基づいています。制作者は、様々なイベントに対してどのような処理を紐付けるかを定義していくことで、ワールドのインタラクションを構築します。

自分でプログラムの実行順序を細かく制御するのではなく、「もし〜が起きたら、〜をする」というルールのセットを記述していくイメージです。この考え方に慣れることが、UdonSharpを使いこなす上で非常に重要です。

まとめ

  • イベントは、UdonSharpスクリプトが実行される「きっかけ」です。
  • Start一度だけ実行される初期化用のイベントです。
  • Update毎フレーム実行される継続処理用のイベントです。
  • Interactはプレイヤーのクリックに反応するイベントです。
  • OnPlayerJoined / OnPlayerLeftはプレイヤーの出入りに反応するイベントです。
  • UdonSharpは、これらのイベントに応答する処理を記述していくイベント駆動モデルでプログラミングを行います。

これらの基本的なイベントを組み合わせるだけで、すでに多くの面白いギミックを作成することができます。