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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

3654閲覧

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

mamk

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

2クリップ

投稿2019/05/18 11:26

##現状
現在Unityでカードゲームを作っています。
スクリプトの構成で迷っています。
##予想
カードを作る際に、2つ選択肢があると考えています。

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

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

お聞きしたいこと

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

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/05/19 04:55

sakura_hana

総合スコア11425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mamk

2019/06/01 22:35

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問