2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UIの面倒事すべてをスクリプトひとつで解決

Last updated at Posted at 2021-11-12

「UI周りがごちゃごちゃしないようにプロジェクトの最初から最後まで面倒を見続けてくれる誰か」が居ないプロジェクト向け。

下手なことするよりは分かりやすいし拡張性もある、というモノをサクッと作れるように。

Unity での UI 作成はすごく面倒

その理由は UI イベントの発生時、イベントコールバック側からは発生元のオブジェクトや変更された数値、状態などの情報が何も得られないから。

とりあえずイベントの発生元が分からない問題をどうにかしよう。というかそれさえ解決すればすべてがうまくいく、ということで、その試みと結果がコチラ。

イイところ・ダメなところ

✅ 指定のメソッドが実装されていれば実行。という Unity っぽさ。
✅ スクリプト1つ。余計な依存なし。
✅ イベントの発生元が通知される。イベントハンドラ側からの参照は不要。
ビルドして試してない。けど多分大丈夫。
❌ 楽するために無駄が多い。無駄が多いだけで処理自体は単純、重くない。
❌ イベントを Editor and Runtime にするとなんかエラー出る。

イベントハンドラの中身は UI の数値取ってきて実際に処理を行うメソッドに渡すだけ、1~2行なんてザラだしオブジェクト名で switch で十分でしょう。

ノープランで初めて「ラジオボタン作りたくなった」「チェックボックスの状態でコントロールオンオフしたくなった」て時もかなり気楽に対応できる。
~(若干冗長、2~3行で済んだことが5~6行になるかもしれないけど)~

ダウンロード&インストール

👉 UIEverything-Unity: Simplifies UI event handling on Unity.

イベントハンドラの実装

MonoBehaviourAwakeOnEnableStart 等と同様、イベントハンドラに指定のメソッドが実装されていれば発生元の 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 メンドクサイ! と思う理由ですかね。

「そういうの全部解決できますよ(どデカいライブラリどーーん)」もちょっと違うんですよね。もっと単純でいい。

--

以上です。お疲れ様でした。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?