Методы расширения
Часть раздела Архитектура игр в 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 удаляет их только в конце кадра.
Задание
СреднеДобавь сове два метода расширения.
- В
FlatExtensionsдобавь публичный статический методFlatDistance(this Vector3 a, Vector3 b): расстояние без учёта высоты —5от (0, 5, 0) до (3, 0, 4). - Аналогично,
FaceFlat(this Transform t, Vector3 target)поворачиваетtтолько вокруг оси y. - В
Owlнаправь сову на игрока с помощью FaceFlat;eyesвключены, пока FlatDistance меньшеsight.
Нажми «Играть» и пройди под совой: её глаза загорятся. Затем нажми «Проверить».
Попробуйте сами
using UnityEngine;
public static class FlatExtensions
{
// Здесь должны быть FlatDistance (Vector3) и FaceFlat (Transform)
}
Все уроки раздела Архитектура игр в Unity
1Компоненты, а не иерархии
Небольшие компонентыБазовый скрипт врагаАбстрактные компонентыКомпоненты работают вместеПовторение: модульная турельПовторение: спаренная пушка4Сериализованные данные
Сериализуемые классыСписки в инспектореПеречисления в инспектореПовторение: таблица добычиПовторение: определяем добычу2Интерфейсы в Unity
IDamageableИнтерфейсы и TryGetComponentGetComponentsПовторение: клавиша взаимодействияПовторение: ближайший в пределах досягаемости5ScriptableObjects
Ресурсы данныхХарактеристики оружияОбщие настройкиСохраняем ветерВолны как данныеПовторение: база предметовПовторение: покупка в магазине8Переиспользуемый код
Методы расширенияОбобщённый синглтонОбобщённые вспомогательные методыПовторение: FindNearestПотренируйтесь самостоятельно: Песочница Unity