ローグライクデッキ構築ゲームの作り方講座6 Unityでカードの効果・種類を定義する | Unity入門の森 ゲームの作り方

ローグライクデッキ構築ゲームの作り方講座6 Unityでカードの効果・種類を定義する

Unity 本格カードゲームの作り方 ハクスラローグライク×デッキ構築型カードバトルRPG「呪術迷宮」を作る


Unity入門の森オリジナル本格ゲーム制作講座はこちら
11種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

この記事はハクスラローグライク×デッキ構築型カードバトルRPG「呪術迷宮」の作り方講座の第6回です。

前回はカードをプレイするためのゾーンの構築を行い、さらに山札からプレイヤーの手札にカードを配る処理を開発しました。

前回の記事:

デッキ構築型カードゲームの作り方5 カードを配る・デッキからドローする処理の実装
この記事はハクスラローグライク×デッキ構築型カードバトルRPG「呪術迷宮」の作り方講座の第5回です。 前回では、戦闘に使うカードを手札やフィールド間でドラッグ&ドロップしたり、変な場所で手を離した場合にカードを手札の元の位置に戻すカード操作...

現状ではカードの種類・名前・効果が付けられていません。

今回はカードの種類ごとに異なる効果を設定できるように様々な種類の定義方法を駆使していきます。

カードを重ねることで効果を合体させるシステムの開発手法も同時にマスターしていきましょう!


【Line登録者限定のプレゼントもあるよ!】

カードバトルゲームのシステムをどう設計・実装していくか

カードバトルゲームを作る際にはそのゲームシステムを実現するためのクラスやオブジェクトの設計が必要になります。

例えば、カードバトルには「カードの名称」、「カードの効果説明文」、「カードの効果の種類」、「カードの効果量」などが最低限必要になりそうですよね。

複雑なシステムを作る場合は最初にどんなパラメータが必要になるかなど紙や表計算ソフトに書き出したりして整理しておきましょう。

さて、呪術迷宮のカードゲームではプレイヤーや敵の持つカードそれぞれに複数効果が付与されています。さらに、それらのカードは合成可能で、合成するとカード同士の持つ効果が合体されます。

カードゲームのように複雑なシステムを組む場合は上手にプログラミングを行い、カードの持つ効果やカード同士が重なったときの処理を構築しなくてはなりません。

今回はまずカードの効果の種類一覧を定義し、その効果の種類ごとに様々な情報を紐づけて呼び出す形で実装していきます。

カード効果の種類をクラスと列挙体を用いて一覧で定義・実装する方法

このゲームは1種類の効果を複数のカードが共通して持つこともあるので、カードそのものの情報と効果の情報は別々に定義しておきます。まずは効果の定義から行います。

新規クラスCardEffectDefineを作成します。作成場所はいつも通りScripts/Battle内でも構いませんが、Scripts以下にDefineというフォルダを作成してここに定義系クラスを格納する事にします。

フォルダ構成においてスクリプトの場所を後から変えても大丈夫ですが、移動させる場合は必ずUnityエディター上で操作するようにしてください。

定義の方法はいくつかありますが、まずは直接スクリプト内に書き込めるシンプルな形式をとります。

CardEffectDefine.cs

  • 8行目:[System.Serializable]はクラスの宣言に合わせて付与する事が出来る属性の1つです。クラスのシリアライズ(ファイル等への書き出し)が可能になります。今後セーブ&ロードの処理を実装した時に影響がありますが、今は忘れても大丈夫です。
  • 9行目:このCardEffectDefineはゲームオブジェクトにアタッチせず使用するのでMonoBehaviourを継承する必要はありません。
  • 12行目:[Header]は変数の宣言に合わせて付与する事が出来る属性の1つです。Inspectorでこの変数を表示した時に任意の文字列を説明文として表示する事が可能です。

現在はカードの効果3種類をenumで定義し、それぞれに対して「名前(日本語・英語)」「説明文(日本語・英語)」「合成モード」のデータを入力しています。ここから詳しく説明していきます。

Dictionary型を使ったカード効果種類と各種情報の対応付けについて

効果の種類別に定義したenumの定数データに対し、「この効果にはこの名前」と1つ1つデータを紐づけていく必要があります。1対1のペアで情報を格納する時はDictionary型が便利です。

例えば29行目ではstring型(文字列型)との紐づけを効果種別に対し行っています。初期化子を使ってスクリプト内に直接文字情報を書き込んでいます。

このDictionaryの値はゲーム中に変化する事がないのでreadonlyを付けて読み取り専用にしています。また、staticで宣言する事によって他のクラスから直接このDictionaryを読み取る事が出来るようにしています。

他のクラスからDictionaryの値を使いたい時、例えばDamage効果の日本語名を取得したい時は、

と呼び出す事によってstring型で名前データが帰ってきます。例えばDebug.Logで確認すると以下のように表示されます。

string.Formatメソッドを用いてカードの効果値を埋め込む

そして名前や説明文章を定義している所で 「 {0} 」という文字列が複数登場している事が確認できると思います。これは文字列内に変数を埋め込む時に使用する書式です。

このゲームではそれぞれの効果に「効果値」を持たせています(15行目に宣言している変数がそれです)。

全部ではないですが、多くがこの効果値によって戦闘に与える影響量が変化します。例えばDamage効果の効果値が10なら相手に10ダメージを与える結果になります。

その効果量を分かりやすく名前のそばに、あるいは説明文中の適切な位置に表示するために「文字列の中に変数を埋め込む」事が必要になります。それを実現できるのがこの書式という事になります。

変数の埋め込みはstring.Formatメソッドで行えます。第1引数に書式(文字列)、第2引数以降に埋め込みたい変数または定数を指定します。変数は何種類でも埋め込む事ができます。2つ目以降は {1}、{2}…と続けて対応させます。

埋め込んだ後の文字列は戻り値で返ってきています。試しに上記のように15という定数を埋め込んでDebug.Logで確認すればこのように表示されているはずです。

カード合成モードの定義について

スクリプトの後半では合成モードの種類もあわせて定義しています。こちらも各効果ごとにDictionaryで合成モードを紐づけて設定しています。

合成システムについては一度この講座の完成目標となるゲームを遊んでいただければ理解が深まるかと思います。enum型のEffectCompoModeを用いてカード合成モードを5種類で定義されています。

定数 名称(日) 説明
Possible 合成可能 他の合成可能カードと合成できる
Impossible 合成不可能 いずれのカードとも合成できない
OnlyNew 追加限定 合成可能だが、同じ効果があっても効果値の加算が行われない
OnlyOwn 自カード限定 自分のカードとしか合成できない
OnlyOwn_New 追加・自カード限定 「追加限定」と「自カード限定」2つの性質を併せ持つ

今後、カード合成システムを実装する時に必要になるので今のうちに設定しておきましょう。

ゲームに出てくる全てのカード効果のデータを設定する

カード効果やその対応関係の定義についての解説は以上になります。ここからはこの先の開発で必要になる全ての効果をまとめて定義していきます。

実際のゲーム開発ではこうした様々なカード効果を追加しながらゲームの機能拡張をしていくことになりますね。

ここでは、1つ1つ手作業で入力するのは大変なので以下のサンプルスクリプトをCardEffectDefine.csにコピー&ペーストすると良いでしょう。

続きを読む

このコンテンツはパスワードで保護されています。 コンテンツを読みたい方はUnity入門の森ショップ(https://unityforest.shop/)で講座閲覧権を取得してね。

ScriptableObjectファイルの読み取りについて

作成したカードデータファイルはスクリプトからの読み出しが可能です。試しにBattleManagerを拡張し、カードの効果名をデバッグ表示させてみましょう。

Inspectorからデバッグ表示させたいカードデータファイルをドラッグ&ドロップで指定して実行します。

先ほど設定した効果種類・効果値が正しく順番に表示できている事が確認できると思います。確認できたらBattleManagerスクリプトを元に戻してOKです。

サンプルゲームのカードデータ一例

これにてプレイヤーが使うカードの作成が可能になりました。同様に敵が使う用のカードも作成可能になっています。

(敵用のカードはScriptableObjects/EnemyCardsフォルダを作成して格納しましょう。また、プレイヤーと敵が両方とも同じカードを使う実装にしても問題ありません。)

以下、サンプルゲーム『呪術迷宮』にて使用しているカードデータの一部を例として提示します。同じように作る必要はありませんのでご参考程度にお使いください。

プレイヤーカード例

敵カード例

(↑23_Super FIreのSerial Numは23を入力。0になってますが間違いです)

まとめ

Dictionaryを使ってデータを組み合わせる方法、ScriptableObjectを使ってデータファイルをスクリプト外で編集できる機能などを駆使して効果データとカードデータの作成を行いました。

特にScriptableObjectは使いこなせばグループでのゲーム開発においても非常に有効な手法となるので覚えておくと良いでしょう。

次回はここで設定したカードのデータを、ゲーム上で生成されるカードオブジェクトに適用して表示させる部分を主に実装していきます。

次の記事:

デッキ構築型カードバトルゲームの作り方7 カード効果のUI反映・日英翻訳でローカライズ機能をUnityで実現
この記事はハクスラローグライク×デッキ構築型カードバトルRPG「呪術迷宮」の作り方講座の第7回です。 前回で一通りのカードデータとカード効果の設定を行いました。Unityで実践的なカードバトルゲームのカード効果の開発を経験できたかと思います...

Unity ハクスラローグライク×デッキ構築型カードゲーム「呪術迷宮」の作り方講座に戻る>>



Unity入門の森オリジナル本格ゲーム制作講座はこちら
11種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

コメント

  1. 匿名 より:

    執筆ご苦労様です。読んでいて混乱した点がありましたので、ご報告させていただきます。

    「ゲームに出てくる全てのカード効果のデータを設定する」の「CardEffectDefine.csに追記」という表記ですが、実際には追記というよりは全面的な変更だったため、しばらく戸惑いました。

    また、「Scriptable Objectを使って実際にカードを作ってみよう」では、Sprite Editorによって分割された画像が出てきますが、これの画像を展開するために「CardIcons」の再生ボタンのようなマークを押せばいいということが分からず、しばらく戸惑いました。

    ささやかですが、記事の質の向上に役立てば幸いです。

    • Unity入門の森 より:

      記事の解説部分へのフィードバックありがとうございます。
      記事に軽い修正を加えました。

タイトルとURLをコピーしました