バインディング

インスペクターで何も配線せずに、プレイヤーがコントロールを操作したことを受け取る。

更新日 2026-09-08

プレイヤーがスライダーを動かすと音楽が大きくなる。ワールドで手書きすると、これはインスペクターで 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 を使ってください。

問題が発生しました 再読み込み