Menu
CoddyTech

Методы расширения

Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 33 из 50.

Vector3 и Transform относятся к Unity, поэтому нельзя добавить к ним метод. Метод расширения — это статический метод, который C# позволяет вызывать так, будто он принадлежит этому типу. Эти два метода позволяют сократить код, который встречается в каждом проекте:

public static class UnityExtensions
{
    public static Vector3 WithY(this Vector3 v, float y)
    {
        return new Vector3(v.x, y, v.z);
    }

    public static void DestroyChildren(this Transform parent)
    {
        foreach (Transform child in parent)
        {
            Object.Destroy(child.gameObject);
        }
    }
}
// в любом скрипте
transform.position = transform.position.WithY(0.5f);
inventoryPanel.DestroyChildren();

Метод расширения определяется тремя условиями: это статический класс, который не является вложенным или обобщённым; статический метод; и this перед первым параметром. Этот параметр — значение слева от точки, поэтому transform.position.WithY(0.5f) компилируется в UnityExtensions.WithY(transform.position, 0.5f). Vector3 — структура, поэтому v является копией: WithY не может изменить вектор вызывающего кода и вместо этого возвращает новый. Так можно обойти ограничение transform.position.y = 0.5f;, которое не компилируется.

Статический класс не является MonoBehaviour. Он находится в отдельном файле .cs, имя может быть любым, и его никогда не добавляют к объекту. Для методов, унаследованных MonoBehaviour, таких как Destroy, здесь нужно указать класс: Object.Destroy. Уничтожать дочерние объекты внутри foreach безопасно, потому что Unity удаляет их только в конце кадра.

challenge icon

Задание

Средне

Сова на высоком столбе наблюдает за двором. Стрелки управляют Player (готово). Добавь в проект два метода расширения и используй их для совы:

  • В FlatExtensions.cs напиши статический класс FlatExtensions.
  • FlatDistance расширяет Vector3: a.FlatDistance(b) возвращает расстояние от a до b по земле, не учитывая разницу в высоте. От (0, 5, 0) до (3, 0, 4) оно равно 5.
  • FaceFlat расширяет Transform: t.FaceFlat(target) поворачивает t к цели только вокруг оси y, поэтому объект остаётся вертикальным, как бы высоко или низко ни находилась цель.
  • В Owl.cs сова каждый кадр поворачивается к игроку с помощью FaceFlat, а её eyes включены, пока игрок находится ближе, чем sight (3) по земле, и выключены в противном случае. Сова сидит высоко на столбе, поэтому здесь нельзя использовать Vector3.Distance.

Нажми Играть, обойди столб и пройди под совой, затем нажми Проверить.

Попробуйте сами

using UnityEngine;

// FlatExtensions: FlatDistance и FaceFlat
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Архитектура игр в Unity