はじめかた
値を持ち、それに反応し、別のビヘイビアと共有するまで。
インストール
まず、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 が真正面から断るひとつを含めて。