When I attack an enemy, the damage text only instantiates once, the very first time I hit the first enemy, and then never spawns again until I delete my save file.
This does not occur with the player, however, in which case the damage text spawns every time he takes damage.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace RPG.UI.DamageText
{
public class DamageTextSpawner : MonoBehaviour
{
[SerializeField] DamageText damageTextPrefab = null;
public void Spawn(float damageAmount)
{
DamageText instance = Instantiate<DamageText>(damageTextPrefab, transform);
}
}
}
using System;
using GameDevTV.Utils;
using RPG.Core;
using RPG.Saving;
using RPG.Stats;
using UnityEngine;
using UnityEngine.Events;
namespace RPG.Resources
{
public class Health : MonoBehaviour, ISaveable
{
[SerializeField] float regenerationPercentage = 70;
[SerializeField] UnityEvent takeDamage;
LazyValue<float> healthPoints;
bool isDead = false;
private void Awake()
{
healthPoints = new LazyValue<float>(GetInitialHealth);
}
private float GetInitialHealth()
{
return GetComponent<BaseStats>().GetStat(Stat.Health);
}
private void Start()
{
healthPoints.ForceInit();
}
private void OnEnable()
{
GetComponent<BaseStats>().onLevelUp += RegenerateHealth;
}
private void OnDisable()
{
GetComponent<BaseStats>().onLevelUp -= RegenerateHealth;
}
public bool IsDead()
{
return isDead;
}
public void TakeDamage(GameObject instigator, float damage)
{
print(gameObject.name + " took damage: " + damage);
healthPoints.value = Mathf.Max(healthPoints.value - damage, 0);
if (healthPoints.value == 0)
{
Die();
AwardExperience(instigator);
}
else
{
takeDamage.Invoke();
}
}
public float GetHealthPoints()
{
return healthPoints.value;
}
public float GetMaxHealthPoints()
{
return GetComponent<BaseStats>().GetStat(Stat.Health);
}
public float GetPercentage()
{
return 100 * (healthPoints.value / GetComponent<BaseStats>().GetStat(Stat.Health));
}
private void Die()
{
if (isDead) return;
isDead = true;
GetComponent<Animator>().SetTrigger("die");
GetComponent<ActionScheduler>().CancelCurrentAction();
}
private void AwardExperience(GameObject instigator)
{
Experience experience = instigator.GetComponent<Experience>();
if (experience == null) return;
experience.GainExperience(GetComponent<BaseStats>().GetStat(Stat.ExperienceReward));
}
private void RegenerateHealth()
{
float regenHealthPoints = GetComponent<BaseStats>().GetStat(Stat.Health) * (regenerationPercentage / 100);
healthPoints.value = Mathf.Max(healthPoints.value, regenHealthPoints);
}
public object CaptureState()
{
return healthPoints.value;
}
public void RestoreState(object state)
{
healthPoints.value = (float)state;
if (healthPoints.value <= 0)
{
Die();
}
}
}
}