はじめに
導入して、コントロールを見張り、値からラベルを動かすところまで。
インストール
まず、VCC(VRChat Creator Companion)でバインディングパッケージを Unity プロジェクトに追加します。プロジェクトの vccproject.json を開いてパッケージを追加するか、VCC インターフェースを使って直接インストールしてください。
バインディングパッケージは Udonite と Observables を自動的に含むため、それらも一緒にインストールされます。
インストール後、パッケージはプロジェクトで利用可能になり、以下のバインディング 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 はありませんし、作れません。理由はリファレンスにあります。