【Unity/2D】被ダメージ時の点滅表現

Unity/2Dでの被ダメージ時の点滅表現

スプライトを使っている場合の、被ダメージ時の点滅表現。
SpriteRendererのColor値を指定色間で往復させる。

0~255でカラー指定可能。
往復間隔の時間指定可能。

3Dの点滅の記事と、UIの点滅の記事を合わせたような感じ。

サンプル動画

プレイヤーの周りを円運動する敵キャラから、適当に弾を撃たせて被ダメージ点滅をテストしてみた。

コード

  • プレイヤーのメインスクリプトへ追記するか、新規スクリプトを作成して貼り付け。


//使わなかった為、一応コメントアウト。
using System.Collections;
//using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{

//インスペクターから設定するか、初期化時にGetComponentして、SpriteRendererへの参照を取得しておく。
	[SerializeField]
	SpriteRenderer sr;

//一ループの長さ(秒数)。任意の値。
	float flickerInterval = 0.075f;

//ループ開始時の色を0~255までの整数で指定。インスペクターで指定したい場合は、[SerializeField]のコメントアウトを外せば良い。
//元画像が白の場合は、指定した色になる。ドット絵等の場合は、白色を指定すると元画像への影響なし。アルファ値ゼロで完全に透明。
//    [SerializeField]
	Color32 startColor = new Color32(255, 255, 255, 255);
//ループ終了(折り返し)時の色を0~255までの整数で指定。
//    [SerializeField]
	Color32 endColor = new Color32(255, 255, 255, 0);

//経過時間。
	float flickerElapsedTime;

//点滅の長さ(秒数)。任意の値。
	float flickerDuration = 2.0f;

//点滅コルーチン管理用。
	Coroutine flicker;

//被ダメージフラグ。
	bool isDamaged;



//インスペクターから設定した場合は、GetComponentする必要がなくなる為、Awakeを削除しても良い。
	void Awake()
	{
//(スクリプトと)同じオブジェクトにSpriteRendererがある場合。
//       sr = GetComponent<SpriteRenderer>();
//子のオブジェクトにSpriteRendererがある場合。
	   sr = GetComponentInChildren<SpriteRenderer>();
	}


//ダメージを受けた時に、コレを呼ぶ。
	void Damaged()
	{
		if (isDamaged)
			return;

/*
//ここでHPを減らしたりとかする。
		hp -= damage;
		if (hp < 0)
			hp = 0;
*/

/*
//そのダメージによって死んだ場合は、ダメージ点滅させない。
		if (hp <= 0) {
			Died();
			return;
		}
*/

		StartFlicker();
	}


	void StartFlicker()
	{
		flicker = StartCoroutine(Flicker());
	}


	IEnumerator Flicker()
	{
		isDamaged = true;


		flickerElapsedTime = 0;


		while (true) {
			flickerElapsedTime += Time.deltaTime;

//Color.Lerpに開始の色、終了の色、0~1までのfloatを渡すと中間の色が返される。
//Mathf.PingPongに経過時間を渡すと、0~1までの値が返される。
			sr.color = Color.Lerp(startColor, endColor, Mathf.PingPong(flickerElapsedTime / flickerInterval, 1.0f));


			if (flickerDuration <= flickerElapsedTime) {
				isDamaged = false;
				sr.color = startColor;
				flicker = null;

				yield break;
			}

			yield return null;
		}
	}


//ステージ切り替え時等で、強制的にFlickerを停止させる用。
	public void ResetFlicker()
	{
		if (flicker != null) {
			StopCoroutine(flicker);
			flicker = null;
		}
	}


/*
呼び方の一例。
	void OnCollisionEnter2D(Collision2D col)
	{
		if (col.gameObject.CompareTag("EnemyAttack")) {
			Damaged();
		}
	}
*/

}

タイトルとURLをコピーしました