Обращение к наследуемому элементу в дочернем классе 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 шт):

Автор решения: aepot

Суть проблемы не ясна, 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);
    }
}
→ Ссылка