using UnityEngine;
namespace Cielonos.MainGame.Effects
{
///
/// 单个残影个体生命周期与渐隐控制器。
///
public class AfterImageItem : MonoBehaviour
{
private MeshRenderer[] renderers;
private MaterialPropertyBlock propBlock;
private float fadeSpeed;
private float currentFade = 1f;
public void Initialize(MeshFilter[] filters, MeshRenderer[] renderers, Material afterImageMat, float duration)
{
this.renderers = renderers;
this.fadeSpeed = 1f / duration;
this.propBlock = new MaterialPropertyBlock();
foreach (var renderer in renderers)
{
if (renderer != null)
{
renderer.sharedMaterial = afterImageMat;
}
}
}
private void Update()
{
currentFade -= Time.deltaTime * fadeSpeed;
if (currentFade <= 0f)
{
// 必须手动销毁运行时烘焙出的 Mesh 资源,防止显存泄漏 (GC 不会自动回收 BakeMesh 产生的网格)
foreach (var filter in GetComponentsInChildren())
{
if (filter != null && filter.sharedMesh != null)
{
Destroy(filter.sharedMesh);
}
}
Destroy(gameObject);
return;
}
propBlock.SetFloat("_Fade", currentFade);
foreach (var renderer in renderers)
{
if (renderer != null)
{
renderer.SetPropertyBlock(propBlock);
}
}
}
}
}