using UnityEngine;
|
using System;
|
|
/// <summary>
|
/// 战斗飘字UI控制器:处理缩放、透明度、位置动画逻辑
|
/// </summary>
|
[SerializeField]
|
public class BattleFloatingUIController
|
{
|
// Position Settings
|
public Vector2 beginPos = Vector2.zero;
|
public Vector2 endPos = new Vector2(0, 150);
|
|
// Time Settings
|
public float scaleChangeTime = 1f / BattleConst.skillMotionFps * 8f + 0.1f; // 7~8帧 (8/30=0.2667秒)
|
public float totalShowTime = 1f / BattleConst.skillMotionFps * 24f + 0.1f; // 总时间约24帧 (8+16=24帧)
|
|
// Normal Settings
|
public Vector3 normalBeginScale = new Vector3(2f, 2f, 2f);
|
public Vector3 normalEndScale = new Vector3(1f, 1f, 1f);
|
|
// Critical Settings
|
public Vector3 critBeginScale = new Vector3(3f, 3f, 3f);
|
public Vector3 critEndScale = new Vector3(1.5f, 1.5f, 1.5f);
|
|
// Color Settings
|
public Color beginColor = new Color(1f, 1f, 1f, 0.5f);
|
public Color endColor = new Color(1f, 1f, 1f, 1f);
|
|
private RectTransform rectTransform;
|
private float timer = 0f;
|
private float speedRatio = 1f;
|
private float scaleRatio = 1f;
|
private bool isCritical = false;
|
private Action onFinishCallback;
|
private Action<Color> applyColorCallback;
|
private GameObject gameObject;
|
|
// 添加只读属性以对外暴露
|
public float Timer => timer;
|
public float SpeedRatio => speedRatio;
|
public float ScaleRatio => scaleRatio;
|
|
public BattleFloatingUIController(RectTransform rect, GameObject go, Action<Color> applyColor)
|
{
|
rectTransform = rect;
|
gameObject = go;
|
applyColorCallback = applyColor;
|
}
|
|
public void SetRatio(float speed, float scale)
|
{
|
speedRatio = speed;
|
scaleRatio = scale;
|
}
|
|
public void Play(bool isCrit, Action onComplete = null)
|
{
|
isCritical = isCrit;
|
onFinishCallback = onComplete;
|
timer = 0f;
|
|
Vector3 beginScale = isCritical ? critBeginScale : normalBeginScale;
|
rectTransform.anchoredPosition = beginPos;
|
rectTransform.localScale = beginScale * scaleRatio;
|
|
gameObject.SetActive(true);
|
}
|
|
public void Run()
|
{
|
if (!gameObject.activeSelf)
|
return;
|
|
if (timer >= totalShowTime)
|
{
|
gameObject.SetActive(false);
|
onFinishCallback?.Invoke();
|
onFinishCallback = null;
|
return;
|
}
|
|
// 整个过程都往上飘
|
float moveProgress = timer / totalShowTime;
|
rectTransform.anchoredPosition = Vector2.Lerp(beginPos, endPos, moveProgress);
|
|
Vector3 currentBeginScale = isCritical ? critBeginScale : normalBeginScale;
|
Vector3 currentEndScale = isCritical ? critEndScale : normalEndScale;
|
|
// 阶段1: 7~8帧内缩放和透明度变化
|
if (timer < scaleChangeTime)
|
{
|
float scaleProgress = timer / scaleChangeTime;
|
rectTransform.localScale = Vector3.Lerp(currentBeginScale, currentEndScale, scaleProgress) * scaleRatio;
|
|
Color currentColor = Color.Lerp(beginColor, endColor, scaleProgress);
|
applyColorCallback?.Invoke(currentColor);
|
}
|
// 阶段2: 保持缩放和透明度,继续往上飘
|
else
|
{
|
rectTransform.localScale = currentEndScale * scaleRatio;
|
applyColorCallback?.Invoke(endColor);
|
}
|
|
timer += 1f / BattleConst.skillMotionFps * speedRatio;
|
}
|
|
public void Stop()
|
{
|
// 可以添加暂停逻辑
|
}
|
|
public void Resume()
|
{
|
// 可以添加恢复逻辑
|
}
|
}
|