107 lines
2.6 KiB
C#

using System.Text;
using UnityEngine;
using UnityEngine.UI;
namespace Kryz.CharacterStats.Examples
{
public class StatTooltip : MonoBehaviour
{
public static StatTooltip Instance;
[SerializeField] Text statNameText;
[SerializeField] Text finalValueText;
[SerializeField] Text modifiersListText;
private StringBuilder sb = new StringBuilder();
private void Awake()
{
if (Instance == null)
{
Instance = this;
}
else
{
Destroy(this);
}
gameObject.SetActive(false);
}
public void ShowTooltip(CharacterStat stat, string statName)
{
gameObject.SetActive(true);
statNameText.text = FirstLetterToUpper(statName);
finalValueText.text = GetValueText(stat);
modifiersListText.text = GetModifiersText(stat);
}
public void HideTooltip()
{
gameObject.SetActive(false);
}
private string GetValueText(CharacterStat stat)
{
sb.Length = 0;
sb.Append(stat.Value);
sb.Append(" (");
sb.Append(stat.BaseValue);
sb.Append(" + ");
sb.Append((float)System.Math.Round(stat.Value - stat.BaseValue, 4));
sb.Append(")");
return sb.ToString();
}
private string GetModifiersText(CharacterStat stat)
{
sb.Length = 0;
for (int i = 0; i < stat.StatModifiers.Count; i++)
{
StatModifier mod = stat.StatModifiers[i];
if (mod.Source is Item)
sb.Append(((Item)mod.Source).name);
else
sb.Append(mod.Source as string);
sb.Append(": ");
if (mod.Value > 0)
{
sb.Append("+");
}
if (mod.Type == StatModType.Flat)
{
sb.Append(mod.Value);
}
else
{
sb.Append(mod.Value * 100);
sb.Append("%");
}
if (i < stat.StatModifiers.Count - 1)
{
sb.AppendLine();
}
}
return sb.ToString();
}
private string FirstLetterToUpper(string s)
{
if (string.IsNullOrEmpty(s))
return null;
char[] a = s.ToCharArray();
a[0] = char.ToUpper(a[0]);
return new string(a);
}
}
}