快速上手

安装它,盯住一个控件,再用一个值去驱动标签。

更新于 2026-09-08

安装

首先,通过 VCC(VRChat Creator Companion)把绑定包添加到你的 Unity 项目。打开你项目的 vccproject.json 并添加包,或者使用 VCC 界面直接安装。

绑定包自动包含 UdoniteObservables,所以它们也会一起安装。

安装后,包在你的项目中可用,你就可以开始使用下面的绑定 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,也不可能有。原因见参考

出了点问题 重新加载