Методы расширения
Часть раздела Архитектура игр в 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 удаляет их только в конце кадра.
Задание
СреднеСова на высоком столбе наблюдает за двором. Стрелки управляют 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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Архитектура игр в Unity
1Компоненты, а не иерархии
Небольшие компонентыБазовый скрипт врагаАбстрактные компонентыСовместная работа компонентовПовторение: модульная турель4Сериализованные данные
Сериализуемые классыСписки в InspectorПеречисления в InspectorПовторение: таблица лута2Интерфейсы в Unity
IDamageableИнтерфейсы и TryGetComponentGetComponentsПовторение: клавиша взаимодействия5ScriptableObjects
Ресурсы данныхХарактеристики оружияОбщие настройкиВолны как данныеПовторение: база предметов8Переиспользуемый код
Методы расширенияОбобщённый синглтонОбобщённые вспомогательные методыПовторение: FindNearest