最初のワールド

誰でも押せるボタンと、全プレイヤーに同じ数が見えるカウンターを、空のプロジェクトからアップロードまで約 15 分で作ります。

更新日 2026-09-13

作るのはカウンターです。誰でも押せるキューブ、押された回数を表示するラベル、そしてその数は 1 時間後に入ってきたプレイヤーを含む全員の画面で同じです。コンパイラ、ネットワーキングパッケージ、素の UI ラベルに触れます。実際のワールドがやることの大半を、約 20 行の C# で。

1. インストール

  1. VRChat Creator Companion で Settings → Packages → Add Repository を開き、https://udonite.github.io/vpm/index.json を貼り付けて Add をクリックします。
  2. ワールドプロジェクトを作成するか開きます。Unity 2022.3 と Worlds SDK 3.10 以降が必要です。
  3. プロジェクトのパッケージ一覧から UdoniteUdonite Net を追加します。

ここから先、Udonite は自動で C# を Udon にコンパイルします。Net パッケージはカウンターに必要な同期値を提供します。

2. シーンを組む

  1. GameObject → 3D Object → Cube を作り、Counter と名付けてプレイヤーが届く位置に置きます。キューブのコライダーが押せる理由です。
  2. GameObject → UI → Canvas を作り、Render Mode を World Space にし、読める大きさに縮めて(スケール 0.005 が目安です)キューブの上に置きます。
  3. キャンバスの中に UI → Legacy → Text を作り、Label と名付けてテキストに 0 と入力します。ここではレガシーのコンポーネントで十分で、何もインポートする必要はありません。

3. ビヘイビアを書く

Assets/Counter.cs を作成します。

using Udonite;
using Udonite.Net;
using UnityEngine;
using UnityEngine.UI;

public class Counter : UdoniteBehaviour
{
    public Text label;

    private Synced<int> count = new Synced<int>();

    public override void Start()
    {
        InteractionText = "Press";
        count.Subscribe(OnCountChanged);
        label.text = count.Value.ToString();
    }

    public override void Interact()
    {
        Ownership.Claim(gameObject);
        count.Value = count.Value + 1;
    }

    private void OnCountChanged(int value)
    {
        label.text = value.ToString();
    }
}

ワールド全体を支えているのは 3 つです。

  • Interact はプレイヤーがオブジェクトを押したときに走ります。UdoniteBehaviour の通常のメンバーなので、名前のタイプミスは何も起きないバグではなくコンパイルエラーになります。
  • Synced<int> は全クライアントが持つカウントです。.Value に書き込むと保存され、VRChat に複製を依頼します。後から参加したプレイヤーは、誰かが再送しなくても現在の値を受け取ります。書けるのはオブジェクトのオーナーだけで、そのために Ownership.Claim があります。押した人がオーナーになり、それから書き込みます。
  • Subscribe は値が届いたとき、書いたクライアントを含む全クライアントでハンドラを走らせるので、ラベルの更新はちょうど 1 か所です。Startlabel.text 行は、最初の変更が来る前の瞬間を埋めます。

ここに Udon 固有の構文はありません。同期モードと組み合わせる sync 属性も、呼び忘れるシリアライズメソッドも、避けるべきキーワードの一覧もありません。

4. アタッチしてコンパイルする

  1. Counter.csCounter キューブにドラッグします。
  2. インスペクターの Label フィールドに Label オブジェクトをドラッグします。
  3. シーンを保存します。

保存すればコンパイルされます。Udonite は C# コンポーネントの隣に Udon プログラムをアタッチします。成功すれば何も表示されず、Udon が実行できないものだけがコンソールに UDN コードと書き換え案つきで名指しで表示されます。Udonite → Open Window → Compile は全体を手動でコンパイルして概要を 1 行表示します。スクリプトをオブジェクトにドラッグした直後に便利です。

5. 試す

Play を押します。ClientSim がローカルプレイヤーを用意するので、キューブまで歩いて押してください。ラベルが増えていきます。Udon プログラムが動いている間 C# コンポーネントは無効になるので、試しているものがそのまま出荷されるものです。

ClientSim はシリアライズを実行しないため、エディター内ではカウントはローカルです。ネットワークを越えるのを見るには、SDK コントロールパネルの Build & Test を 2 クライアントで使います。片方で押せば、もう片方のラベルが追従します。

6. アップロード

ほかのワールドと同じように、VRChat SDK コントロールパネルからビルドしてアップロードします。出荷されるのは Udonite がアタッチした Udon プログラムで、C# は次の編集のためにプロジェクトに残ります。

次に読むもの

  • 全員が退出して戻ってきてもカウントを残す:Persistence
  • カウントが 100 を超えたら Discord チャンネルに知らせる:Net パッケージのメッセージと、ダッシュボードのホスティングされたリレー
  • 何がコンパイルできるか:言語サポートが一覧で、思っているより長いはずです
  • 何かが拒否されたとき:診断がすべてのコードを説明します
問題が発生しました 再読み込み