Разработка / ROBLOX
Таблицы Luau: список точек маршрута и поиск по ключу
Одна таблица может описывать последовательность, другая — сведения о точках по имени. На учебной прогулке с фонарями разберём индекс, ключ и значение, прочитаем нужную запись и проверим, что меняется после вставки или удаления элемента списка.
Разделите два вопроса #
В вымышленной прогулке есть начало, конец мостика и обзорная площадка. Первый вопрос: какую точку посетить следующей? Второй: какое описание относится к выбранной точке? Порядок и сведения о конкретной точке связаны, но хранить их удобнее как два явно разных набора данных.
Для порядка используем список идентификаторов routeStart, bridgeEnd и lookout. Для описаний — таблицу с этими ключами. Имена придуманы для упражнения, а не взяты из существующей игры. Такое разделение позволяет переставить шаги, не превращая номер позиции в постоянное имя станции.
Прочитайте первый элемент списка #
Таблица создаётся фигурными скобками. В первом примере три значения записаны подряд и образуют простой массив. Чтение route[1] выбирает первую позицию, route[3] — третью. Индексация такого списка в Luau начинается с единицы, поэтому нулевой индекс не обозначает его начало.
Перед запуском короткого примера предскажите две строки вывода: routeStart и lookout. Сравнивайте значения, а не только наличие сообщения. Это упражнение с данными в памяти: оно не переносит персонажа на старт, не создаёт объект в Workspace и не сохраняет маршрут между сеансами.
local route = {"routeStart", "bridgeEnd", "lookout"}
print(route[1])
print(route[3])Используйте ключ для сведений #
Во втором примере stations содержит именованные записи. Значение stations["bridgeEnd"] выбирается по точному ключу, а не по месту записи в тексте таблицы. Внутри записи поля title и enabled имеют разные назначения: заголовок для учебного вывода и логический признак.
Связь работает через совпадающий идентификатор: берём ID из списка, затем находим stations[ID]. Для нашего обычного массива сохраните порядок последовательным. Если сведения обходятся по ключам, не превращайте порядок такого обхода в маршрут: порядок задаёт отдельный список, а ключ обозначает нужную запись.
Не путайте отсутствие и false #
Отсутствующему ключу соответствует nil. Поле enabled=false, напротив, хранит существующее логическое значение. В примере станция может быть найдена, хотя флаг выключен. Условие «нет записи» и условие «запись есть, но выключена» должны давать разные выводы.
Сначала проверьте, что запись существует, и только потом читайте её поля. Если идентификатор не найден, сохраните понятное сообщение с этим ID и остановите соответствующий учебный шаг. Не подставляйте случайную первую станцию: так ошибка данных станет похожа на успешный поиск и её будет сложнее заметить.
local stations = {
routeStart = {title = "Start", enabled = true},
bridgeEnd = {title = "Bridge", enabled = false},
lookout = {title = "Lookout", enabled = true},
}
local station = stations["bridgeEnd"]
if station == nil then
print("Missing station")
else
print(station.title, station.enabled)
endВставьте промежуточную точку #
В третьем примере table.insert добавляет restSpot на вторую позицию. Прежняя вторая точка bridgeEnd сдвигается на третью, а обзорная площадка — дальше. Сравните список до и после операции. Это изменение порядка, а не переименование bridgeEnd.
Если интерфейс будущего проекта хранит только число «2», после вставки оно может обозначать другую точку. В упражнении передавайте устойчивый ID там, где требуется назвать станцию, и используйте индекс там, где требуется позиция. Таблица сама не решает, как ваш проект должен хранить выбранный шаг.
Удалите элемент и перечитайте позиции #
table.remove удаляет элемент в заданной позиции и сдвигает последующие назад. В нашем примере удаляем временный restSpot со второй позиции, получая исходную последовательность. Проверьте, что bridgeEnd снова второй, а lookout третий. Чтение старой позиции без повторной проверки может привести к другому значению.
Для обучения оставляем массив непрерывным. Не заменяйте удаление произвольным nil в середине списка и не рассчитывайте длину такого разреженного набора как обычного маршрута. В реальной системе уточните правила вставки и удаления, прежде чем связывать позиции с прогрессом игрока.
local route = {"routeStart", "bridgeEnd", "lookout"}
table.insert(route, 2, "restSpot")
print(route[2])
print(route[3])
table.remove(route, 2)
print(route[2])
print(route[3])Отделите данные от игрового действия #
Список точек — описание порядка. Запись станции — описание данных. Чтобы персонаж двигался, появлялась подсказка или выдавалась награда, нужна отдельная логика, использующая эти значения. Успешный print не доказывает правильность взаимодействия с объектами, сетью или сохранением.
Идентификаторы упражнения оставьте одинаковыми во всех переводах; текст, видимый игроку, можно локализовать отдельно. Если переводить технический ключ только в одном наборе, связь списка и словаря нарушится. В матрице проверки сопоставляйте ID с записью, а не с красивым названием на экране.
Сделайте небольшую проверку данных #
Проверьте начало списка, нужный ключ, неизвестный ID, выключенный флаг и сдвиг после вставки. Для примеров статьи подготовлены независимые проверки ожидаемых значений. Они относятся к обычным таблицам Luau и не являются запуском существующей игры в Roblox Studio.
Добавьте отрицательный случай: в списке указан ID, которого нет в stations. Хороший результат такой проверки — обнаруженное несоответствие, а не молчаливое продолжение с чужой станцией. Запишите, какой элемент проблемный и какой набор требуется исправить, не меняя сразу весь маршрут.
Помните о ссылках на таблицу #
Присваивание таблицы другой переменной не создаёт независимую копию. Поэтому имя вроде backupRoute само по себе не сохраняет прежнее содержимое, если оно ссылается на тот же набор. Это важно для планируемых экспериментов: отделяйте ссылку и действительно подготовленную копию.
В этом уроке примеры запускаются с собственными маленькими наборами. Они не предлагают универсальный способ копировать вложенную конфигурацию. Для следующей задачи отдельно определите, какие данные вложены и что должно оставаться общим; поверхностную копию нельзя автоматически считать независимой во всех уровнях.
| Проверка | Ожидание |
|---|---|
| Первый элемент | Начало имеет индекс 1 |
| Известный ключ | Найдена ожидаемая запись |
| Неизвестный ключ | Выявлен отсутствующий ID |
| Вставка и удаление | Проверены новые позиции |
Передайте структуру следующему разработчику #
Итоговая заметка содержит последовательность ID, таблицу сведений, смысл полей, реакцию на отсутствующий ключ и ожидаемые изменения позиций. Добавьте, какие примеры проверены отдельно и что пока не связано с игровыми объектами. Так разработчик получает конкретный контракт данных вместо обещания готовой механики.
Официальная ссылка объясняет таблицы Luau, а прогулка, ключи и проверки придуманы для статьи. Существующие игры не менялись. После понимания списка и словаря можно отдельно разработать обработку маршрута, взаимодействия и прогресса, сохраняя различие между данными и реально выполненным действием.
| Поле | Что передать |
|---|---|
| Порядок | Последовательность ID без пропусков |
| Ключи | Идентификаторы и смысл полей |
| Отсутствие | Понятная реакция на неизвестный ID |
| Операции | Ожидаемый сдвиг позиций |