using UnityEngine; using System.Collections; public class Animation_GenerateJudgementSituationPrefab : MonoBehaviour { public static Animation_GenerateJudgementSituationPrefab Instance; [Header("生成位置 (五个轨道)")] public GameObject redEffect; public GameObject greenEffect; public GameObject yellowEffect; public GameObject purpleEffect; public GameObject blueEffect; [Header("判定飘字 Prefabs")] public GameObject perfect_judge_prefab; public GameObject great_judge_prefab; public GameObject good_judge_prefab; public GameObject miss_judge_prefab; [Header("缩放与随机")] public float baseScale = 1.0f; public bool useRandomScale = true; public float minScaleMultiplier = 0.8f; public float maxScaleMultiplier = 1.2f; [Header("物理跳跃设置")] public float jumpForce = 5.0f; // 向上弹起的初始速度 public float gravity = -12.0f; // 重力 [Header("时间与透明度控制 (秒)")] public float fadeInTime = 0.1f; // 生成后多少秒完成渐显 (0->1) public float fadeOutStartTime = 0.6f; // 生成后第几秒开始渐隐 public float fadeOutDuration = 0.3f; // 渐隐动画持续时长 private void Awake() { if (Instance == null) Instance = this; else Destroy(gameObject); } public void SpawnJudgePrefab(string color, string judgeResult) { Transform spawnPoint = GetSpawnPoint(color); if (spawnPoint == null) return; GameObject prefabToUse = GetJudgePrefab(judgeResult); if (prefabToUse == null) return; GameObject instance = Instantiate(prefabToUse, spawnPoint); instance.transform.localPosition = Vector3.zero; // 处理缩放 float finalScale = baseScale; if (useRandomScale) finalScale *= Random.Range(minScaleMultiplier, maxScaleMultiplier); instance.transform.localScale = new Vector3(finalScale, finalScale, 1f); // 开启运动逻辑 StartCoroutine(AnimateSprite(instance)); } private IEnumerator AnimateSprite(GameObject obj) { if (obj == null) yield break; SpriteRenderer sr = obj.GetComponent(); float elapsed = 0f; float vVelocity = jumpForce; Vector3 currentLocalPos = Vector3.zero; // 计算总生命周期:开始渐隐的时间 + 渐隐持续的时长 float totalLifeTime = fadeOutStartTime + fadeOutDuration; // 初始透明度 if (sr != null) { Color c = sr.color; c.a = 0f; sr.color = c; } // 只要没到总寿命,就持续执行 while (elapsed < totalLifeTime) { if (obj == null) yield break; float dt = Time.deltaTime; elapsed += dt; // --- 1. 物理位移 --- vVelocity += gravity * dt; currentLocalPos.y += vVelocity * dt; obj.transform.localPosition = currentLocalPos; // --- 2. 透明度逻辑 (基于秒数) --- if (sr != null) { float alpha = 1f; // 渐显阶段:当前时间 < fadeInTime if (elapsed < fadeInTime) { alpha = Mathf.InverseLerp(0f, fadeInTime, elapsed); } // 渐隐阶段:当前时间 > fadeOutStartTime else if (elapsed > fadeOutStartTime) { // 在 fadeOutStartTime 到 totalLifeTime 之间从 1 变到 0 alpha = Mathf.InverseLerp(totalLifeTime, fadeOutStartTime, elapsed); } // 中间完全显示阶段 else { alpha = 1f; } Color c = sr.color; c.a = Mathf.Clamp01(alpha); sr.color = c; } yield return null; } // --- 确保最后一帧是完全透明的 --- if (obj != null && sr != null) { Color c = sr.color; c.a = 0f; sr.color = c; } // 等待渲染完成,防止闪除 yield return new WaitForEndOfFrame(); if (obj != null) Destroy(obj); } private Transform GetSpawnPoint(string color) { switch (color.ToLower()) { case "red": return redEffect?.transform; case "green": return greenEffect?.transform; case "yellow": return yellowEffect?.transform; case "purple": return purpleEffect?.transform; case "blue": return blueEffect?.transform; default: return null; } } private GameObject GetJudgePrefab(string result) { switch (result.ToLower()) { case "perfect": return perfect_judge_prefab; case "great": return great_judge_prefab; case "good": return good_judge_prefab; case "miss": return miss_judge_prefab; default: return null; } } }