绑定

不在 Inspector 里连任何线,也能知道玩家动了控件。

更新于 2026-09-08

玩家拖动滑条,音乐就变大。在世界里手写出来,这件事是:在 Inspector 里把滑条连到一个 UdonBehaviour,指向一个用手敲进去的字符串所命名的方法。拼错了、改了方法名、换了另一个 behaviour——什么都不会发生,也没有人告诉你。滑条照样能拖,就是没反应。

Udon 没有 UnityEvent,所以没有办法从代码订阅一个控件。这个包改为每帧去读控件,并给你一个编译器会检查的委托。

using Udonite.Binding;

public class Music : UdoniteBehaviour
{
    public Slider slider;
    public AudioSource music;

    private SliderBinding volume = new SliderBinding();

    public override void Start()
    {
        volume.Watch(slider);
        volume.OnChanged += Louder;
    }

    public override void Update()
    {
        volume.Poll();
    }

    private void Louder(float value)
    {
        music.volume = value;
    }
}

Inspector 里一根线也没有。Louder 是编译器认识的方法:改了名字就编译不过,而这正是重点。

需要的话,双向

Observable 是可选的一层。把 Watch 换成 Bind,控件和值就双向同步:玩家移动手柄,值跟着走;代码改值,手柄跟着走。

private Observable<float> volume = new Observable<float>(0.5f);

private SliderBinding slider = new SliderBinding();
private FillBinding meter = new FillBinding();

public override void Start()
{
    slider.Bind(volumeSlider, volume);
    meter.Bind(volumeBar, volume);      // 一个值,两种呈现
}

两者显示同一个数字,而彼此并不知道对方存在。

七个绑定

四个盯着玩家能操作的控件,需要在 Update 里调用 Poll()

绑定 控件
SliderBinding Slider
ToggleBinding Toggle
InputBinding TMP_InputField

三个由一个值去驱动,完全不需要轮询:

绑定 驱动什么
TextBinding<T> 标签文字,可在前后加字
ActiveBinding 显示或隐藏一个物体,也可反向
FillBinding 图片的填充量,范围由你指定

快速上手 是让控件跑起来的最短路径,参考 列出每个成员以及什么会触发它。

它不做的事

按钮。 点击是事件而不是值。滑条的位置随时可以读,"上一帧到现在有没有被点过"读不到,也就没有可轮询的东西。按钮仍然需要在 Inspector 里连线,这个包不假装能替你省掉。

URL 输入框。 VRCUrlInputField 不会获得焦点,在真正的 VRChat 客户端之外也无法输入,因此没有可绑定的东西。按 VRChat 的文档,在 Inspector 里用它的 OnEndEdit

出了点问题 重新加载