Observables

一个会在自己改变时通知订阅者的值,让分数和显示它的一切保持同步,而不需要一份要手动去戳的清单。

更新于 2026-09-07

分数变了,记分牌要重绘。门开了,三样东西要跟着反应。手写出来就是一个字段、一个 setter、一份要挨个通知的清单,以及有人漏掉其中一个时的第一个 bug。

Udonite Observables 就是把这个模式用普通 C# 写好一次。

using Udonite.Observables;

public class Scoreboard : UdoniteBehaviour
{
    public TextMeshProUGUI label;

    private Observable<int> score = new Observable<int>();

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

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

再次赋同一个值不会通知任何人。 这正是这个类型的意义。每帧赋值的 behaviour 花的是一次比较,而不是一轮回调;负责重绘标签的订阅者也不会被要求重绘一个没有变化的标签。

包含什么

类型 何时通知
Observable<T> 值被设为不同的东西时
ObservableList<T> 元素被添加、移除、替换或清空时
ObservableDictionary<TKey, TValue> 某个键被设为不同的值、被移除或整体清空时

ISubscribable<T> 是只读的一侧。用它作为字段类型,别人可以订阅但不能写入,这正是"能读分数"和"有权改分数"的区别。三种集合都对自身实现了它,所以订阅写法完全一致。

接下来

快速开始 从一个空 behaviour 讲到一个被两个 behaviour 监听的值。

参考 列出三个类型的每个成员,以及各自会通知什么。

通知规则 是发布前值得一读的部分:订阅者在被通知的过程中订阅、退订或回写会发生什么,以及其中哪些是 Udon 根本不允许的。

出了点问题 重新加载