快速开始
持有一个值,对它作出反应,再把它分享给另一个 behaviour。
安装
首先,通过 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 直接拒绝的那一种。