Menu
CoddyTech

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

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

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

Задание

Средне

Добавь сове два метода расширения.

  1. В FlatExtensions добавь публичный статический метод FlatDistance(this Vector3 a, Vector3 b): расстояние без учёта высоты — 5 от (0, 5, 0) до (3, 0, 4).
  2. Аналогично, FaceFlat(this Transform t, Vector3 target) поворачивает t только вокруг оси y.
  3. В Owl направь сову на игрока с помощью FaceFlat; eyes включены, пока FlatDistance меньше sight.

Нажми «Играть» и пройди под совой: её глаза загорятся. Затем нажми «Проверить».

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

using UnityEngine;

public static class FlatExtensions
{
    // Здесь должны быть FlatDistance (Vector3) и FaceFlat (Transform)
}

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

Потренируйтесь самостоятельно: Песочница Unity