YOUTUBEのHOWTO動画を参考にオリジナルのカードバトルをUNITYで製作するシリーズ第8回。
前回は場に展開されたカードの攻撃可否の明示化と攻撃可否カードの判定部分を実装しました。今回もひきつづき参考動画をもとにゲーム製作を進めていきます。
1)デッキの作成
現状で手札カードの生成はパラメタとして引数に定数を渡していたため同じカードが表示されつづけました。今回はデッキをListで保持し、生成のたびにListから取得したカードIDを用いて生成後はデッキから削除するように実装します。
1)実施内容
・プレイヤデッキ、敵デッキのリストを定義(固定)
・「GameManager」クラスに「GiveCardToHand」メソッドを追加。カード生成時にListから取得し取得後はデッキから削除。
・同メソッドにデッキにカードがなかったら生成しない
2)終了時の状態
ゲーム開始時の初期配布カードが複数種類になりました。また、現状4枚しかカードを設定していないので4枚以上のカードが必要になった場合は生成されずにそのままスルーしています。
2.プレイヤー攻撃
ゲームとしてはカード同士の削り合いだけではなくプレイヤー自身へのアタックによる攻撃が必要です。ここではプレイヤー(敵)への攻撃処理の実装を行います。
1)実施内容
・新規に「AttackedHero」クラスを作成。実装はAttackedCardと同様(ただし守備カードはないため不要ロジックとして削除)
・新規に「GameManager」クラスにSerializedFieldのTextとしてプレイヤーHPとエネミーHPを作成
・「GameManager」クラスの「StarGame」メソッドに初期処理としてHP初期値を設定
・「GameManager」クラスに「AttackToHero」メソッドを追加。HPを引き算し攻撃済みカードは攻撃可否表示枠を非表示にする。
2)終了時の状況
攻撃可能カードの場合はエネミー本体へのアタックが可能になりました。また、攻撃済みの際は攻撃可否表示枠を非表示にして以降はエネミー本体および相手カードへの攻撃はできなくなりました。
3.敵カードによるプレイヤー本体攻撃
前回プレイヤー側からエネミー本体への攻撃を実装しました。ここでは逆にエネミーからプレイヤー本体への攻撃処理を実装します。
1)実施内容
・「GameManager」クラスの「EnemyTurn」メソッドの最初でエネミーが場に出しているカードは攻撃可能(フラグをTRUE)にする
・「GameManager」クラスの「EnemyTurn」で相手が場に1枚もカードがなかった場合は本体に攻撃する
2)バグ改修
以前FindAllの変数指定時に「card」がコンパイラにしかられたため別変数としたことを記事に記載しました。その際の改修漏れがもう一点発覚しました。これについてはFindAll仕様を理解していなかったためのミスとなりますので以下に訂正ロジックを記載します。実際には何度デバッグしても検索結果が0件となっていました。変数指定後に検索条件を指定する際の検索条件側変数も合わせて修正する必要があったということになります。
念のためFindAllの参考サイト「【Unity】配列やリストなどのコレクションの検索速度の検証結果」にて参考とさせていただきました。
// 修正前コード
CardController[] enemyCanAttackCardList = Array.FindAll(FieldCardList, n => card.model.canAttack);
// 修正後コード
CardController[] enemyCanAttackCardList = Array.FindAll(FieldCardList, n => n.model.canAttack);
3)終了時点の状態
相手ターン時に場にプレイヤーが場にカードを出していればカードに攻撃。カードがなければプレイヤー本体に攻撃するようになりました。
参考サイト
本記事についてはほぼ「Unityゲームスタジオ スタジオしまづ」さまの動画を参考に作業しております。本記事を元に興味をもった方がおりましたら、YOUTUBEサイトのほうで「登録」されてはいかがでしょうか?