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

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

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

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

Unity

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

Q&A

解決済

1回答

2099閲覧

シャドウバースの公開資料にあるカードスキル設計の詳細を理解したいです

massu2357

総合スコア17

C#

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

Unity

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

3グッド

5クリップ

投稿2020/02/19 15:40

編集2020/02/20 12:23

背景

カードゲームのスキル(カード効果)の設計方法についてご質問がございます。

株式会社Cygamesさんから公開されている、「【CEDEC 2019 フォローアップ】Shadowverse流開発手法 ~QAコスト削減と堅牢性強化を実現するプランナーによるテスト駆動開発~」という資料の中で、同社が開発しているデジタルカードゲーム「シャドウバース」のカードスキルは、以下の仕組みで構成しているとされています。

スキルの仕組み_1
スキルの仕組み_2
スキルの仕組み_3

https://speakerdeck.com/cygames/shadowverseliu-kai-fa-shou-fa-qakosutoxue-jian-tojian-lao-xing-qiang-hua-woshi-xian-surupurannaniyorutesutoqu-dong-kai-fa

知りたいこと

こちらのスキル構成に関しまして、実際のスクリプトでは、5つの要素に対して対応するメソッド(振る舞い)がたくさん用意されており、カード側で自身のスキルを満たすように、各要素のメソッドを組み合わせて呼び出すといったイメージなのでしょうか。

例えば5つの要素のうち、「Skill=メイン挙動の指定」の要素なら、対応するメソッド(振る舞い)は以下のようなイメージです。

func ダメージを与える() { } func 回復する() { }

試してみたこと

現在自分でもカードゲームを作っておりまして、自分の場合のスキルの設計は以下のようになっております。
(開発環境:Unity + C#)

  • 各カードは、効果クラス(Ability)で効果の情報を持つ。
  • Abilityクラスの中身は以下の通り。

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5[System.Serializable] 6public class Ability 7{ 8 public Timing Timing; // 発動タイミング 例) 召喚した時、破壊された時、ターン開始時、・・・ 9 public string AbilityName; // スキルタイプ 例) ダメージを与える、回復する、カードを引く、・・・ 10 public Target Target; // 発動対象  例) 相手フォロワー、相手リーダー、味方フォロワー、・・・ 11 public string TargetCondition; // 発動対象条件 例) コストX以下、体力X以下、・・・ 12 public int TargetOption; // 対象オプション 例) 「発動対象条件」のXに当てはまる数値です. 13 public int AbilityAmount; // 効果点数 例) ダメージ量、回復量、ドロー枚数、・・・ 14} 15 16public enum Timing 17{ 18 ON_PLAYED, 19 ON_DESTROYED, 20 ON_TURN_START, 21 ON_TURN_END 22} 23 24public enum Target 25{ 26 ALLIED_PLAYER, 27 ENEMY_PLAYER, 28 RANDOMLY_ALLIED_UNIT, 29 RANDOMLY_ENEMY_UNIT, 30 ALL_ALLIED_UNITS, 31 ALL_ENEMY_UNITS, 32 ALL_UNITS, 33 ALL, 34 SELECT, 35 SELF, 36 NONE 37} 38
  • 各カードクラス(CardLogic)は、このAbilityクラスのリストを持つ。
  • リストにしているのは、1枚のカードが複数の効果(=複数のAbility)を持つ場合があるため。

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5[System.Serializable] 6public class CardLogic 7{ 8 ... 9 10 public List<Ability> Abilities; 11 12 ...

これにより、例えば以下のようなスキルは実装できています。

  • 召喚時:カードを1枚引く。
  • 召喚時:相手フォロワー1体に3ダメージを与える。

しかし例えば、

  • 召喚時:このフォロワーの攻撃力が5以上なら「疾走」を持つ。7以上なら「守護」を持つ。10以上なら「破壊不能」を持つ。
  • 召喚時:デッキからスペルカードを1枚手札に加える。その後、相手プレイヤーにXダメージを与える。Xは手札に加えたスペルカードのコストに等しい。

のように、「Abilityクラスの要素で当てはめにくいスキル」や、「直前の効果の結果を参照して新しい効果を発動するスキル」などの実装はもう少し工夫が必要かも、、、と思う様になってきました。
複雑なスキルに関しては、個別にメソッドやクラスを作るべきなのでしょうか。。。(それだとメソッドやクラスが多くなり、カード種類の増加に耐えられなくなってしまう??)

今後、いろんなスキルのカードを作ってみたいと思っております!

何卒アドバイス等いただけると幸いです。

参考文献

INO_s, miso24, Hawn👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

こちらのスキル構成に関しまして、実際のスクリプトでは、5つの要素に対して対応するメソッド(振る舞い)がたくさん用意されており、カード側で自身のスキルを満たすように、各要素のメソッドを組み合わせて呼び出すといったイメージなのでしょうか。

実際のスクリプトがどうなっているのかは分かりませんが、基本的にはメソッドを組み合わせて実装する思われます。


ここからは複雑なスキルを実装する際の個人的な考えを書きます。

複雑なスキルに実装する時に、一番大事なのは「複雑なスキルは、分解して一つ一つの動作にする」ということだと思います。

例で挙げられた「召喚時:このフォロワーの攻撃力が5以上なら「疾走」を持つ。7以上なら「守護」を持つ。10以上なら「破壊不能」を持つ。」というスキルを分解してみます。

  1. 召喚時:このフォロワーの攻撃力が5以上なら「疾走」を持つ。
  2. 召喚時:このフォロワーの攻撃力が7以上なら「守護」を持つ。
  3. 召喚時:このフォロワーの攻撃力が10以上なら「破壊不能」を持つ。

すると、この3つの処理に分けられます。そうすると、複雑なスキルも単純なスキルの集まりで表現することができるようになります。

そうすれば、他の複雑なスキルも同様に考えることができます。

例に挙げられた「召喚時:デッキからスペルカードを1枚手札に加える。その後、相手プレイヤーにXダメージを与える。Xは手札に加えたスペルカードのコストに等しい。」というスキルについても分解してみます。

  1. 召喚時: デッキからスペルカードを1枚手札に加える。
  2. 召喚時: 相手プレイヤーにXダメージを与える。Xは手札に加えたカードのコスト

ここで、1の処理は他のスキル同様に実装することができますが、2の処理は直前に加えたカードの情報を得る必要があります。

「直前のスキルの結果」を参照する効果や「あるカードが場に出た回数」を参照する効果などの専用の処理が必要なものは個別の処理が必要だと思われます。

投稿2020/02/19 18:39

編集2020/02/20 03:07
miso24

総合スコア75

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

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

massu2357

2020/02/20 12:34 編集

早速ご回答いただき、ありがとうございます! なるほどです。 確かに複雑なスキル文章であっても、要素分解することで既存のクラスやメソッドを使って実現できそうですね! 「召喚時:このフォロワーの攻撃力が5以上なら「疾走」を持つ。」であれば、スキルは以下のようにできそうです!(Cygamesさんの公開資料のスキル構成に当てはめてみます) =================================================== Skill(メイン挙動) :疾走能力の付与 Timing(発動タイミング) :召喚時 Condition(発動条件) :このスキルを持つフォロワーの攻撃力がX以上なら Target(対象) :このスキルを持つフォロワー Option(数値などの細かい制御) :X=5 ===================================================
massu2357

2020/02/20 12:44

また、 「召喚時:デッキからスペルカードを1枚手札に加える。その後、相手プレイヤーにXダメージを与える。Xは手札に加えたスペルカードのコストに等しい。」 に関しましても、仰っていただいたように要素分解で対応できそうです。 直前のスキルの効果の参照に関しては、1つ前の効果を保持しておくクラスなんかを用意しておき、一時的にそのクラスのプロパティに情報を格納しておけば、直前の効果内容を参照する効果であっても、そのクラスから情報を引き出すことで実現できそうですね。
massu2357

2020/02/20 12:46

ご回答いただいた内容を踏まえまして、自分の設計方針でも対応できそうなイメージがつきました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問