绑定
不在 Inspector 里连任何线,也能知道玩家动了控件。
玩家拖动滑条,音乐就变大。在世界里手写出来,这件事是:在 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。