Unityに関連する記事です

 Mediator パターンと抽象化によるポップアップ管理の実装例です。
2回の手順に分けて実装を行います。

 複数のポップアップを1つのクラスで管理して新しいポップアップの表示・前のポップアップの非表示の制御の自動化を行います。


<完成動画>




Mediator(メディエーター) デザインパターン


 Mediator デザインパターンは、多数のオブジェクト間の調整や通信を中央に位置する Mediator(仲介者・調停者) クラスに委任する設計パターンです。
これにより、各オブジェクトが直接通信せず、中央の Mediator を介して相互にコミュニケーションすることが可能となります。

 今回の場合では、UI 内のポップアップの管理者(PopupManager)が主となり、異なるポップアップを制御し、調整することで、各ポップアップがお互いに直接通信するのではなく、
PopupManager(Mediator)を介して相互にコミュニケーションする形になります。これにより、各ポップアップは相互に疎結合になり、拡張や変更がしやすくなります。


複数のデザインパターンと抽象化によるクラス設計


 ポップアップ制御用の基底クラス PopupBase を作成し、派生クラスをサンプルとして3つ作成します。
基底クラスを作成して派生クラスで振る舞いを変えることにより、抽象化が行えます。

 その後、Mediator 用のポップアップ管理クラス PopupManager を作成します。
この PopupManager クラスで複数のポップアップの管理を行い、ポップアップの表示・非表示の制御を行います。

 最後にテスト用のクラスを作成して、複数のポップアップが正常に切り替わるかどうかをテストします。

 実際にはポップアップを制御したいクラスは色々なクラスに分散されます。
例えば、ゲーム開始時にポップアップを表示したい場合、ボタンに応じてポップアップを表示したい場合など、特定のクラスに限りません。
そのため、PopupManager はどのクラスからでもアクセスが可能である、シングルトンクラスとして用意しておくと、これらの挙動が実装しやすくなります。
これはシングルトンデザインパターンと呼ばれる実装パターンです。

 このように複数のデザインパターンの要素を取り入れた設計によるアプローチが有効です。



 DOTween、UniRx の各アセットを利用しています。

MicroSoft 公式ドキュメント
抽象化 (抽象型およびインターフェイス)



基底クラス ーPopupBase クラスー


 ポップアップ制御用の基底クラスです。
ポップアップを管理するクラス自体を抽象化しておくことにより、抽象的な設計デザインが可能になります。

 Canvas コンポーネントがアタッチされているゲームオブジェクトにアタッチして利用する前提です。

 PopupBase クラスには abstract 修飾子はついていませんが、継承前提で作成するのであれば
abstract 修飾子をつけて抽象クラスとしても作成しても、機能上、問題ありません。

MicroSoft C# ドキュメント
abstract 修飾子



PopupBase.cs

 <= クリックすると開きます。




 UI の場合、ゲームオブジェクトを SetActive で切り替えてしまうと、true になった際に再描画処理が走ります。

 Canvas を enabled で切り替えた場合には再描画処理は走りませんので、こちらの方が負荷のかからない表示切り替え処理になります。

 DOTween でアニメ付の表示制御する場合には、CanvasGroup を DOFade メソッドで表示制御しつつ、Blocks Raycast の切り替えを行うようにして対応します。


Unity 公式サイト
Unity UI の最適化に関するヒント



ポップアップ用のゲームオブジェクトの作成


 ポップアップ用のゲームオブジェクトを作成します。(作成済の場合にはこの手順はスキップします)

 ポップアップの切り替え制御を行う前提ですので、複数のポップアップ用のゲームオブジェクトを作成しておいてください。

 いずれも Canvas コンポーネント、CanvasGroup コンポーネントをアタッチしておいてください。
(新しい Canvas ゲームオブジェクトを作成して作っていくとつくりやすいです。)

 Canvas 内に子となる Canvas を作成する場合、Canvas Scaler コンポーネントは不要です。
また、タップなどの感知が不要な場合、Graphic Raycaster コンポーネントも不要です。

 ポップアップの状態に応じて、最適なコンポーネントをアタッチするように心がけていきましょう。


<ヒエラルキー画像例>



派生クラスの作成


 PopupBase を継承している派生クラス(子クラス)のサンプルを提示します。
作成したスクリプトは、各ポップアップ用のゲームオブジェクトにアタッチして利用します。

 なお、継承されている基底クラスはアタッチの必要はありません
よって、今回の基底クラスである PopupBase は派生クラスに継承されているため、PopupBase をアタッチする必要はありません。

 通常作成するスクリプトも MonoBehaviour クラスが継承されていますが、各スクリプトをアタッチする際に MonoBehaviour クラスはアタッチしていません。
それと同じ理由です。

 ここでは3つだけ作成していますが、実際には、ゲーム内に登場するポップアップの数に応じて、派生クラスを作成していってください。


<StoreGoodsPop クラス>


 お店用のポップアップです。


StoreGoodsPop.cs

 <= クリックすると開きます。



<インスペクター画像>



 スクリプトをアタッチすると Reset メソッドが実行されます。
そのため、Console ビューに Reset メソッド内の実行結果が表示されます。


<Console 画像>



 この時点で正常に必要となるコンポーネントが取得できているかを確認してください。


<CardDescriptionPop クラス>


 カード詳細を表示するポップアップです。


CardDescriptionPop.cs

 <= クリックすると開きます。



<インスペクター画像>



<TitlePop クラス>


 タイトル表示用のポップアップです。


TitlePop.cs

 <= クリックすると開きます。



<インスペクター画像>



 すべての必要なコンポーネントが取得できている状態になっていることを確認してください。


<Console 画像>



シングルトンクラス用抽象クラス ーAbstractSingleton クラスー


 シングルトンクラスを複数作成する予定がある場合、専用の基底クラスを作成しておき
それを継承して利用することで、自動的にシングルトンクラス化することが可能です。

 ここでは抽象クラスとして作成していますので、いずれかのクラスに継承する前提で作成しています。
そういった制限により、抽象クラス自体を直接ゲームオブジェクトにアタッチすることは出来ません。


AbstractSingleton.cs

 <= クリックすると開きます。


 <T>(ジェネリック)型の型引数を設定しているため、継承する際に、シングルトンクラス化したいクラスを指定して利用します。

 型引数に where 句で Component を指定しているため、指定先は Unity の Component 型に制限しています。
Component 型はすべてのゲームオブジェクトにアタッチされるベースとなるクラスです。
よって、自作した任意のクラスや Unity のコンポーネント名を指定することが可能です。

 ジェネリックを利用した設計のため、このクラスを継承すれば、どのようなクラスでもシングルトンクラス化できます。


MicroSoft 公式ドキュメント
where (ジェネリック型制約) (C# リファレンス)
Unity 公式スクリプトリファレンス
Component



 以上でこの手順は終了です。

 引き続き、Mediator クラスの作成などを行い、完成させていきます。

  => Mediator パターンと抽象化によるポップアップ管理の実装例

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます