Обновить значение из дочернего класса в родительский класс в Unity

#c# #unity3d

#c# #unity-игровой движок

Вопрос:

Я пытаюсь создать разные HP для разных врагов, где я хочу изменить значение дочернего класса, вызвав функцию из его родительского класса. Таким образом, я могу просто использовать функции родительского класса, но HP будет разным для разных типов врагов. Я новичок в Unity, поэтому не уверен, как это сделать.

Вот мои коды:

Enemy.cs (родительский)

 public class Enemy : MonoBehaviour
{
    public int hp = 30;  // Need to get this value from Child class
    protected Animator anm;
    protected Rigidbody2D rb;

    protected virtual void Start() {
        anm = GetComponent<Animator>();
        rb = GetComponent<Rigidbody2D>();
    }

    public void Hurt() {
        rb.velocity = Vector2.zero;
        anm.SetTrigger("hurt");
        hp -= 10;
        if (hp <= 0)
        {
            Death();
        }
    }

    public void Death() {
        anm.SetTrigger("death");
    }
}
  

Guard.cs (дочерний)

 public class Guard : Enemy
{
    public int hp = 50;
    protected Animator anm;
    protected Rigidbody2D rb;

    protected override void Start()
    {
        base.Start();
        coll = GetComponent<Collider2D>();
    }
}
  

Как я могу сделать hp значение разным для разных врагов в Unity?

Ответ №1:

Не скрывайте hp (и другие поля / свойства) из базового класса в производные.

Они уже находятся в родительском классе и, следовательно, присутствуют в производном

В Start() вы можете добавить hp = 50;

Enemy.cs (родительский)

 public class Enemy : MonoBehaviour
{
    public int hp = 30;  // Need to get this value from Child class
    protected Animator anm;
    protected Rigidbody2D rb;

    protected virtual void Start() {
        anm = GetComponent<Animator>();
        rb = GetComponent<Rigidbody2D>();
    }

    public void Hurt() {
        rb.velocity = Vector2.zero;
        anm.SetTrigger("hurt");
        hp -= 10;
        if (hp <= 0)
        {
            Death();
        }
    }

    public void Death() {
        anm.SetTrigger("death");
    }
}
  

Guard.cs (дочерний)

 public class Guard : Enemy
{
    // remove the fields/properties already present in Enemy

    protected override void Start()
    {
        base.Start();
        hp = 50; // <-------------------       Set the value for Guard here
        coll = GetComponent<Collider2D>();
    }
}
  

Комментарии:

1. Большое вам спасибо. Это сработало. Вы правы, что удалили поля / свойства, уже присутствующие в Enemy, я действительно сделал это в своем реальном скрипте, забыл удалить здесь. Итак, теперь, если я создам другой дочерний класс Enemy amp; если я хочу, чтобы hp этого класса был равен 100, я просто изменю его на Start() ? Повлияет ли это на другой дочерний класс?

2. Нет, это не повлияет на другого дочернего класса. Представьте, что у вас есть дочерний класс, он наследует некоторые вещи от вас (генетику). Однажды ваш ребенок решил, что у него будут зеленые волосы. У всех ли ваших дочерних классов будут зеленые волосы? Единственный случай, когда это может повлиять на весь производный класс, — это если вы что-то измените static