Observables
一个会在自己改变时通知订阅者的值,让分数和显示它的一切保持同步,而不需要一份要手动去戳的清单。
分数变了,记分牌要重绘。门开了,三样东西要跟着反应。手写出来就是一个字段、一个 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 根本不允许的。