using UnityEngine;
using System;
using UnityEngine.UI;
///
/// 战斗飘字UI组件
/// 职责:管理UI元素和与控制器的交互
///
public class BattleTips : MonoBehaviour, IBattleFloatingUI
{
#region Inspector字段
[Header("UI Components")]
public RectTransform rectTransform;
public Text tipText;
public Text artText;
public Image background;
[Header("Floating Config")]
[Tooltip("飘字动画配置,请在Inspector中拖拽赋值")]
public FloatingConfig floatingConfig;
#endregion
#region 公共字段
public Action OnFinish;
// Buff 颜色相关
private bool useBuffColor = false;
private bool isDebuff = false;
#endregion
#region 私有字段
// 移除 [SerializeField],controller 不应该被序列化
private BattleFloatingUIController controller;
#endregion
#region 公共方法
///
/// 设置速度和缩放比例
///
public void SetRatio(float speed, float scale)
{
EnsureControllerInitialized();
controller?.SetRatio(speed, scale);
}
///
/// 设置运行时位置(用于不跟随角色的飘字)
///
public void SetPosition(Vector2 beginPos, Vector2 endPos)
{
EnsureControllerInitialized();
controller?.SetRuntimePosition(beginPos, endPos);
}
///
/// 运行时更新配置
///
public void SetFloatingConfig(FloatingConfig config)
{
floatingConfig = config;
if (controller != null)
{
controller.SetConfig(config);
}
else
{
InitController();
}
}
///
/// 设置是否使用 Buff 颜色
///
public void SetBuffColor(bool useBuff, bool isDebuffBuff)
{
useBuffColor = useBuff;
isDebuff = isDebuffBuff;
// 如果使用 buff 颜色,立即设置运行时颜色覆盖
if (useBuffColor && floatingConfig != null)
{
Color buffColor = isDebuff ? floatingConfig.debuffColor : floatingConfig.gainBuffColor;
Color beginColor = new Color(buffColor.r, buffColor.g, buffColor.b, floatingConfig.beginColor.a);
Color endColor = new Color(buffColor.r, buffColor.g, buffColor.b, floatingConfig.endColor.a);
EnsureControllerInitialized();
controller?.SetRuntimeColor(beginColor, endColor);
}
}
///
/// 设置文本内容和样式
///
public void SetText(string text, bool useArtText = false, bool isCrit = false)
{
EnsureControllerInitialized();
// 切换文本显示类型
SwitchTextDisplay(useArtText, text);
// 开始播放
Play(isCrit);
}
///
/// 显示/隐藏背景
///
public void ShowBackground(bool show)
{
if (background != null)
background.enabled = show;
}
#endregion
#region IBattleFloatingUI接口实现
public void Play(bool isCrit, Action onComplete = null)
{
EnsureControllerInitialized();
if (controller == null) return;
// 合并回调
Action combinedCallback = () =>
{
OnFinish?.Invoke();
OnFinish = null;
onComplete?.Invoke();
};
controller.Play(isCrit, combinedCallback);
}
public void Run()
{
controller?.Run();
}
public void Stop()
{
controller?.Stop();
}
public void Resume()
{
controller?.Resume();
}
#endregion
#region 私有方法
///
/// 初始化控制器
///
private void InitController()
{
if (controller != null) return;
if (floatingConfig == null)
{
Debug.LogError($"[BattleTips] FloatingConfig 未配置! GameObject: {gameObject.name}");
return;
}
controller = new BattleFloatingUIController(
rectTransform,
gameObject,
ApplyColor,
floatingConfig
);
}
///
/// 确保控制器已初始化
///
private void EnsureControllerInitialized()
{
if (controller == null)
InitController();
}
///
/// 切换文本显示类型
///
private void SwitchTextDisplay(bool useArtText, string text)
{
if (useArtText)
{
artText.text = text;
tipText.gameObject.SetActive(false);
artText.gameObject.SetActive(true);
}
else
{
tipText.text = text;
artText.gameObject.SetActive(false);
tipText.gameObject.SetActive(true);
}
}
///
/// 应用文本颜色(保留配置的透明度)
///
private void ApplyTextColor(Color textColor)
{
if (floatingConfig != null)
{
Color colorWithAlpha = new Color(
textColor.r,
textColor.g,
textColor.b,
floatingConfig.beginColor.a
);
ApplyColor(colorWithAlpha);
}
}
///
/// 应用颜色到激活的文本组件
///
private void ApplyColor(Color color)
{
if (tipText.gameObject.activeSelf)
tipText.color = color;
if (artText.gameObject.activeSelf)
artText.color = color;
}
#endregion
}