Unityに関連する記事です

 デリゲートの実装方法について、活用事例を含めて紹介します。
ダイアログ(ポップアップ)内から外部クラスにある処理を制御する際に、デリゲートを利用した実装例です。

 今回の場合、引数付のデリゲートを利用し、ダイアログ内で情報を選択した前提で、その情報を外部クラス側に提供する処理を作成しています。

 前回の記事はこちらになります。

  => デリゲートの実装例



事前学習


 実装には UniRx を利用します。

 デリゲート、およびラムダ式による記述書式については、事前に理解しておく必要があります。
下記の教材を参考にしてください。

  => デリゲート
  => デリゲートとラムダ式の関係
  => デリゲートとラムダ式の活用事例


設計


 ダイアログ(ポップアップ)を制御する際にデリゲートを利用した実装例です。
最初の教材で提示した図を再掲載します。





 具体的な実装内容としては、メソッドの引数にデリゲートを活用することで、
ダイアログ側では管理側との依存関係を持たず、管理側のメソッドを実行することが可能になります。

 今回の場合、引数付のデリゲートを利用し、ダイアログ内で情報を選択した前提で、その情報を外部クラス側に提供する処理を作成しています。


動画ファイルへのリンク


 デリゲートの活用方法は前回と同じです。
クラス同士の依存関係を持たない状態で、外部クラスのメソッドを実行できる状態を作り出します。


ダイアログの作成


 すでに作成済の場合には、この手順はスキップし、次のスクリプトの修正に入ってください。



 Canvas 内に生成するためのダイアログを作成し、プレハブにしておきます。
作成するダイアログは任意です。

 ここではサンプルとして、各ゲームオブジェクトの画像を紹介します。














ItemData クラスの作成


 ダイアログ内で取得できる情報として、ItemData クラスを作成しておきます。
次回の手順では、この情報をボタンに紐づけて扱うようにします。


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



DialogBase クラスの修正

 
 DialogBaseクラスを修正します。

 UnityAction<ItemData> 型のフィールド onCloseActionItemData 変数は前回作成した onCloseAction 変数と同様に、外部クラスの処理を保持するために使用されます。
ここに処理を保持しておくことで、任意のタイミングで処理を実行できます。今回は ItemData 型の引数を定義しています。

 今回も直接的に外部クラスの参照を持たずに処理が実行できるため、依存関係がない(疎結合)状態が維持できています。


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




 新しく2つ目の SetUpメソッドを作成し、こちらは UnityAction<ItemData> 型の引数を受け取ります。
このメソッドも外部クラスから実行されますので、これにより、依存関係を持たずに外部クラスの処理をダイアログ内で実行できます。

 また、今回も OnEnterClose() メソッドと OnExitClose() メソッドにて、外部クラスの処理を実行する処理を書いています。
今回は引数を持っているメソッドを実行しているため、ダイアログ内で作成した情報を、外部クラスに提供することが可能になっています。


    // ItemData をインスタンスした上で引数で指定して、外部処理を実行
        onCloseActionItemData?.Invoke(new(1));  // ← 数字を変えると、変えた数字が外部クラスに届きます。試してみましょう。

 前回と同じように、外部クラスの処理がどういった処理なのかに合わせて、実行するタイミングを指定することで柔軟に対応が可能です。
これがデリゲートを活用した処理の大きなメリットになります。


DialogManager クラスの修正


 DialogManagerクラスを修正します。

 OpenDialog() メソッド内にあるダイアログを表示する処理の引数に
新しく作成する2つ目の CloseDialogAction メソッドを指定します。

 同名のメソッドは、引数の情報を変えることで2つ以上定義できます。
引数のオーバーロード機能です。調べておきましょう。


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




 OpenDialogメソッド内の処理を修正し、新しく作成した CloseDialogActionメソッドを指定します。
引数の情報を定義するため、ラムダ式を利用して処理を定義することで、ここでもデリゲート機能を利用しています。

 新しい CloseDialogActionメソッドも、ダイアログが非表示になったときに呼び出されるコールバック処理です。
今回はダイアログ内で設定された情報が引数を通じて届きますので、それをログとして表示しています。

 前回と同じで、この処理のポイントは、private メソッドである CloseDialogAction() メソッドが、
外部クラスであるダイアログ側から処理されて実行できる部分です。

 デリゲートを活用することで、クラス間の依存関係を保持せずに、外部クラスから処理を実行することが出来ます。
その上、外部クラスの情報を引数を通じて受け取るような形になっているので、ダイアログ内で設定された情報を、このクラス内で活用することが出来ます。

 この処理もテスト処理に該当しますので、同じような形で、外部クラスにメソッドを提供することでコールバック処理に出来ます


解説


 ダイアログ側には DialogManager への依存関係がありません。
そのため、メンバ変数などを用意せずに済んでいます。

 代わりに UnityAction のデリゲートを用意し、ここに SetUp メソッドの引数として DialogManager クラスから渡ってきているメソッドの参照を保持します。

 このような設計にすることで、ダイアログ側は管理側である DialogManager クラスへの依存関係を持たずに、DialogManager 内にあるメソッドを実行する仕組みが構築できます。



 つまり、デリゲートの活用により、DialogBaseクラスとDialogManagerクラスは依存関係を持たずに連携できます
具体的には、SetUpメソッドを通じて、DialogManagerクラスから外部の処理(CloseDialogActionメソッド)をDialogBaseクラスに渡すことができます。

 これにより、DialogBaseクラス内でダイアログの表示や非表示に関連する処理を実行しつつ、必要なタイミングでCloseDialogActionメソッドを外部クラスから実行できます。

 また、DialogManagerクラスはダイアログのテストと表示を管理する役割を果たし、DialogBaseクラスはダイアログの基本的な機能を提供する役割を果たしており、
これらのクラス間の協力がデリゲートを通じて実現されています。


まとめ


 引数付のデリゲートを使用することにより、外部クラスとのコミュニケーションを効果的に実現し、クラス間の疎結合性を保持しています。
今回はさらに、外部クラスの情報を引数を通じて別のクラスに提供する仕組みを実装できています。

 外部クラスの処理をデリゲートとして制御できるため、任意のタイミングで処理を実行できる部分もあり、実用性が高い設計になっており、
加えて、メソッドの引数を処理に組み込むことで、より多彩な処理が運用できる状態が出来ています。



 以上でこの教材は終了です。

  => 次は デリゲートの実装例 です。

コメントをかく


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

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

Menu



技術/知識(実装例)

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

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

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

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

レースゲーム(抜粋)

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

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

3D脱出ゲーム(抜粋)

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

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

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

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

VideoPlayer イベント連動の実装例

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

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

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

private



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

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