通知
すべてクリア
23/04/2026 2:54 pm
アイテムリストの作成に関する質問です。
ItemContents と ItemListManager の間で、なぜ delegateを使う設計にしているのでしょうか。
ItemContents 側で ItemListManager を参照して直接 OnClickItemButton を呼ぶ形(Findで取得するなど)だと、処理負荷の面で問題が出るからでしょうか。今回の例だとdelegate経由で関数を往復に渡すのが難しく感じたので、delegate を使うメリットを知りたいです。
This topic was modified 1時間前 by Student
23/04/2026 2:55 pm
1. 疎結合(Loose Coupling)にできる• ItemContentsは、ItemListManagerの存在を知らなくて良い。直接参照すると、「ItemContentsはItemListManagerを知っていないと動かない」=強く結びついてしまう(密結合)。• delegateで関数を渡せば、「誰がその関数を処理するか」をItemContentsは知らなくて済む。
2. 拡張や再利用がしやすくなる将来、別の画面や機能で
ItemContents を使いたくなったとき、 ItemListManager に依存していたら、使いまわしが面倒です。でも delegate を使っていれば:- 他のクラスでも
onClickItemに好きな処理を渡せば使える! - テストもしやすくなる!(モック関数を渡すだけでOK)
3. 処理の分岐や複数登録が簡単になる(イベント的にも使える)delegate は
+= で複数の関数を追加することもできます。onClickItem += LogItemClick; onClickItem += SendAnalytics;
ボタンが押されたときに複数の処理を同時に走らせたいときにも便利です。
4. UnityのFindはコストが高い
GameObject.Find()やGetComponent()は実行時に検索処理が走るため、毎回呼ぶのはパフォーマンス的に非効率。- delegateなら、関数を事前に渡しておけるので、処理も一発・軽い。
たとえ話で理解するなら、
ItemContents = スイッチ
ItemListManager = 電源ユニット
直接配線(Find)すると、スイッチの中に「電源ユニットがどこにあるか」を書き込む必要がある。
- delegateでつなげるなら、「このスイッチが押されたら、この処理を呼んでね」というケーブルだけ差し込んでおけばOK。

