C# Многоуровневое наследование - те же методы - PullRequest
0 голосов
/ 29 марта 2020

Я устанавливаю систему наследования для своего проекта в Unity, используя C#.

Entity: MonoBehaviour // Humanoid: Entity

Я делаю это, чтобы я мог настроить свойства в каждом типе класса, указав c тип моба, в котором он находится в игре.

public class Entity : MonoBehaviour
{
    public Animator anim;
    public CapsuleCollider capsuleCollider;
    void Start()
    {
        anim = GetComponent<Animator>();
        capsuleCollider = GetComponent<CapsuleCollider>();
    }
}
public class Humanoid : Entity
{
    void Start()
    {
        capsuleCollider.radius = 0.3f;
    }
}

Моя проблема в том, что привязанный GameObject Humanoid не будет запускать свой старт ( ) метод после запуска метода запуска Entity. Он выдает эту ошибку, поскольку они пытаются запустить одновременно:

UnassignedReferenceException: The variable capsuleCollider of NPC has not been assigned.

Так что я не уверен, как подключиться (я верю, что это правильная терминология) к концу Start моей сущности () Метод с помощью моего метода Humanoid Start ().

Я мог бы изменить начало Entity на Awake (), и это могло бы решить мою проблему, но я хочу настроить несколько уровней наследования, чтобы между ними не работали .

1 Ответ

3 голосов
/ 30 марта 2020

Я полагаю, что вы имеете в виду концепцию объектно-ориентированного программирования под названием полиморфизм. C# поддерживает это с ключевыми словами, такими как виртуальные и переопределить. Документацию по полиморфизму в C# можно найти здесь . Ниже я привел пример:

public class Entity : MonoBehaviour
{
    public virtual void Start()
    {
        // ... code specific to Entity
    }
}

public class Humanoid : Entity
{
    public override void Start()
    {
        base.Start(); // Do Entity.Start() first, then continue with Humanoid.Start()

        // ... other code specific to Humanoid
    }
}

Я не знаю, поддерживает ли это Unity Engine; Я бы так предположил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...