アマゾンバナーリンク

ディスプレイ広告

スポンサーリンク

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);
}
}
}

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