Списки в инспекторе
Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 19 из 64.
Список записей [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>, и создай список таких объектов.
Задание
ЛегкоПоказывай разговор Миры и Тома по одной строке за раз.
- Объяви класс
[System.Serializable]Lineс общедоступными строковыми полямиspeakerиtext, а также добавьpublic List<Line> lines;. - В начале покажи
lines[0]: говорящего — вspeakerText, его реплику — вlineText. - Нажатие пробела показывает следующую строку, пока не будут показаны все строки из
lines.Count. После последней строки скройboxи выведи в журналDialogue over; после этого нажатие пробела ничего не делает.
Нажми «Играть» и читай, нажимая пробел. Затем нажми «Проверить».
Попробуйте сами
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
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Сериализованные данные
Сериализуемые классыСписки в инспектореПеречисления в инспектореПовторение: таблица добычиПовторение: определяем добычу2Интерфейсы в Unity
IDamageableИнтерфейсы и TryGetComponentGetComponentsПовторение: клавиша взаимодействияПовторение: ближайший в пределах досягаемости5ScriptableObjects
Ресурсы данныхХарактеристики оружияОбщие настройкиСохраняем ветерВолны как данныеПовторение: база предметовПовторение: покупка в магазинеПотренируйтесь самостоятельно: Песочница Unity