前回までの記事で、敵カードの攻撃実装まで出来たね!
やってない人は前回の記事参照↓
今回の記事では、前回の答え合わせをしていくよ!!
完成形はこんな感じ↓
前回の内容がわかっていればそこまで難しくなかったはず!!
出来た人も、出来なかった人もサックリやっていこー!!!
演習問題ってなんだっけ?
忘れてるひとが多いと思うから、まずは演習問題の振り返りをしていこう!
問題としては、
「敵の攻撃対象をランダムにしてみよう!」
ってものだったよね。
ということは、下記の2つが分かっている必要があるよ!
- 敵のカードが攻撃対象を決めているコード
- ランダム値の作成方法
このヒントを見て、「自分でも出来そうだ!!」ってひとはまずは自分でやってみてね!!
次からは実際に演習問題を解説していくよ!!
演習問題の解説!!
①攻撃対象を決めているコードを見つける
それではまずは敵のカードが攻撃対象を決めているコードを見つけよう!
コードで言うと、GameManagerクラスのEnemyTurnメソッドの中で、
「敵フィールドに攻撃可能なカードがあれば全部攻撃するよー!」
って処理をしているところだね。
実際のコードでは下記のオレンジの部分になるよ↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
IEnumerator EnemyTurn() { (省略) while (Array.Exists(enemyFieldCardListSecond, card => card.model.canAttack)) { // 攻撃可能カードを取得 CardController[] enemyCanAttackCardList = Array.FindAll(enemyFieldCardListSecond, card => card.model.canAttack); CardController[] playerFieldCardList = playerField.GetComponentsInChildren<CardController>(); CardController attackCard = enemyCanAttackCardList[0]; //AttackToLeader(attackCard, false); if (playerFieldCardList.Length > 0) // プレイヤーの場にカードがある場合 { CardController defenceCard = playerFieldCardList[0]; CardBattle(attackCard, defenceCard); Debug.Log("プレイヤー側にカードがある"); } else { AttackToLeader(attackCard, false); Debug.Log("攻撃対象がいないのでリターン"); } yield return new WaitForSeconds(1f); enemyFieldCardList = enemyField.GetComponentsInChildren<CardController>(); } ChangeTurn(); // ターンエンドする } |
関係ある部分だけ抜き出すと、
CardController defenceCard = playerFieldCardList[0];
→playerFieldCardListの「0番目のカード」をdefenceCard(=攻撃対象のカード)とする
CardBattle(attackCard, defenceCard);
→attackCard(攻撃するカード)とdefenceCardをバトルさせるよ
こんな感じになってるよね?
ということは、今「0番目」が攻撃対象になっているところを、
「ランダムな番号」を攻撃対象にすれば実装できそうだよね!!
雑に言うとこんな感じ↓
CardController defenceCard = playerFieldCardList[ランダムな数];
というわけで、
「あとはランダムな数をぶち込めば完成だぜ!!」
って感じなので次はランダムな値を入れる方法を見ていこう!
②ランダムな値の作成方法と、その範囲
調べればすぐわかるけど、ランダムな値の作り方はこんな感じ↓
UnityEngine.Random.Range(最小値, 最大値)
※ただし最大値は含まれないので注意!!
具体的に言うと、
int a = UnityEngine.Random.Range(0, 100); という場合は、
0から99の間のランダムな数が生成されるよ!!(100にはならないってこと)
では次に実際にコードに書いていくけど、
この場合のランダムな数字の範囲がいくつなのかを考えてみよう!
例えば自分のフィールドに3体カードがあるとする場合は、
0〜2の数がランダムに出ればいいよね?
つまりコードで言うと、UnityEngine.Random.Range(0, 3)になる。
自分のフィールドに1体の場合は0が出ればいいので、
UnityEngine.Random.Range(0, 1)になる。
つまり、最大値=自分のフィールドのカード枚数ってことになるよね!!
ということで、自分のフィールドのカード枚数を取得して、ランダム値の最大範囲にぶち込めばOK!!
ざっくり言うとこんな感じ↓
int defenceCardNumber = UnityEngine.Random.Range(0, playerFieldCardList.Length);
→ ランダムな数(最小値:0〜最大値:自分フィールドのカード枚数)を、defenceCardNumberって変数にぶち込む
CardController defenceCard = playerFieldCardList[defenceCardNumber];
→自分のフィールドのランダム番目のカードをdefenceCardとする
CardBattle(attackCard, defenceCard);
→そのカードをバトルさせる
実際のコードではこうだね↓ オレンジの部分は追記&修正してみよう
1 2 3 |
int defenceCardNumber = UnityEngine.Random.Range(0, playerFieldCardList.Length); CardController defenceCard = playerFieldCardList[defenceCardNumber]; CardBattle(attackCard, defenceCard); |
ではではエラーが出てないことを確認して、実際に動かしてみよう!!!
こんな感じに敵の攻撃がランダムになったかな??
という訳で演習は完了!!お疲れ様でした!
まとめ
今回大事になるのは、ランダムな値の取得方法だね。
UnityEngine.Random.Range(最小値, 最大値)
ゲームではほんとによく使うのでこの機に覚えておこう!
という訳で今回は終わりっ!!また今度!
次の記事↓
前の記事↓
更新お疲れ様です!
無理のないペースで毎秒投稿お待ちしてます。
>ジェリーフィッシュさん
いつもコメントありがとうございます!(´;ω;`)アリガタヤ
予定より遅れて申し訳ないですが、近々出せると思うのでもう少々お待ちを、、、!!
記事を参考にゲームを作成させてもらってます。
味方同士のバトルをすると破壊されずに場に残るのですがなぜか相手のリーダーのHPが減ってしまうバグが解決できないのでアドバイスを頂けると嬉しいです。