😺
敵のダメージ表現
赤のカラー乗算によるダメージ
using UnityEngine;
using DG.Tweening;
public class Enemy : MonoBehaviour
{
/// <summary> マテリアルの色パラメータのID </summary>
private static readonly int PROPERTY_COLOR = Shader.PropertyToID("_Color");
/// <summary> モデルのRenderer </summary>
[SerializeField]
private Renderer _renderer;
/// <summary> モデルのマテリアルの複製 </summary>
private Material _material;
private Sequence _seq;
private void Awake()
{
// materialにアクセスして自動生成されるマテリアルを保持
_material = _renderer.material;
}
private void OnTriggerEnter(Collider other)
{
HitFadeBlink(Color.red);
}
/// <summary> カラー乗算によるダメージ演出再生 </summary>
private void HitFadeBlink(Color color)
{
_seq?.Kill();
_seq = DOTween.Sequence();
_seq.Append(DOTween.To(() => Color.white, c => _material.SetColor(PROPERTY_COLOR, c), color, 0.1f));
_seq.Append(DOTween.To(() => color, c => _material.SetColor(PROPERTY_COLOR, c), Color.white, 0.1f));
_seq.Play();
}
}
スケールの拡大・縮小によるダメージ表現
using UnityEngine;
using DG.Tweening;
public class Enemy : MonoBehaviour
{
/// <summary> 拡大・縮小するTransform </summary>
[SerializeField]
private Transform _model;
private Sequence _seq;
private void OnTriggerEnter(Collider other)
{
HitScaleBound();
}
/// <summary> スケールの拡大・縮小によるダメージ演出再生 </summary>
private void HitScaleBound()
{
_seq?.Kill();
_seq = DOTween.Sequence();
_seq.Append(DOTween.To(() => Vector3.one, scale => _model.localScale = scale, Vector3.one * 1.05f, 0.07f));
_seq.Append(_model.DOScale(1f, 0.07f));
_seq.Play();
}
}
のけぞり(ボーン回転)によるダメージ表現
using UnityEngine;
using DG.Tweening;
public class Enemy : MonoBehaviour
{
/// <summary> のけぞりによるダメージ演出で回転するボーン </summary>
[SerializeField]
private Transform _waistBone;
/// <summary> のけぞりによるダメージ演出によるボーンの回転角度 </summary>
private Vector3 _offsetAnglesWaist;
private Sequence _seq;
private void OnTriggerEnter(Collider other)
{
// ヒットした攻撃判定の進行方向に向けて体を倒すため、角度を取得
var bulletAngles = other.transform.eulerAngles;
// X角度は無視
bulletAngles.x = 0f;
HitTiltWaist(Quaternion.Euler(bulletAngles) * Vector3.forward);
}
/// <summary> のけぞり(ボーン回転)によるダメージ演出を再生 </summary>
/// <param name="vector">ヒットした攻撃判定の進行方向</param>
private void HitTiltWaist(Vector3 vector)
{
_seq?.Kill();
_seq = DOTween.Sequence();
// 攻撃判定の進行方向を自身のTransformのローカル座標系に変換
vector = transform.InverseTransformVector(vector);
// 攻撃判定の進行方向に向けて10度傾ける
// FIXME: Vector3のどの要素に攻撃判定の進行方向ベクトルの各要素を使うか、正/負解釈をどうするかは、モデルのボーン構造に合わせて適宜変更する
var tiltAngles = new Vector3(0f, -vector.x, -vector.z).normalized * 10f;
_seq.Append(DOTween.To(() => Vector3.zero, angles => _offsetAnglesWaist = angles, tiltAngles, 0.1f));
_seq.Append(DOTween.To(() => tiltAngles, angles => _offsetAnglesWaist = angles, Vector3.zero, 0.2f));
_seq.Play();
}
private void LateUpdate()
{
// Animatorによる今フレームのボーンの角度が決まった後、のけぞりによる回転角度を与える
_waistBone.localEulerAngles += _offsetAnglesWaist;
}
}
Motion Blur : Frame Blending
Post Processing Stack の Motion Blur は、カメラの角度や座標の変化によってブレる
Post-Processing Profile の Motion Blur の 「Frame Blending」 という値を、0より大きい値にする
Discussion