快速上手
安装它,盯住一个控件,再用一个值去驱动标签。
安装
首先,通过 VCC(VRChat Creator Companion)把绑定包添加到你的 Unity 项目。打开你项目的 vccproject.json 并添加包,或者使用 VCC 界面直接安装。
绑定包自动包含 Udonite 和 Observables,所以它们也会一起安装。
安装后,包在你的项目中可用,你就可以开始使用下面的绑定 API 了。
然后在脚本里:
using Udonite.Binding;
听一个控件
三行:一个存放绑定的字段,一次 Watch 开始,一次 Poll 维持。
public class Lights : UdoniteBehaviour
{
public Toggle box;
public GameObject lamp;
private ToggleBinding switched = new ToggleBinding();
public override void Start()
{
switched.Watch(box);
switched.OnChanged += Flip;
}
public override void Update()
{
switched.Poll();
}
private void Flip(bool on)
{
lamp.SetActive(on);
}
}
绑定是字段,不是局部变量。 拿着处理器的是绑定本身,所以它必须活得比创建它的方法久。局部变量一出作用域,控件就悄悄不动了。
Poll() 放在 Update 里。 每帧一次比较。玩家碰不到的控件可以不写,那样就什么都不会报告。
显示一个值
另一半不需要轮询。给绑定一个 Observable,值一变它就写进控件。
private Observable<int> score = new Observable<int>();
private TextBinding<int> scoreText = new TextBinding<int>();
public override void Start()
{
scoreText.Bind(label, score, "Score: ", "");
}
public void Goal()
{
score.Value = score.Value + 1; // 标签自己会更新
}
标签在绑定的那一刻就显示当前值,而不是等到下一次变化,所以记分板不会一直空着直到有人得分。
两个方向一起来
对被盯住的控件用 Bind,两件事一起做:玩家移动它,值跟着走;代码改值,控件跟着走。
private Observable<float> volume = new Observable<float>(0.5f);
private SliderBinding slider = new SliderBinding();
public override void Start()
{
slider.Bind(volumeSlider, volume);
}
public override void Update()
{
slider.Poll();
}
它们不会互相追逐。Observable 只在值真的不同的时候才通知,所以绑定因为自己的轮询而写回去的那一次什么也没改变,就此打住。
只有玩家的改动会触发 OnChanged。 通过给 Observable 赋值来移动控件不会触发,因为赋值的那段代码本来就知道。
处理器在另一个 behaviour 上
处理器不必和绑定待在同一个地方:
public Scoreboard display;
volume.OnChanged += display.Show;
玩家移动控件时,它会到达另一个 behaviour 的 Show。这同样不需要 Inspector 连线,而方法名是编译器会检查的。
常见错误
写成局部变量而不是字段。 最常见的一个。Watch 不返回任何东西,控件就只是永远不报告。
忘了 Poll()。 绑定的那一半仍然工作(控件会跟着值走),所以看起来像是坏了一半,而不是没接线。
在会跑两次的 Start 里绑定。 没关系:第二次绑定会替换掉前一次,所以你得到的是一个,不是两个。
指望有按钮。 没有 ButtonBinding,也不可能有。原因见参考。