質問: 現状 -- 現在Unityでカードゲームを作っています。 スクリプトの構成で迷っています。 予想 -- カードを作る際に、2つ選択肢があると考えています。 * 1つのスクリプトにすべてのカードの情報を保存する。 * カード1枚のためにスクリプトを作り、そこにカードの情報を書き込む。 1つ目の場合は、スクリプトの数が抑えられるけれど一つ一つのカードの効果を作るのが難しくなるというデメリットがありますが、 2つ目の場合は、カードが増えるたびにスクリプトのロードが遅くなりますが、一つ一つのカードのためにスクリプトがあるのでカードの効果を書きやすくなると考えています。 お聞きしたいこと -------- カードの種類が多く、カードの効果も細かいシャドバやhearthstoneは、上二つの予想とはまた違った構成で作られているのかなと思っています。 実際のところどのような構成で作られているのか、憶測でもいいので回答してくれるとありがたいです。
回答: ※全ては**「あなたの設計次第」**です。 以下はぱっと思い付いた個人的意見であり、最適解でない可能性があります。 「1つのコンポーネント(=スクリプト)には1つの機能」 「1つのオブジェクトに複数のコンポーネントを付与することでそのオブジェクトの意味を持たせる」 というのがUnityのコンポーネントの基本的な考え方です。 基礎的なコンポーネントで考えるなら、以下のような感じです。 * 位置・向き・大きさを司るコンポーネント:Transform または RectTransform * 物理演算を司るコンポーネント:Rigidbody * 描画を司るコンポーネント:〜Renderer どんなオブジェクトにも位置・向き・大きさはあるのでTransformは必須ですが、 Rigidbodyや〜Rendererは、それが必要なオブジェクトにしか付与しませんよね? 自作スクリプトの場合も同じです。(以下、クラス名は適当) * 名称・カードタイプ等のカードの基礎パラメータを司るコンポーネント:CardParameter * HP・攻撃力等のミニオンのパラメータを司るコンポーネント:MinionParameter * 「無敵」「疾風」「凍結」等のミニオンの所有能力や状態異常を司るコンポーネント:MinionStatus * ミニオンとしての行動(場に出る・攻撃する・ダメージを受ける等)を司るコンポーネント:MinionAction * 「選択」効果を司るコンポーネント:EffectChooseOne 能力をステータス扱いにするか、別途コンポーネントにするかは正直好みです。 個人的には「boolやintで済むもの→ステータス」「追加入力や処理内容が大きいもの→別途コンポーネント」と思いますが、例外もあるかもしれません。 なお、能力および状態異常は「〜〜した時(〜〜の場合)、〜〜」となると思うので、そこはなるべく共通化しましょう。 私だったらこんな感じにするでしょうか。 ``` MinionStatusの中身 public List 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上では結果だけ表示が主かと) いきなりハースやシャドバクラスは大変だと思うので、 まずは「ミニオンは全部バニラ・スペル無し」で考えてみて、そこから効果を付け加えるならどうする?と考えるのがいいかと思います。 (コードに落とす前に日本語で書いてみるのもいいです、というかそうしないと辛いと思います)