バインディング
インスペクターで何も配線せずに、プレイヤーがコントロールを操作したことを受け取る。
プレイヤーがスライダーを動かすと音楽が大きくなる。ワールドで手書きすると、これはインスペクターで UdonBehaviour に配線したスライダーが、手で打ち込んだ文字列の名前のメソッドを指している、という形になります。綴りを間違えても、メソッドの名前を変えても、ビヘイビアを別のものに差し替えても、何も起きません。誰も教えてくれません。スライダーはただ動き、何も起きない。
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;
}
}
インスペクターでの配線はひとつもありません。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 |
画像の塗り。範囲は自分で指定します |
はじめに が動くコントロールへの最短路、リファレンス が全メンバーと何がそれを起こすかです。
できないこと
ボタン。 クリックは値ではなく出来事です。スライダーの位置はいつでも読めますが、「前のフレームから今までにクリックされたか」は読めないので、ポーリングする対象がありません。ボタンは今もインスペクターでの配線が要りますし、このパッケージはそれをごまかしません。
URL フィールド。 VRCUrlInputField はフォーカスされず、本物の VRChat クライアントの外では入力もできないので、束ねるものがありません。VRChat が案内しているとおり、インスペクターで OnEndEdit を使ってください。