Unity(C#)で絞り込み機能を作成しようと思っております。
●流れ
リスト画面 → フィルター(絞り込み)ダイアログ表示 → 項目設定 → 決定 → リストに反映
ここで用途がほぼ同じであり、項目もほぼ同じであるため共通してフィルター画面が使用できるようにしたい。
例
・アイテム一覧画面:アイテム一覧画面用フィルターダイアログを表示(使用)
・アイテム図鑑画面:アイテム図鑑画面用フィルターダイアログを表示(使用)
※各々の画面用のフィルターダイアログのPrefabおよびクラスを作成
ではなく!!!
・アイテム一覧画面:汎用アイテムフィルターダイアログを表示(使用)
・アイテム図鑑画面:汎用アイテムフィルターダイアログを表示(使用)
※汎用アイテムフィルターダイアログのPrefabおよびクラスを作成
というようにしたい。
※上記は用途とフィルターダイアログ内の表示がほぼ同じだからそうしたいという前提です。
上記の画面例でフィルターダイアログを開く際の表示項目の違い
・アイテム一覧画面
→アイテムタイプ
→アイテムレベル
・アイテム図鑑画面
→アイテムタイプ
→アイテム入手方法
※「アイテムタイプ」は両方で表示する
要は共通のものもあるが画面によって少し表示する項目が違かったり多かったりする。
しかし、「アイテム」という情報を使用してフィルター(絞り込み)をすることは変わらない
ポプマスのトレーニングとアイドル一覧のような感じでもありました
上記のような実装をしたい場合、どのような実装方法が思いつくでしょうか。
現状自分の方で思いついている方法について記載します。
C#
1/// <summary> 2/// フィルター画面に表示されうるすべての情報を持つクラス 3/// </summary> 4public class Model : MonoBehaviour 5{ 6 public enum ItemType 7 { 8 Weapon, 9 Armor, 10 Portion, 11 } 12 13 public enum ItemLvType 14 { 15 Lower10, 16 Lower30, 17 Lower100, 18 Upper100, 19 } 20 21 public enum ItemGetType 22 { 23 Drop, 24 Gacha, 25 Distribute, 26 } 27 28 // それぞれのカテゴリの情報 29 ReactiveProperty<ItemType> itemType = new ReactiveProperty<ItemType>(); 30 ReactiveProperty<ItemLvType> itemLvType = new ReactiveProperty<ItemLvType>(); 31 ReactiveProperty<ItemGetType> itemGetType = new ReactiveProperty<ItemGetType>(); 32 33 public void SetItemType(ItemType type) 34 { 35 this.itemType.Value = type; 36 } 37 38 // 以下略 39}
C#
1/// <summary> 2/// フィルターダイアログ表示クラス 3/// </summary> 4public class DialogView : MonoBehaviour 5{ 6 [SerializeField] 7 Button[] ItemTypeCategoryButtons; 8 [SerializeField] 9 Button[] ItemLvTypeCategoryButtons; 10 [SerializeField] 11 Button[] ItemGetTypeCategoryButtons; 12 13 public void Open(Model model, WindowType type) 14 { 15 // 全てのボタンを非表示にする処理あり 16 // 略 17 18 19 // 必要なボタンを表示する処理 20 if (type == WindowType.ItemList) 21 { 22 ItemTypeCategoryButtons.ToList().ForEach(x => x.gameObject.SetActive(true)); 23 ItemLvTypeCategoryButtons.ToList().ForEach(x => x.gameObject.SetActive(true)); 24 } 25 else if (type == WindowType.ItemBook) 26 { 27 ItemTypeCategoryButtons.ToList().ForEach(x => x.gameObject.SetActive(true)); 28 ItemGetTypeCategoryButtons.ToList().ForEach(x => x.gameObject.SetActive(true)); 29 } 30 } 31}
上記のように
・フィルターダイアログに表示されうる情報を一括で保持するクラスを用意し、表示の際は、「どの画面から表示されたか」「フィルターの情報」を渡して、「どの画面から表示されたか」の情報により表示する項目を決める、「フィルターの情報」のなかから使用する情報のみを取得してチェック状態であるかの切り替えをする、
というのかあります。
こちらの問題点としては
・少し項目が違うが似たような処理をする画面が増えた場合If文が多くなる
・Modelクラスがどんどん膨れていく(※1)
・項目も増えればPrefabも膨れていく(※1)
・項目をほんの一部しか使用しない画面でもこれを表示することになる。(※1)
※このフィルターダイアログは開いたら明示的に破棄しない限り破棄されず表示(項目切り替え含む)・非表示を繰り返す前提です。
表示毎にInstantiateしたくないため(してもいいのか?)
※1:そんなに多くの画面で使用するつもりはない想定(多くても3画面くらい)
以上、長くなりましたがよろしくお願いいたします。
どのような実装方法が思いつくか共有いただけたら幸いです。
あなたの回答
tips
プレビュー