😺

敵のダメージ表現

2024/03/20に公開

https://qiita.com/flankids/items/7fee77ed6f5e1b71d2be

赤のカラー乗算によるダメージ

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より大きい値にする
https://qiita.com/flankids/items/c0cd04bc50bd3b902982

https://github.com/keijiro/KinoMotion

Discussion