スプライトを使っている場合の、被ダメージ時の点滅表現。
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();
}
}
*/
}