「UI周りがごちゃごちゃしないようにプロジェクトの最初から最後まで面倒を見続けてくれる誰か」が居ないプロジェクト向け。
下手なことするよりは分かりやすいし拡張性もある、というモノをサクッと作れるように。
Unity での UI 作成はすごく面倒
その理由は UI イベントの発生時、イベントコールバック側からは発生元のオブジェクトや変更された数値、状態などの情報が何も得られないから。
とりあえずイベントの発生元が分からない問題をどうにかしよう。というかそれさえ解決すればすべてがうまくいく、ということで、その試みと結果がコチラ。
UIの面倒事すべてをスクリプトひとつで解決しよう、という試み
— サトー™ (@sator_imaging) November 12, 2021
その2 完全に自動化した もうインスペクターと戦う必要はないな#unity3d pic.twitter.com/jthXEz9A7s
イイところ・ダメなところ
✅ 指定のメソッドが実装されていれば実行。という Unity っぽさ。
✅ スクリプト1つ。余計な依存なし。
✅ イベントの発生元が通知される。イベントハンドラ側からの参照は不要。
❌ ビルドして試してない。けど多分大丈夫。
❌ 楽するために無駄が多い。無駄が多いだけで処理自体は単純、重くない。
❌ イベントを Editor and Runtime
にするとなんかエラー出る。
イベントハンドラの中身は UI の数値取ってきて実際に処理を行うメソッドに渡すだけ、1~2行なんてザラだしオブジェクト名で switch
で十分でしょう。
ノープランで初めて「ラジオボタン作りたくなった」「チェックボックスの状態でコントロールオンオフしたくなった」て時もかなり気楽に対応できる。
~(若干冗長、2~3行で済んだことが5~6行になるかもしれないけど)~
ダウンロード&インストール
👉 UIEverything-Unity: Simplifies UI event handling on Unity.
イベントハンドラの実装
MonoBehaviour
の Awake
、OnEnable
、Start
等と同様、イベントハンドラに指定のメソッドが実装されていれば発生元の UI コントロールを添えて実行してくれる。
※ イベントを処理するコンポーネントは UIEverything
と同じ GameObject
に追加すること。
void OnSliderChanged(Slider sender);
void OnButtonClick(Button sender);
void OnToggleChanged(Toggle sender);
void OnInputFieldChanged(InputField sender);
void OnInputFieldChangedInteractive(InputField sender);
void OnScrollbarChanged(Scrllbar sender);
void OnDropdownChanged(Dropdown sender);
void OnScrollRectChanged(ScrollRect sender);
イベントハンドラ上のコンポーネントすべてが対象なので、重厚長大なコンポーネントひとつでもいいし、小分けで沢山ぶら下げても良い。
注意点
イベントハンドラから sender
に対して数値等の設定を行う場合は、SetValueWithoutNotify
を使う。
sender.value = ...
だとコールバックが一生ループするかも。
コンポーネントモードとヘルパー関数
UIEverything を Slider
または InputField
と同じ GameObject
に追加すると、コンポーネントモードとして動作する。
コンポーネントモードでは「スライダーと数値表示を連動させる」「入力フィールドとスライダーを同期させる」というよくある処理のヘルパー関数が使用可能になる。
ヘルパー関数一覧:
- Synchronize_Slider_to_Text
- 👇 小数点以下の扱いが違うバージョン
- Synchronize_Slider_to_Text_1_0
- Synchronize_Slider_to_Text_1_00
- Synchronize_Slider_to_Text_1_000
- Synchronize_Slider_to_InputField
- Synchronize_InputField_to_Slider

おわりに
Unity の UI はイベントが発生したことしか分からないので、コールバック側は事前に呼び出し元になる UI への参照を保持しておく、というのが当たり前の状態。
→ UI が増えた・減った
→ 色んなところに UI を参照するフィールドを増やす・減らす
→ 繰り返し
このあたりが UI メンドクサイ! と思う理由ですかね。
「そういうの全部解決できますよ(どデカいライブラリどーーん)」もちょっと違うんですよね。もっと単純でいい。
--
以上です。お疲れ様でした。