※全ては**「あなたの設計次第」**です。
以下はぱっと思い付いた個人的意見であり、最適解でない可能性があります。
「1つのコンポーネント(=スクリプト)には1つの機能」
「1つのオブジェクトに複数のコンポーネントを付与することでそのオブジェクトの意味を持たせる」
というのがUnityのコンポーネントの基本的な考え方です。
基礎的なコンポーネントで考えるなら、以下のような感じです。
- 位置・向き・大きさを司るコンポーネント:Transform または RectTransform
- 物理演算を司るコンポーネント:Rigidbody
- 描画を司るコンポーネント:〜Renderer
どんなオブジェクトにも位置・向き・大きさはあるのでTransformは必須ですが、
Rigidbodyや〜Rendererは、それが必要なオブジェクトにしか付与しませんよね?
自作スクリプトの場合も同じです。(以下、クラス名は適当)
- 名称・カードタイプ等のカードの基礎パラメータを司るコンポーネント:CardParameter
- HP・攻撃力等のミニオンのパラメータを司るコンポーネント:MinionParameter
- 「無敵」「疾風」「凍結」等のミニオンの所有能力や状態異常を司るコンポーネント:MinionStatus
- ミニオンとしての行動(場に出る・攻撃する・ダメージを受ける等)を司るコンポーネント:MinionAction
- 「選択」効果を司るコンポーネント:EffectChooseOne
能力をステータス扱いにするか、別途コンポーネントにするかは正直好みです。
個人的には「boolやintで済むもの→ステータス」「追加入力や処理内容が大きいもの→別途コンポーネント」と思いますが、例外もあるかもしれません。
なお、能力および状態異常は「〜〜した時(〜〜の場合)、〜〜」となると思うので、そこはなるべく共通化しましょう。
私だったらこんな感じにするでしょうか。
MinionStatusの中身
public List<Ability> abilityList;
Abilityの中身
public Target actionTarget;
public Timing timing;
public Target effectTarget;
public Effect effect;
public int count; //効果回数。−1なら永続とか。
public SpecialEffect specialEffect;
Enum Timing
- 常時
- 使用された時
- 召喚時
- 死亡時
- 攻撃した時
- 攻撃された時
(などなど)
Enum Target
- 無し
- 全て
- 自分
- ミニオン
- ヒーロー
(などなど)
Enum Effect
- ダメージを受けない
- 1ターンにn回攻撃
- ダメージを与える
- 特殊
(などなど)
つまり「何に対して・いつ何をしたら・何に対して・何の効果を与えるか」というリストを作ります。
あとはリストの上から順に条件判定をし、発動するなら効果を解決するというイメージです。
こうすれば「無敵」と「聖なる盾」は「countが違うだけの同じ処理」ですし、「攻撃する時にダメージを受けない」というテキスト効果もすぐ実現可能です。
一見面倒そうな「秘策」も同じ原理で処理出来ますし、「沈黙」は「対象ミニオンのabilityListを空にする」という処理になるでしょう。
(実際は条件が重なったり複雑化するのでもっと精査が必要でしょうけど)
なお、さり気なくSpecialEffect
というクラスが入っていますが、これはEffectChooseOne
のような効果コンポーネントの継承元のイメージです。
この辺は以下を読んだり「ポリモーフィズム」でググるといいかと思います。
プログラマー1年生がポリモーフィズムについて学んだのでRPGで説明する。 - Qiita
なお、実際は「ゲーム全体を進行させる管理スクリプト」や「チート対策」が入って来るので、上記の概念はUnity上では表現されないかもしれません。
(効果処理はサーバー上で処理してUnity上では結果だけ表示が主かと)
いきなりハースやシャドバクラスは大変だと思うので、
まずは「ミニオンは全部バニラ・スペル無し」で考えてみて、そこから効果を付け加えるならどうする?と考えるのがいいかと思います。
(コードに落とす前に日本語で書いてみるのもいいです、というかそうしないと辛いと思います)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/01 22:35