アマゾンバナーリンク

Unityで作る弾幕シューティングゲーム その7 自機やられ処理と敵消滅エフェクト

2020年7月18日

こんにちは!ジェイです。前回コマンドパターンで敵生成、BGM再生、停止などの処理を追加しました。今回は自機やられ処理と敵消滅エフェクトを追加していきます。

自機やられ処理

復活する時の自機と、プレイしている時の自機は別のプレハブとして扱います。まず最初に復活する時の自機のスクリプトを以下の様に定義して、RevivalPlayerプレハブにアタッチします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CRevivalPlayer : MonoBehaviour
{
    // Start is called before the first frame update
    float _Time;
    float Y = 0;
    SpriteRenderer _SpriteRenderer;
    void Start()
    {
        _Time = Time.time;
        _SpriteRenderer = GetComponent<SpriteRenderer>();
    }

    // Update is called once per frame
    void Update()
    {
        CalcApha();

        // 一定時間経ったらプレイヤーを復帰させる
        if (Time.time-_Time > 3.0f)
        {
            Destroy(gameObject);
            GameObject player = CGameManager.GetObjectHandle("Player");
            Instantiate(player, transform.position, Quaternion.identity);
        }
        else // プレイヤーを上に移動させる
        {
            Y += 0.008f * Time.deltaTime;
            transform.position = new Vector3(transform.position.x, transform.position.y+Y, transform.position.z);
        }
    }
    int Cnt = 0;
    void CalcApha()
    {
        ++Cnt;
        float alpha = (Mathf.Sin(Cnt * 0.1f)+1)/2;
        _SpriteRenderer.color = new Color(1, 1, 1, alpha);
    }
}

CalcAphaで自機をアルファブレンドを使って点滅させて、一定時間経つまで上に進め、時間が経過したら、Playerを生成するという処理になっています。

敵消滅エフェクト

敵の消滅エフェクトはこちらのアセットを使いました。

Asset>DAX>Magic Packs Vos1>Prefabs>Smoke-59>DAXExplode_01を使います。そのまま直接使ってもいいですが、一度インスペクターにドラッグ&ドロップして、右クリック→UnpackPrefabを選んで、Asset>Scenes>Resources>Prefabsにプレハブ化します。

敵スクリプトの変更

敵の消滅エフェクトを生成するプログラムを追加します。

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public struct TagEnemyStatus
{
    public GameObject EnemyObj;
    public float X, Y;
    public int Life, GraphType, WaitTime, BulletPattern;
    public int BulletInterval, BulletType, BulletColor, BulletScriptType;

    public TagEnemyStatus(GameObject enemy_obj, float x = 0.0f, float y = 0.0f,
        int life = 1, int graph_type = 0, int wait_time = 180, int bullet_pattern = 0,
        int bullet_interval = 60, int bullet_type = 0, int bullet_color = 0, int bullet_script_type=0)
    {
        EnemyObj = enemy_obj;
        X = x;
        Y = y;
        Life = life;
        GraphType = graph_type;
        WaitTime = wait_time;
        BulletPattern = bullet_pattern;
        BulletInterval = bullet_interval;
        BulletType = bullet_type;
        BulletColor = bullet_color;
        BulletScriptType = bullet_script_type;
    }
}

public abstract class CEnemy : MonoBehaviour
{
    protected TagEnemyStatus EnemyStatus;
    protected CBulletController BulletController;
    protected Animator _Animator;
    protected bool BulletDischarge = false; // 弾幕発射フラグ
    protected int Cnt = 0;
    protected int Life = 60;
    protected int Wait = 100;
    protected float VX = 0.0f, VY = 0.0f;
    void Start()
    {
        Life = EnemyStatus.Life;
        Wait = EnemyStatus.WaitTime;
        _Animator = GetComponent<Animator>();
        switch(EnemyStatus.BulletPattern)
        {
            case 0:
                BulletController = new CAimBulletController(
                    EnemyStatus.BulletType, EnemyStatus.BulletColor, EnemyStatus.BulletScriptType);
                break;
        }     
    }
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "Shot")
        {
            Life -= collision.GetComponent<CShot>().ShotPower;
            if (Life <= 0)
            {
                Destroy(gameObject);
                GameObject go = CGameManager.GetObjectHandle("EnemyDestroyEffect");
                GameObject ede = Instantiate(go, transform.position, Quaternion.identity);
                CSoundPlayer.PlaySound("enemy_death");
                Destroy(ede, 1.5f);
            }
            Destroy(collision.gameObject);
        }
    }
}

以上で敵の消滅エフェクトが追加されます。