スクリプティングとアニメーション
セッター
要素はプロパティのセッターで変更します。セッターは、YAUI が GPU に送るデータに変更を直接書き込み、影響を受けるものだけをマークします。
| 変更 | コスト |
|---|---|
| 色、ボックスのスタイル、描画変換、不透明度、ティント | すぐに書き込まれます。何も再構築されず、レイアウトも実行されません。 |
| レイアウトのスタイル (とボーダーの幅) | 要素を含む境界についてだけ、レイアウトが再実行されます。 |
| テキストのプロパティ | テキストが再生成されます。テキストのサイズが変わった場合にだけ、レイアウトが再実行されます。 |
| 階層 (要素の追加、削除、並べ替え、有効化) | パネルの描画順が作り直されます。 |
何も変わらなければ、YAUI のフレームごとのコストはほぼゼロです。
element.BackgroundColor = Color.red; // レイアウトなし
element.Translate = new Vector2(0f, -8f); // レイアウトなし
var layout = element.Layout; // 構造体: 読み出し、変更し、書き戻す
layout.Width = Length.Percent(50f);
element.Layout = layout; // 境界のレイアウト
text.Text = "Hello"; // 他の変更されたテキストと一緒に生成
Animator と Timeline
Animator と Timeline は、box.BackgroundColor、renderTransform.Translate、opacity、layout.Width.Value などの、要素のシリアライズされたフィールドをアニメーションさせることができます。YAUI はこれらの書き込みを (OnDidApplyAnimationProperties を通して) 検知し、要素を同期します。Inspector での変更 (Undo を含む) も同じように同期されます。
最高のパフォーマンスを得るには、レイアウトのプロパティではなく、描画変換、不透明度、色をアニメーションさせてください。これらはレイアウトを実行しません。
フレームパイプライン
YAUI はフレームの処理を分割し、重い部分をコードの実行中にワーカースレッドで実行します。
- Update、Animator、Timeline、LateUpdate: セッターが変更を書き込み、マークします。
- PreLateUpdate の開始時: それまでに変更されたテキストが、ワーカースレッドで生成を始めます。
- PostLateUpdate の開始時 (締め切り): 変更された構造とスタイルが適用され、レイアウトがワーカースレッドにスケジュールされます。
- 描画の直前: 結果が適用され、変換が伝播され (Burst)、変更されたデータが GPU にアップロードされます。
LateUpdate の後に行った変更は次のフレームに反映されます。ヒットテストは最後に描画された状態を使います。
同じフレーム内で変更の結果 (テキストのサイズなど) が必要なら、YauiPanel.ForceUpdate() を呼んでください。レイアウトを参照してください。
スクリプトからの要素の作成
要素は普通のコンポーネントです。Prefab をインスタンス化するか、パネルの下の新しい GameObject にコンポーネントを追加してください。
var go = new GameObject("Item", typeof(YauiElement));
go.transform.SetParent(list.transform, false);
var item = go.GetComponent<YauiElement>();
item.BackgroundColor = Color.white;
要素は有効になったときにパネルに登録され、無効になるか破棄されたときにデータを解放します。要素は Edit モードでも動作します (ExecuteAlways)。