Компонентный подход в Unity

     Что такое компоненты

    В игровом движке Unity реализован компонентный подход разработки. Это означает что разработчикам не надо писать один огромный кусок кода для того ,чтоб он отвечал за все возможности данного объекта. Разработчик может разбить эти части и они могут работать отдельно друг от друга или вместе. Именно эти части можно назвать компонентами. То есть  компонент = класс наследующийся от MonoBehaviour. 

    В движке  множество своих компонентов, которые разработала команда разработчиков Unity. Например это Box Colider, Light, Rigidbody и т.д. Но так как движок используется и в 2д и в 3д то некоторые компоненты разделяются и не могут использоваться вместе на одном объекте. Это например Box Colider и Box Colider2d.

Интересные фишки с компонентами

     Первая возможность это проверка объекта по компоненту. Обычно в уроках предлагают делать проверку по тегу, но в данном способе можно ошибиться в названии тега. Да и помнить теги сложнее чем компоненты, так как компоненты являются классами и ide подсказывает как правильно пишется ваш класс. С помощью похожего метода мы понимаем ,что зашел в триггер именно враг. 

private void OnTriggerEnter(Collider other)

    {

        if (other.GetComponent<Enemy>()!= null) 

        {

            Debug.Log("Враг");

        }

    }

Для подобной реализации unity разработали даже метод public bool TryGetComponent(out T component);

  private void OnTriggerEnter(Collider other)

    {

        if (other.TryGetComponent(out Enemy enemy)) 

        {

            Debug.Log("Враг 1");

        }

    }

    Вторая интересная возможность это повесить и убрать компонент с помощью кода. Данную вещь можно использовать для наложения эффектов на игрока или на врагов.

public class TestEffects : MonoBehaviour

    public Effects[] effects;

    public GameObject testObject; 

    public void Superimpose()

    {

      Bleeding bled=testObject.AddComponent<Bleeding>();

    } 

}

 public class Bleeding : Effects

{

private IEnumerator coroutine;

    void Start()

    {

        Debug.Log("кровотечение добавлено");

        print("Starting " + Time.time + " seconds");

        coroutine = WaitAndPrint(10.0f);

        StartCoroutine(coroutine);


        print("Coroutine started");

    }

public void DestroyComponent()

{

 Debug.Log("кровотечение удалено");   

 Bleeding component=GetComponent<Bleeding>();

 Destroy(component);    

}

  private IEnumerator WaitAndPrint(float waitTime)

    {

        yield return new WaitForSeconds(waitTime);

        print("Coroutine ended: " + Time.time + " seconds");

        DestroyComponent();

    }

}

    В данном примере показана возможность наложения кровотечения как эффекта.