【Unity】2Dシューティングを作る ~自機の弾を強化させる~

自機の弾を強化する unity

プレイするゲームがないなら、自分で作ればいいじゃない!

ということで Unity 初心者が「ゲームを作る」ゲームをやっていきます!

今回は「自機の弾を強化する」の記事です

 

スポンサーリンク

内容

プレイヤーの弾を強化させる

「弾数の追加」「子機の追加」を行います

 

強化アイテム

まずは画像を用意

パワーアップアイテム

ItemType を SHOT_UP にしてショット強化アイテムのプレハブを作る

 

プレイヤーのスクリプトを編集

ショット部分

発射位置の空のオブジェクトを作成しておく

// ボタンを押したとき
if( Input.GetButtonDown("Fire1") )
{
    // 弾の生成
    if (bulletLevel == 0)
    {
        Instantiate(BulletObj, transform.position + bulletPointList[0].localPosition, Quaternion.identity);
    }
    // 2つ発射
    else if(bulletLevel >= 1)
    {
        Instantiate(BulletObj, transform.position + bulletPointList[1].localPosition, Quaternion.identity);
        Instantiate(BulletObj, transform.position + bulletPointList[2].localPosition, Quaternion.identity);
    }

    SoundManager.Instance.PlaySe("shot");
}

当たり判定

SHOT_UP の判定を追加する

void OnTriggerEnter2D(Collider2D other)
{
    if (other.gameObject.CompareTag("Item"))
    {
        ItemController item = other.gameObject.GetComponent<ItemController>();

        if(item)
        {
            switch (item.GetItemType())
            {
                // ショット強化
                case ItemController.ITEM_TYPE.SHOT_UP:
                    {
                        ++bulletLevel;
                            
                        // 子機を付けたい
                        if(bulletLevel >= 2)
                        {
                            CreateMiniPlayer();
                        }
                    }
                    break;
            }
        }

        // アイテムを消す
        Destroy(other.gameObject);
    }
}

 

子機を作る

子機の画像を用意

子機のサンプル
小さくしただけ

コライダーとスクリプトの追加をします

 

子機のスクリプト

位置以外はプレイヤーと同じような処理

public class MiniPlayerController : MonoBehaviour
{
    [SerializeField] PlayerBullet BulletObj;       // 弾のゲームオブジェクト
    Vector3 bulletPoint;                           // 弾の位置

    [SerializeField] Vector3 offsetPos;            // プレイヤーからのオフセット位置
    GameObject playerObj = null;                   // プレイヤーオブジェクト

    void Start()
    {
        bulletPoint = transform.Find("point").localPosition;

        // プレイヤーオブジェクトを取得する
        playerObj = GameObject.Find("player");
    }


    void Update()
    {
        // プレイヤーがいない場合
        if(playerObj == null)
        {
            // 自身を消す
            Destroy(gameObject);
            return;
        }

        // 位置の更新
        transform.position = playerObj.transform.position + offsetPos;

        // ボタンを押したとき
        if (Input.GetButtonDown("Fire1"))
        {
            // 弾の生成
            Instantiate(BulletObj, transform.position + bulletPoint, Quaternion.identity);
        }
    }

    // オフセット位置の設定
    public void SetOffsetPos(Vector3 _pos)
    {
        offsetPos = _pos;
    }

    void OnTriggerEnter2D(Collider2D other)
    {
        // 敵にヒット
        if (other.gameObject.CompareTag("Enemy") || other.gameObject.CompareTag("enemy_bullet"))
        {
            // 自身を消す
            Destroy(gameObject);
        }
    }
}

インスペクタービューの設定

子機の設定

 

プレイヤーのスクリプトを編集2

子機の情報を設定できるようにして、作成処理を追加する

[SerializeField] MiniPlayerController miniPlayerObj;                            // 子機のゲームオブジェクト
List<MiniPlayerController> miniPlayerList = new List<MiniPlayerController>();   // 子機
[SerializeField] List<Transform> miniPlayerPointList;                           // 子機の位置

void Start()
{
    miniPlayerList.Add(null);
    miniPlayerList.Add(null);
}

// 子機を作る
void CreateMiniPlayer()
{
    if(miniPlayerList[0] == null)
    {
        miniPlayerList[0] = Instantiate(
            miniPlayerObj,
            transform.position + miniPlayerPointList[0].localPosition,
            Quaternion.identity
        );
        miniPlayerList[0].SetOffsetPos(miniPlayerPointList[0].localPosition);
    }
    else if(miniPlayerList[1] == null)
    {
        miniPlayerList[1] = Instantiate(
            miniPlayerObj,
            transform.position + miniPlayerPointList[1].localPosition,
            Quaternion.identity
        );
        miniPlayerList[1].SetOffsetPos(miniPlayerPointList[1].localPosition);
    }
}

インスペクタービューの設定

 

サンプル動画

 

さいごに

何故かアイテム1つ取ると2段階強化されるバグが発生

2つの弾が同時に当たってアイテムが2個出ていたのが原因でした…

 

かれいど

ゲームをしたり、作ったり
色々な事に挑戦していきたい!

サッカー観戦も趣味で
主にJ1リーグを観ています。

かれいどをフォローする
unity
スポンサーリンク
シェアする
かれいどブログ

コメント