chore: initial commit
This commit is contained in:
56
Assets/Scripts/VFX/HurtFlashController.cs
Normal file
56
Assets/Scripts/VFX/HurtFlashController.cs
Normal file
@@ -0,0 +1,56 @@
|
||||
using System.Collections;
|
||||
using UnityEngine;
|
||||
using BaseGames.Feedback;
|
||||
|
||||
namespace BaseGames.VFX
|
||||
{
|
||||
/// <summary>
|
||||
/// 受伤闪白效果控制器。
|
||||
/// 通过 MaterialPropertyBlock 修改 SpriteRenderer 材质的 _FlashAmount 参数(0~1);
|
||||
/// 对应 Shader 需暴露 _FlashColor 与 _FlashAmount 两个属性。
|
||||
/// 调用 Flash() 触发一次闪白动画(Coroutine 实现,不依赖 UniTask)。
|
||||
/// </summary>
|
||||
public class HurtFlashController : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private SpriteRenderer _renderer;
|
||||
[SerializeField] private FeedbackConfigSO _config;
|
||||
|
||||
private static readonly int FlashColorID = Shader.PropertyToID("_FlashColor");
|
||||
private static readonly int FlashAmountID = Shader.PropertyToID("_FlashAmount");
|
||||
|
||||
private MaterialPropertyBlock _block;
|
||||
private Coroutine _flashCoroutine;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (_renderer == null)
|
||||
_renderer = GetComponent<SpriteRenderer>();
|
||||
_block = new MaterialPropertyBlock();
|
||||
}
|
||||
|
||||
/// <summary>触发一次闪白动画。若上一次闪白未结束则重置计时器。</summary>
|
||||
public void Flash()
|
||||
{
|
||||
if (_flashCoroutine != null)
|
||||
StopCoroutine(_flashCoroutine);
|
||||
_flashCoroutine = StartCoroutine(FlashCoroutine());
|
||||
}
|
||||
|
||||
private IEnumerator FlashCoroutine()
|
||||
{
|
||||
SetFlash(1f);
|
||||
yield return new WaitForSeconds(_config != null ? _config.HurtFlashDuration : 0.12f);
|
||||
SetFlash(0f);
|
||||
_flashCoroutine = null;
|
||||
}
|
||||
|
||||
private void SetFlash(float amount)
|
||||
{
|
||||
_renderer.GetPropertyBlock(_block);
|
||||
if (_config != null)
|
||||
_block.SetColor(FlashColorID, _config.HurtFlashColor);
|
||||
_block.SetFloat(FlashAmountID, amount);
|
||||
_renderer.SetPropertyBlock(_block);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user