【Unity】2Dシューティングを作ってみる話 #23

記事をご覧いただき、誠にありがとうございます。
投稿主の無能です。

前回は、プレイヤーに残機を実装しました。

今回は、体力回復などのアイテムを実装したいと思います。

アイテムを出現させる

アイテムを実装するにあたって、まずはアイテムをゲーム中に出現させないといけません。

アイテムはどんなものでも良いのですが、今回はアイテムだと分かりやすくて、色も豊富なカプセルを使いたいと思います。

カプセルであれば、思い付く限りのアイテムを色違いで表せるので便利です。

今回アイテムにはこちらを使用しました。
※二次配布に抵触する可能性があるため、リンク先を参照してください。


これを必要な分だけ一つずつ使って、様々なアイテムにしていきます。

アイテムのオブジェクトを作成する

では早速アイテムのオブジェクトを作成します。

「Item_Heal」という空のオブジェクトを作成して、Sprite Rendererをアタッチします。

「Item_Heal」という空のオブジェクトを作成

Item_HealにSprite Rendererをアタッチ

そして、先程のカプセルの画像をGimpで一つ切り出して、Spriteに設定します。

種類が多くなる場合は、Spritesフォルダ内のObjectsフォルダ内にItemフォルダを新規作成してフォルダ分けしておきましょう。

色やサイズなどは自由に決めてください。

回復は緑のイメージなので緑にします。
(無能のイメージ)

Sprites > Objectsフォルダ内にItemフォルダを新規作成してフォルダ分け

画像をインポート

Pixels Per Unitで大きさを調整

プレイヤーより一回り小さい感じの大きさにする

このカプセルがただスーッと動くだけでは物足りないので、回転させながらプレイヤーの方へ(x軸のマイナス方向へ向かって)動くようにします。

オブジェクトを動かすためのRigidbody2Dと、接触した際の処理が出来るようにColliderをアタッチします。

ColliderはCapsule Collider 2Dを使用します。

Rigidbody2Dは、重力の影響を受けないのでGlavity Scaleを0に、Colliderはis Triggerにチェックを入れます。

Colliderがずれている場合は、DirectionをHorizontalにして調整してあげます。

Rigidbody2DとCapsuleColliderの設定

Colliderを調整

そして「ItemController」というスクリプトを作成してアタッチします。

「ItemController」というスクリプトを作成

Item_Healにアタッチ

これで最初のアイテムが出来ました。

ではこのアイテムの処理をスクリプトで実装していきます。

アイテムの処理をスクリプトで実装する

まずアイテムは接触したらプレイヤーに吸収される体になるので、接触後に消えるようにします。

後は他のアイテムも作りたいので、アイテムの効果をItemControllerで管理できるようにしたいと思います。

難しそうに思えるかも知れませんが、これまでやってきた実装を思い返せば、それほど難しいものではありませんので、気後れせずにやってみましょう。

このようになります。

ItemController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(Rigidbody2D))]

public class ItemController : MonoBehaviour
{
    #region Variables
    #region var-CapsuleBase
    [Header("アイテムの基本パラメーター")]
    [SerializeField] float rotateSpeed = 10.0f;
    [SerializeField] float dropSpeed = 1.0f;
    [SerializeField] int itemType = 0;
    #endregion

    #region var-CapsuleIndividual
    [Header("アイテム個別のパラメーター")]
    [SerializeField] int healPoint = 5;
    #endregion

    #region var-Controller
    [Header("コントローラー関連")]
    [SerializeField] PlayerController player;
    [SerializeField] GameManager gameManager;
    Rigidbody2D capsuleRB;
    #endregion

    #region others
    Collider2D itemCollider;            // アイテムのコライダー
    #endregion

    #region Internal
    enum itemEffectType { heal };       // 内部処理用
    #endregion
    #endregion

    #region Methods
    #region Start
    void Start()
    {
        // カプセルのリジッドボディを取得
        capsuleRB = GetComponent<Rigidbody2D>();
        // ゲームマネージャーを取得
        gameManager = GameObject.FindWithTag("GameManager").GetComponent<GameManager>();
        // アイテムのコライダーを取得
        itemCollider = GetComponent<Collider2D>();
    }
    #endregion

    #region Update
    void Update()
    {
        // アイテムをプレイヤーの方向へ動かす
        capsuleRB.velocity = new Vector2(-dropSpeed, 0);
        // アイテムを回転させる
        capsuleRB.transform.Rotate(0, 0, rotateSpeed);
    }
    #endregion

    #region OnTriggerEnter2D
    // 接触判定
    private void OnTriggerEnter2D(Collider2D collision)
    {
        // 接触したオブジェクトのタグがPlayerだった場合
        if (collision.gameObject.CompareTag("Player"))
        {
            // アイテムの効果を呼び出す
            ItemEffect(itemType, itemCollider);
        }
    }
    #endregion

    #region ItemEffect
    // アイテムの効果
    void ItemEffect(int iType, Collider2D collision)
    {
        // 引数iTypeで分岐
        switch (iType)
        {
            // 回復効果の場合
            case (int)itemEffectType.heal:
                // プレイヤーのHP表示を更新
                player.PlayerHPChanged(iType, healPoint, collision);
                // switch文を抜ける
                break;
            // 該当なしの場合
            default:
                // switch文を抜ける
                break;
        }
    }
    #endregion
    #endregion
}

では見ていきましょう。

メンバ変数は、アイテムに共通する基本パラメーターと、アイテムの効果が個別に異なるため個別パラメーターに分けました。

アイテムに共通するパラメーターとして、アイテムの移動速度と落下速度、そしてアイテムの書類を整数で管理するのでitemTypeというint型を用意しました。

個別のパラメーターは、現状ではHP回復だけになるので、HPを回復する数値を用意しました。

次はコントローラー関連で、ゲームマネージャー、プレイヤーコントローラー、自身のRigidbody2Dを用意しました。

そしてPlayerControllerのPlayerHPChanged関数を呼ぶためにColliderが必要なので、Collider2Dで自身のColliderを用意しています。

最後はenum型のitemEffectTypeで、取得した際にアイテムの効果を分けるため用意しました。

次のStart関数では、ゲームマネージャー、プレイヤーコントローラー、自身のRigidbody2Dをそれぞれ取得しています。

Update関数では、アイテムが進行方向へ進むことと回転する処理をしています。

接触判定のOnTriggerEnter2Dでは、Playerというタグを持ったオブジェクトが接触したら、ItemEffect関数を呼んでいます。

その際に引数として渡しているのが、itemTypeとitemColliderになります。

itemTypeはItemEffect関数で効果を判別するために、itemColliderは前述の通りPlayerControllerのPlayerHPChanged関数に渡すために、これら二つの引数を渡します。

ItemEffect関数では、switch文でアイテムの効果を分岐しています。

switch文の分岐の条件となるのが、呼び出し元から受け取ったitemType、ここではiTypeです。

iTypeの整数がenumのitemEffectTypeのhealの場合にPlayerHPChanged関数を呼び出します。

その際の引数は、アイテムの種類であるiTypeと回復の数値であるhealPoint、そしてアイテム自身のColliderであるitemColliderになります。

PlayerHPChanged関数はこれらの引数を受け取って処理します。

以前に書いた部分がここの回復になります。

ではItemControllerができたので、追加された項目を設定していきます。

追加の項目を設定できたらプレハブ化します。

追加された項目を設定したらプレハブ化する

アイテムをプレイヤーの反対側にします。

アイテムをプレイヤーの反対側にする

ではゲームを実行して確認します。

今回確認することは
  • アイテムが回転しながら進行方向(x軸のマイナス方向)に進む
  • アイテムを取得したらアイテム自身が破棄される
  • アイテムを取得した時に回復する
  • アイテムを取得した時に、最大値を超えて回復しない
になります。

回復の確認は、敵が生成されてダメージを受けてからになるので注意してください。

回転しながら進む:OK

アイテム取得時にアイテム自身が破棄される:OK

敵からダメージを受けた状態

アイテム取得時の回復:OK

アイテム取得時に最大値を超えて回復しない:OK

これで確認は以上なので、無事アイテムの実装が出来ました。

その他のアイテムの実装は次回にやっていきたいと思います。

まとめ

今回は
HPを回復するアイテムを実装した
という事をやりました。

次回はその他のアイテムの実装と、ランダムな位置から定期的にアイテムを生成する処理を実装していきます。

では、また次回!

コメント