この記事はロックマン風2Dアクションゲームの作り方講座の第7回です。
ここまででスクロールやマップ切り替えしながら分割されたステージ全体をプレイヤーキャラクターが進めるようになりました。
前回の記事:
ここからはメイン要素の1つでもある2D横スクロールの戦闘システムを実装していきます。この章を最後まで進めれば一気にアクションゲームらしさが増していくので頑張っていきましょう!
プレイヤーキャラクターのバスター攻撃(ショット機能)を実装
プレイヤーの攻撃手段については最終的に多くの種類を実装予定で、それらをゲーム中に切り替えて撃ち分ける形にしていきます。
まず最初は初期武器である「弾丸を真っすぐ飛ばす」、いわゆるロックバスター風のショット攻撃のみを実装していきます。
ショット弾丸プレハブ作成
弾丸は発射されたタイミングでオブジェクト生成され、壁や敵にぶつかる(もしくは発射から一定時間経過する)と破壊されてオブジェクトが消去されます。
ゲーム中のオブジェクト生成には普通プレハブが用いられます。元となる1発分の弾丸をSpriteオブジェクトとして作成し、それをプレハブにしてスクリプトから生成していきましょう。
シーン上にSpriteオブジェクトActorShot_Normalを作成します(ヒエラルキー画面で右クリックして2D Object > Sprites > Squareなどで作成)。StageManagerの子じゃなくても大丈夫です。
画像はTextures/Attacks/Actor/ActorShot_Normal.pngを使用します。
続いて弾丸の当たり判定を設定していきます。
弾の見た目が円形なので当たり判定も円形で設定したいと思います。ここで使用するコンポーネントはCircle Collider 2Dです。
Radius(半径)のパラメータを変更する事で判定の大きさを変更できますが、初期設定で問題ないはずです。
物理演算を使用しないのでIs Triggerパラメータはオンにしておきましょう。
そして弾丸の移動や接触判定などを処理するスクリプトとしてActorNormalShotクラスを新規作成します。
スクリプトの中身はこの後実装します。まずActorShot_Normalオブジェクトへのアタッチを済ませておきましょう。
次に、このActorShot_Normalオブジェクトをプレハブ化します。.prefabファイルの保存場所はAssets/Prefabs以下ですが、この後も弾のプレハブを複数作成するのでAttack_Actorフォルダ等を作ってまとめておくと良いでしょう。
最後にシーン上に残っているActorShot_Normalインスタンスは消去しておきます。
プレイヤーのバスターショット攻撃処理の実装
Zキーを押したら弾丸を発射し、その弾丸が真っすぐ進んでいく処理までをスクリプトで実装していきます。
ActorNormalShot.cs
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 |
using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// アクターの通常弾処理クラス /// </summary> public class ActorNormalShot : MonoBehaviour { // 各種変数 protected float speed; // 弾速 protected float angle; // 角度(0-360)0で右・90で上 protected int damage; // 命中時のダメージ protected float limitTime; // 存在時間(秒)この時間が過ぎると消滅 /// <summary> /// 初期化関数(生成元から呼出) /// </summary> /// <param name="_speed">弾速</param> /// <param name="_angle">角度</param> /// <param name="_damage">命中時のダメージ</param> /// <param name="_limitTime">存在時間(秒)</param> public void Init (float _speed, float _angle, int _damage, float _limitTime) { // 変数取得 speed = _speed; angle = _angle; damage = _damage; limitTime = _limitTime; } // Update void Update () { // 移動ベクトル計算(1フレーム分の進行方向と距離を取得) Vector3 vec = new Vector3 (speed * Time.deltaTime, 0.0f, 0.0f); vec = Quaternion.Euler (0, 0, angle) * vec; // ベクトル回転 // 移動ベクトルをもとに移動 transform.Translate (vec); // 消滅判定 limitTime -= Time.deltaTime; if (limitTime < 0.0f) {// 存在時間が0になったら消滅 Destroy (gameObject); } } // 各トリガー呼び出し処理 // トリガー進入時に呼出 private void OnTriggerEnter2D (Collider2D collision) { string tag = collision.gameObject.tag; // 命中対象ごとの処理 if (tag == "Enemy") {// エネミーに命中 // ここに命中時の処理 } else if (tag == "Ground") {// 地面・壁に命中 Destroy (gameObject); } } } |
今回は弾の移動に物理演算は使用しません。弾発射時に弾速や角度などの情報を与え、それを基にして毎フレームごとに移動量・進行方向を計算して反映しています。
本講座のようにスクリプトで直接弾道を実装する方がUnityの物理演算を使うより応用が効き、開発しやすくなることも多いです。
また、Enemyタグを持つオブジェクトに触れた時ダメージを与える処理に関しては今後追加予定です。
ActorController.csを修正
Zキー押下時に弾丸インスタンスを作成し、上記の弾速や角度などの情報を渡すようにします。
まとめ
ザコ敵や戦闘周りの最低限のシステムを実装できました。ヘビの動作などが未実装ですので、次の章で引き続きザコ敵の実装を進めていきます。
今回からDOTweenを各所に使用していきます。スプライトの色を徐々に変更したり、少し時間を置いてから処理を実行するなどしたい時に便利ですので是非覚えておきましょう。
次の記事:
コメント