はじめかた

値を持ち、それに反応し、別のビヘイビアと共有するまで。

更新日 2026-09-07

インストール

まず、VCC(VRChat Creator Companion)で Observables パッケージを Unity プロジェクトに追加します。プロジェクトの vccproject.json を開いてパッケージを追加するか、VCC インターフェースを使って直接インストールしてください。

インストール後、パッケージはプロジェクトで利用可能になり、以下の Observables API を使い始めることができます。

値を持つ

Observable<T> はほかのフィールドと変わりません。宣言したところで作れば、誰かが購読する前に存在します。

using Udonite.Observables;
using Udonite;
using UnityEngine;

public class Match : UdoniteBehaviour
{
    private Observable<int> score = new Observable<int>();

    public void Award()
    {
        score.Value = score.Value + 1;
    }
}

まだ何も起きません。聞いている人がいないからです。

反応する

購読者は値を受け取るだけの普通のメソッドです。

public override void Start()
{
    score.Subscribe(OnScoreChanged, true);
}

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

この true は理解しておく価値があります。このハンドラだけを、その場で、現在の値で呼びます。あとから参加したビヘイビアが追いつく手段です。これがないとハンドラは次の変更まで待つので、最初の得点のあとに動き出したスコアボードは二点目まで何も表示しません。

別のビヘイビアと共有する

オブザーバブルはオブジェクトなので、別のビヘイビアが同じものを持てます。

public class Announcer : UdoniteBehaviour
{
    public Match match;

    public override void Start()
    {
        match.Score.Subscribe(OnScoreChanged, true);
    }

    private void OnScoreChanged(int value) { /* ... */ }
}

Observable<int> ではなく ISubscribable<int> として公開すれば、アナウンサーは購読できても書き込めません。

public ISubscribable<int> Score => score;

ローカルであって同期ではない

オブザーバブルを変えると、伝わるのは自分のクライアントの購読者だけです。このパッケージにネットワーク機能はありません。

値を共有したいなら、いつも通りに同期して、そのコールバックからオブザーバブルを動かします。

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

public override void Start()
{
    syncedScore.Subscribe(OnScoreArrived);
}

private void OnScoreArrived(int value)
{
    score.Value = value;
}

同じ値を入れても誰にも通知しないので、スコアが変わっていないデシリアライズは比較一回で終わり、コールバックは走りません。

次に読むもの

通知の規則 は、通知の最中の購読、購読解除、書き込みを扱います。Udon が真正面から断るひとつを含めて。

問題が発生しました 再読み込み