快速开始

持有一个值,对它作出反应,再把它分享给另一个 behaviour。

更新于 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 值得弄清楚。它会用当前的值立刻调用这一个处理器。这就是后加入的 behaviour 补上进度的方式。没有它,处理器要等到下一次变化;一个在首个进球之后才启动的记分牌,会一直空着直到第二个进球。

与另一个 behaviour 共享

observable 是一个对象,所以第二个 behaviour 可以持有同一个:

public class Announcer : UdoniteBehaviour
{
    public Match match;

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

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

把它暴露成 ISubscribable<int> 而不是 Observable<int>,播报器就只能订阅、不能设置:

public ISubscribable<int> Score => score;

它是本地的,不是同步的

改变一个 observable 只会通知你自己这台客户端的订阅者。这个包里没有网络功能。

要共享一个值,就照常同步它,然后在回调里驱动 observable:

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

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

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

因为设置相同的值不会通知任何人,一次没有改变分数的反序列化只花一次比较,没有回调。

接下来

通知规则 讲订阅、退订以及在通知过程中写入,包括 Udon 直接拒绝的那一种。

出了点问题 重新加载