修复一堆bug 加入粒子系统代替原击打特效 焕新长音符逻辑 修复多重计分 更新判定管理和音符生成器 搞了一个免费包
This commit is contained in:
@@ -0,0 +1,163 @@
|
||||
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<SpriteRenderer>();
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user