Списки в Inspector
Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 16 из 50.
Список элементов [System.Serializable] — это таблица, которую ты заполняешь в Inspector. Этот охранник проходит маршрут по точкам и ждёт в каждой столько, сколько указано в соответствующей записи:
[System.Serializable]
public class Stop
{
public Transform point;
public float wait = 1f;
}
public class Patrol : MonoBehaviour
{
public float speed = 3f;
public List<Stop> stops;
private int current;
private float waited;
void Update()
{
Stop stop = stops[current];
transform.position = Vector3.MoveTowards(transform.position, stop.point.position, speed * Time.deltaTime);
if (transform.position != stop.point.position) return;
waited += Time.deltaTime;
if (waited >= stop.wait)
{
waited = 0f;
current = (current + 1) % stops.Count;
}
}
}В Inspector отображается Stops с количеством элементов и отдельным сворачиваемым пунктом для каждой записи: Element 0, Element 1 и так далее. В каждом есть поля Point и Wait. Кнопка + добавляет запись, кнопка минус удаляет выбранную, а маркер слева от строки позволяет перетащить её в другое место маршрута. Код работает со списком как обычно: stops.Count записей, stops[current].point, а выражение (current + 1) % stops.Count возвращает к первой точке после последней. Дизайнер уровней может задать одному охраннику три точки, а другому — десять, не меняя скрипт.
Массив public Stop[] stops; отображается так же. Кнопка + в Unity копирует последнюю запись, поэтому новая точка начинается с теми же point и wait, что и запись выше. Unity не отображает и не сохраняет список списков, например List<List<Stop>>, или Dictionary. Вместо этого оберни внутренний список в класс [Serializable], например Route с собственным List<Stop>, и храни список таких объектов.
Задание
ЛегкоМира и Том застряли у разрушенного моста. Создай диалоговое окно в Dialogue.cs на HUD. Сцена связывает box, speakerText и lineText, а беседа подготовлена для списка с именем lines.
- Объяви класс
Lineс двумя открытыми строкамиspeakerиtext, которые можно отображать в Inspector, и добавь в Dialogue открытый списокList<Line>с именемlines. - В начале окно показывает первую строку: говорящего — в
speakerText, а его текст — вlineText. - При каждом нажатии Space показывай следующую строку. В беседе может быть любое количество строк, поэтому ориентируйся на количество элементов в списке.
- Нажатие Space на последней строке скрывает окно и выводит в лог
Dialogue over. После этого нажатие Space ничего не делает.
Нажми Play, прочитай беседу, нажимая Space, затем нажми Check.
Попробуйте сами
using UnityEngine;
using TMPro;
public class Dialogue : MonoBehaviour
{
public GameObject box;
public TMP_Text speakerText;
public TMP_Text lineText;
void Start()
{
// показать первую реплику
}
void Update()
{
// Space: следующая реплика или завершение диалога
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Архитектура игр в Unity
1Компоненты, а не иерархии
Небольшие компонентыБазовый скрипт врагаАбстрактные компонентыСовместная работа компонентовПовторение: модульная турель4Сериализованные данные
Сериализуемые классыСписки в InspectorПеречисления в InspectorПовторение: таблица лута2Интерфейсы в Unity
IDamageableИнтерфейсы и TryGetComponentGetComponentsПовторение: клавиша взаимодействия5ScriptableObjects
Ресурсы данныхХарактеристики оружияОбщие настройкиВолны как данныеПовторение: база предметов