Обращение к наследуемому элементу в дочернем классе C#
Есть родительский класс Entity, содержащий поля Health и Damage, а также методы GetDamage и Die. Есть дочерний класс Hero, который наследует эти параметры.
Теперь к сути: есть объект который должен при столкновении увеличивать здоровье игрока. Как обратиться к наследуемому полю Health из этого объекта? (В родительском классе поле помечено как public)
Родительский класс:
public class Entity : MonoBehaviour
{
[SerializeField] public int Health;
[SerializeField] public int Damage;
public virtual void GetDamage(int Damage)
{
Health = Health-Damage;
Debug.Log($"{gameObject.name}\nЗдоровье: {Health}");
if (Health < 0)
{
Health = 0;
if (Health < 1)
Die();
}
}
public virtual void Die()
{
Destroy(this.gameObject);
}
}
Дочерний класс слишком объемный. Если будут нужны фрагменты кода из него - скину позже.
Ответы (1 шт):
Суть проблемы не ясна, Hero
должен и так содержать все поля родительского класса, к которым можно обращаться. Заведите метод Heal()
который будет лечить игрока. Зачем поле Damage
- непонятно.
public class Entity : MonoBehaviour
{
private int _health; // не видно в наследнике
[SerializeField] protected int maxHp; // видно в наследнике
public int Health => _health; // видно везде, но только для чтения
void Start()
{
_health = maxHp;
}
public virtual void Hit(int damage)
{
_health -= damage;
if (_health <= 0)
{
_health = 0;
Die();
}
Debug.Log($"{gameObject.name}\nЗдоровье: {Health}");
}
public virtual void Heal(int amount)
{
_health += damage;
if (_health > maxHp)
{
_health = maxHp;
}
Debug.Log($"{gameObject.name}\nЗдоровье: {Health}");
}
public virtual void Die()
{
Destroy(this.gameObject);
}
}
И в наследнике
public class Hero: Entity
{
void Awake()
{
maxHp = 1000;
}
public override Hit(int damage)
{
Debug.Log("Hero: Ай!");
base.Hit(damage);
}
public override Heal(int amount)
{
Debug.Log("Hero: Ого!");
base.Heal(amount);
}
}
Таким образом вы полностью изолировали логику управления здоровьем в классе Entity
.
Ну а при столкновении с аптечкой
[SerializeField] private int hp;
void OnTriggerEnter(Collider other)
{
var entity = other.gameObject.GetComponent<Entity>();
if (entity != null)
{
entity.Heal(hp);
Destroy(this.gameObject);
}
}