この記事はロックマン風2Dアクションゲームの作り方講座の第12回です。
前回はパーティクルシステムを用いた敵討伐時のアニメーションやボスキャラそれぞれの個性的なアクションを実装を開始しました。
前回の記事:
Unity 2Dアクションの作り方11 ボス戦の作り方・Unityパーティクルシステムでエフェクト実装
この講座はロックマン風2Dアクションゲームの作り方講座の第11回です。 前回ですべてのマップステージを作り、通常敵の配置を終えたのでステージを完成させるまで残りはボス敵の実装のみとなりました。 前回の記事: ここからは各ステージに1体ずつの...
今回の記事では引き続きボスエネミーの実装を進めていきます。また、ボスの行動パターンの実装の後でHPゲージシステムも実装します。
エネミー弾丸プレハブを全種類作成
この先のボスが使用予定である4種類のエネミー弾丸プレハブを予め作成しておきます。
それぞれ画像を差し替えて当たり判定の大きさを調整するだけでOKです。
-
- 黄色弾(EnemyShot_Yellow)
画像:Textures/Attacks/Enemy/Enemy_Shot_Yellow.png
- 黄色弾(EnemyShot_Yellow)
-
- 紫弾(EnemyShot_Purple)
画像:Textures/Attacks/Enemy/Enemy_Shot_Purple.png
- 紫弾(EnemyShot_Purple)
-
- 赤弾(EnemyShot_Red)
画像:Textures/Attacks/Enemy/Enemy_Shot_Red.png
- 赤弾(EnemyShot_Red)
-
- 火炎弾(EnemyShot_Fire)
画像:Textures/Attacks/Enemy/Enemy_Fire.png
- 火炎弾(EnemyShot_Fire)
全部で敵の弾丸プレハブは7種になります。
ボス敵5:クラゲ(Jellyfish) プカプカ浮遊しながら弾幕を作る敵
サンプル画像:Textures/Enemies/Boss/Jellyfish1.png~Jellyfish6.png
行動パターン
- 空中を浮遊しつつプレイヤーに近づく
- 一定時間ごとに全方位に多重に弾を発射する
Boss_Jellyfishクラス
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; /// <summary> /// 個別敵クラス(ボス):Jellyfish /// /// 浮遊移動・弾攻撃 /// </summary> public class Boss_Jellyfish : EnemyBase { // 画像素材 [Header ("画像素材")] [SerializeField] private Sprite[] spriteList_Move = null; // 移動アニメーション [SerializeField] private Sprite sprite_Charge = null; // チャージ [SerializeField] private Sprite sprite_Spread = null; // 拡散弾攻撃 // 弾丸プレハブ [Header ("エネミー弾丸プレハブ")] public GameObject bulletPrefab; // 設定項目 [Header ("移動速度")] public float movingSpeed; [Header ("移動時間")] public float movingTime; [Header ("チャージ時間")] public float chargeTime; [Header ("攻撃モーション時間")] public float attackingTime; // 各種変数 private Sequence actionSequence; // 行動Sequence private float timeCount; // 経過時間 // 行動パターン private ActionMode nowMode; // 行動パターン定義 private enum ActionMode { Moving, Charge, Attacking, _MAX, } /// <summary> /// このモンスターの居るエリアにアクターが進入した時の処理(エリアアクティブ化時処理) /// </summary> public override void OnAreaActivated () { base.OnAreaActivated (); // 変数初期化 nowMode = ActionMode.Moving; timeCount = 0.0f; } // Update void Update() { // 消滅中なら処理しない if (isVanishing) return; // 時間経過 timeCount += Time.deltaTime; // アクターとの位置関係から向きを決定 if (transform.position.x > actorTransform.position.x) {// 左向き SetFacingRight (false); } else {// 右向き SetFacingRight (true); } // 各パターン別の行動 switch (nowMode) { case ActionMode.Moving: // 移動中 // アクターに向かって移動 Vector2 calcVec = actorTransform.position - transform.position; calcVec *= 0.2f * Time.deltaTime * movingSpeed; rigidbody2D.velocity += calcVec; // スプライト適用 int animationFrame = (int)(timeCount * 2.0f); animationFrame %= spriteList_Move.Length; if (animationFrame < 0) animationFrame = 0; spriteRenderer.sprite = spriteList_Move[animationFrame]; // 次モード切替 if (timeCount >= movingTime) { timeCount = 0.0f; nowMode = ActionMode.Charge; } break; case ActionMode.Charge: // チャージ中 // 減速 rigidbody2D.velocity *= Time.deltaTime; // スプライト適用 spriteRenderer.sprite = sprite_Charge; // 次モード切替 if (timeCount >= chargeTime) { timeCount = 0.0f; nowMode = ActionMode.Attacking; // 拡散弾発射 ShotBullet_Spread (); } break; case ActionMode.Attacking: // 攻撃中 // スプライト適用 spriteRenderer.sprite = sprite_Spread; // 次モード切替 if (timeCount >= attackingTime) { timeCount = 0.0f; nowMode = ActionMode.Moving; } break; } } /// <summary> /// 全方位へ多重射撃する処理 /// </summary> private void ShotBullet_Spread () { // 弾丸オブジェクト生成・設定 // 射撃位置 Vector2 startPos = transform.position; // 発射数 int bulletNum_Angle = 8; // 発射方向数 int bulletNum_Layer = 6; // 多重発射数 // 全方位発射処理 for (int i = 0; i < bulletNum_Angle; i++) { for (int j = 0; j < bulletNum_Layer; j++) { GameObject obj = Instantiate (bulletPrefab, startPos, Quaternion.identity); obj.GetComponent<EnemyShot> ().Init ( 2.4f + (j * 0.8f), // 速度 (360 / bulletNum_Angle) * i, // 角度 3, // ダメージ量 3.6f, // 存在時間 true); // 地面に当たると消える } } } } |
今回はパターン切り替えの処理にenum(列挙型)を使用してみました。
ActionMode型をenumで定義し、その現在値の変数nowModeを持つことで現在がどのパターンなのかを簡単に識別できるようになっています。
Unity C#での列挙型と定数の使い方
今回の記事では列挙型と定数について解説していきます。 列挙型を使うとスクリプト上で定数をテキストとして表現でき、より読みやすく設定しやすいコードを書くことができます。 前回の記事: 列挙型(enum)とは 列挙型は値型になり、System....
Boss_Jellyfishオブジェクト
空中浮遊を行うのでRigidbody2DのGravityScaleは0にしておきましょう。
空中から大量の弾を撃ってくるボスが出来上がりました。
ボス敵6:ワニ(Crocodile) 複数の遠距離攻撃パターンを実装
サンプル画像:Textures/Enemies/Boss/Crocodile1.png~Crocodile5.png
行動パターン
- その場で静止し、一定時間ごとに弾を発射する(弾は4パターン存在する)
多重射撃→プレイヤーを狙う→ランダム→貫通弾
まとめ
これで全ての敵の作成、およびボス戦闘用の演出などが出来上がりました。
いよいよアクションゲーム開発も大詰めです。次はロックマンの醍醐味である敵ボスキャラを倒した後に手に入る特殊武器の実装です。
プレイヤーキャラに特殊武器を持たせて新たな戦略の幅を作ってみましょう。
次の記事:
Unity 2Dアクションの作り方13 特殊武器を全種類作成 倒したボスのウェポンを使う
この記事はロックマン風2Dアクションゲームの作り方講座の第13回です。 11章と12章にてボス敵の作成とHPゲージの実装を行いました。 前回の記事: 今回はロックマンのゲーム性を高めている機能の一つである「倒した敵の武器を使えるようにする」...
コメント