58 lines
1.7 KiB
C#
58 lines
1.7 KiB
C#
using UnityEngine;
|
|
|
|
namespace Cielonos.MainGame.Effects
|
|
{
|
|
/// <summary>
|
|
/// 单个残影个体生命周期与渐隐控制器。
|
|
/// </summary>
|
|
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<MeshFilter>())
|
|
{
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|