質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.49%

HearthStoneなどのカードゲームのスクリプトの構成はどうなっているのか

解決済

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 822

mamk

score 6

現状

現在Unityでカードゲームを作っています。
スクリプトの構成で迷っています。

予想

カードを作る際に、2つ選択肢があると考えています。

  • 1つのスクリプトにすべてのカードの情報を保存する。 
  • カード1枚のためにスクリプトを作り、そこにカードの情報を書き込む。 

1つ目の場合は、スクリプトの数が抑えられるけれど一つ一つのカードの効果を作るのが難しくなるというデメリットがありますが、
2つ目の場合は、カードが増えるたびにスクリプトのロードが遅くなりますが、一つ一つのカードのためにスクリプトがあるのでカードの効果を書きやすくなると考えています。

お聞きしたいこと

カードの種類が多く、カードの効果も細かいシャドバやhearthstoneは、上二つの予想とはまた違った構成で作られているのかなと思っています。
実際のところどのような構成で作られているのか、憶測でもいいので回答してくれるとありがたいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

※全ては「あなたの設計次第」です。
以下はぱっと思い付いた個人的意見であり、最適解でない可能性があります。


「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/02 07:35

    全く考えたことのない方法でしたのでビック知りました。とても勉強になります。
    丁寧な回答ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる