前提・実現したいこと
Unity(C#)で、カードゲームを作っています。
カードの能力(カードを引くなど)をStrategyパターンで実装しました。
AddComponentでカード能力のクラスをアタッチし、コルーチンを動かすような作りになっています。
しかし、1個や2個の能力でしたら問題ないのですが将来的にカードの能力は100を超える可能性もあり、
100個クラスをAddComponentでアタッチするのはおかしな実装なのではないかと思っております。
(おかしくなければ解決です)
そこで、下記のコードでAddComponentが並ばないような実装方法などありますでしょうか?
よろしくお願いします。
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System; 5 6public class AbilityManager : MonoBehaviour 7{ 8 Dictionary<string,AbilityStrategy> strategyDic = new Dictionary<string,AbilityStrategy>(); 9 10 void Start() 11 { 12 // 【該当箇所】能力が1つ増えるごとにここのAddComponentが増えていきます…… 13 AbilityDraw ad = gameObject.AddComponent<AbilityDraw>(); 14 strategyDic.Add("draw", ad); 15 } 16 17 /// <summary> 18 /// アビリティを実行する 19 /// <summary> 20 /// <param name="ability">アビリティが書かれた文字列</param> 21 /// <param name="param">アビリティのパラメータ</param> 22 /// <param name="card">使用カード</param> 23 public IEnumerator RunAbility(string[] ability, string[] param, CardController card){ 24 bool isPlayer = GameManager.instance.IsPlayerTurn; 25 // 省略 26 27 // アビリティを実行する 28 int i = 0; 29 foreach(string abl in ability){ 30 if(abl != null && abl != ""){ 31 yield return StartCoroutine(strategyDic[abl].AbilityInterface(param[i],isPlayer)); 32 } 33 i++; 34 } 35 36 // 省略 37 } 38}
C#
1using UnityEngine; 2using System.Collections; 3using System.Collections.Generic; 4 5abstract public class AbilityStrategy : MonoBehaviour 6{ 7 public abstract IEnumerator AbilityInterface(string param,bool isPlayer); 8}
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class AbilityDraw : AbilityStrategy 6{ 7 public AbilityDraw() 8 { 9 } 10 11 public override IEnumerator AbilityInterface(string param,bool isPlayer) 12 { 13 yield return StartCoroutine(DrawHand(int.Parse(param),isPlayer)); 14 } 15 // DrawHandの中身は省略 16}
試したこと
AbilityManagerのStart()で、
strategyDic.Add("draw", new AbilityDraw());
と書いたところ、MonoBehaviourを継承したクラスをnewしてはいけません、
と警告された上にnullが返ってきてしまうためコルーチンが実行できませんでした。
AddComponentを使いなさいとも警告に出ていたので、ほかに方法はないのかもしれませんが……
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/01 13:07