using UnityEngine;
///
/// 地面裂纹特效控制器
/// 挂在平躺的 Quad 上,砸地/劈砍命中时调用 Play()
/// 流程:扩散(0→1) → 保持 → 淡出 → 结束
///
[RequireComponent(typeof(Renderer))]
public class GroundCrack : MonoBehaviour
{
[Header("时间")]
public float spreadTime = 0.3f; // 裂纹扩散时间
public float holdTime = 0.8f; // 保持时间
public float fadeTime = 0.6f; // 淡出时间
[Header("外观")]
public Color crackColor = Color.black; // 裂纹颜色(黑=普通地裂,红=熔岩,紫=暗影)
public Color glowColor = new Color(1f, 0.3f, 0f, 0f); // 发光色(A=0不发光)
[Header("测试")]
public bool autoPlayOnStart = true;
private Material mat;
private float timer;
private int state; // 0=扩散 1=保持 2=淡出 3=结束
private bool initialized;
void Start()
{
Init();
if (autoPlayOnStart) Play();
}
private void Init()
{
if (initialized) return;
mat = GetComponent().material;
mat.SetFloat("_Progress", 0f);
mat.SetFloat("_Opacity", 0f);
initialized = true;
}
///
/// 砸地/劈砍命中时调用
///
[ContextMenu("▶ 播放一次")]
public void Play()
{
Init();
timer = 0f;
state = 0;
mat.SetFloat("_Opacity", 1f);
mat.SetFloat("_Progress", 0f);
mat.SetColor("_CrackColor", crackColor);
mat.SetColor("_GlowColor", glowColor);
Debug.Log("[GroundCrack] 裂纹触发");
}
void Update()
{
if (state >= 3) return;
timer += Time.deltaTime;
if (state == 0) // 扩散
{
float p = Mathf.Clamp01(timer / spreadTime);
mat.SetFloat("_Progress", p);
if (timer >= spreadTime) { state = 1; timer = 0f; }
}
else if (state == 1) // 保持
{
if (timer >= holdTime) { state = 2; timer = 0f; }
}
else if (state == 2) // 淡出
{
float f = 1f - Mathf.Clamp01(timer / fadeTime);
mat.SetFloat("_Opacity", f);
if (timer >= fadeTime)
{
state = 3;
mat.SetFloat("_Opacity", 0f);
Debug.Log("[GroundCrack] 裂纹结束");
}
}
}
}
//(注:内容由AI生成)