はじめに

導入して、コントロールを見張り、値からラベルを動かすところまで。

更新日 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 に代入してコントロールを動かしても起きません。代入したコードはもう知っているからです。

別のビヘイビアにあるハンドラ

ハンドラはバインディングと同じ場所にいなくても構いません。

public Scoreboard display;

volume.OnChanged += display.Show;

プレイヤーがコントロールを動かすと、別のビヘイビアの Show に届きます。これもインスペクターでの配線は要らず、メソッド名はコンパイラが見てくれるものです。

よくある間違い

フィールドではなくローカルにしてしまう。 いちばん多い間違いです。Watch は何も返さず、コントロールはただ何も報告しません。

Poll() を忘れる。 バインドした側は動くので(コントロールは値を追いかける)、配線し忘れというより半分壊れているように見えます。

二度走る Start でバインドする。 害はありません。二度目のバインドは前のバインドを置き換えるので、ふたつではなくひとつになります。

ボタンを期待する。 ButtonBinding はありませんし、作れません。理由はリファレンスにあります。

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