using HarmonyLib;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
namespace test
{
///
/// Harmony补丁类,用于修改HealthBar的行为
/// 添加血量数值显示功能
///
[HarmonyPatch]
public class HealthBarPatch
{
// 使用字典来存储每个HealthBar实例对应的血量文本
private static readonly Dictionary healthTexts = new Dictionary();
///
/// 补丁HealthBar的Setup方法,初始化血量文本
///
[HarmonyPostfix]
[HarmonyPatch(typeof(Duckov.UI.HealthBar), "Setup")]
static void SetupPostfix(Duckov.UI.HealthBar __instance)
{
// 如果这个HealthBar已经有对应的文本,先清理
if (healthTexts.ContainsKey(__instance))
{
CleanupHealthText(__instance);
}
// 创建血量文本对象
GameObject textObj = new GameObject("HealthText");
textObj.transform.SetParent(__instance.transform);
// 设置文本组件
TextMeshProUGUI healthText = textObj.AddComponent();
healthText.fontSize = 12;
healthText.color = Color.white;
healthText.alignment = TextAlignmentOptions.Center;
// 设置文本位置
RectTransform rectTransform = textObj.GetComponent();
rectTransform.anchorMin = new Vector2(0, 0);
rectTransform.anchorMax = new Vector2(1, 1);
rectTransform.offsetMin = new Vector2(0, 0);
rectTransform.offsetMax = new Vector2(0, 0);
// 将文本对象存储到字典中
healthTexts[__instance] = healthText;
// 更新血量文本
UpdateHealthText(__instance);
}
///
/// 补丁HealthBar的Refresh方法,更新血量文本
///
[HarmonyPostfix]
[HarmonyPatch(typeof(Duckov.UI.HealthBar), "Refresh")]
static void RefreshPostfix(Duckov.UI.HealthBar __instance)
{
UpdateHealthText(__instance);
}
///
/// 补丁HealthBar的Release方法,清理血量文本
///
[HarmonyPostfix]
[HarmonyPatch(typeof(Duckov.UI.HealthBar), "Release")]
static void ReleasePostfix(Duckov.UI.HealthBar __instance)
{
CleanupHealthText(__instance);
}
///
/// 清理与HealthBar关联的血量文本
///
static void CleanupHealthText(Duckov.UI.HealthBar healthBar)
{
if (healthTexts.TryGetValue(healthBar, out TextMeshProUGUI textComponent))
{
if (textComponent != null && textComponent.gameObject != null)
{
Object.DestroyImmediate(textComponent.gameObject);
}
healthTexts.Remove(healthBar);
}
}
///
/// 更新血量文本显示
///
static void UpdateHealthText(Duckov.UI.HealthBar healthBar)
{
if (!healthTexts.TryGetValue(healthBar, out TextMeshProUGUI textComponent) ||
textComponent == null ||
healthBar.target == null)
return;
float currentHealth = healthBar.target.CurrentHealth;
float maxHealth = healthBar.target.MaxHealth;
// 显示当前血量和最大血量
textComponent.text = $"{currentHealth:F0}/{maxHealth:F0}";
}
}
}