📖 Документация Wall Plast

Полное руководство по языку программирования для создания игр

Синтаксис языка

Синтаксис языка состоит в следующем: сначала идёт команда (без разницы, заглавными буквами или нет), и после каждой команды/параметра идёт знак подчеркивания _, а параметры отделяются друг от друга также _.

Пример базовой команды: Log_"Hello world!"

Здесь Log - команда, а "Hello world!" - параметр

Основные правила синтаксиса:

  • Команда не зависит от заглавных букв (Log, log, LOG - работают одинаково)
  • Параметры отделяются знаком _
  • Текстовые параметры обычно пишутся в кавычках, что облегчает понимание скриптом вводимых параметров
  • Несколько команд разделяются ; для последовательного выполнения
Выполнение нескольких команд подряд: SetActive_"Block"_false; Log_"block hidden";

Сначала выполнится SetActive, потом Log. Таким образом можно комбинировать выполнение команд в несколько строк.

Математика в скриптах

Язык поддерживает математические вычисления и позволяет вычислять значения прямо в коде. Поддерживаются следующие операции: + (сложение), - (вычитание), * (умножение), / (деление).

Примеры математических операций: Wait_2+2; transform_"Block"_position_y = 10 * 5; player_target_activated_moveSpeed *= 2;

Скрипт подождёт 4 секунды, телепортирует блок на высоту 50, удвоит скорость игрока

Операторы присваивания:

Когда вы меняете значения (например, позицию или текст), вы можете использовать различные операторы:

  • = - установить точное значение
  • += - прибавить к текущему значению
  • -= - отнять от текущего значения
  • *= - умножить текущее значение
  • /= - поделить текущее значение

Работа с текстом (склейка):

Если вы используете текст, его можно "склеивать" знаком +. Это позволяет объединять текстовые строки и значения переменных:

Примеры текстовых операций: text_"Sign" = "Уровень: " + 5; text_"Status" = "Игрок: " + "Alice"; local_Message = "HP: " + player_target_activated_hp;

События плиты (Events)

Скрипты привязываются к конкретным событиям плиты. Важно понимать, когда именно срабатывает каждое из них. Событие определяет момент и условия, при которых будет выполнен ваш скрипт.

Событие Описание
Start Выполняется всего один раз, когда вы запускаете тест карты. Если вы вернётесь в режим строительства, а затем снова начнёте тест, скрипт выполнится заново. Идеально для инициализации переменных и начальной настройки.
Update Этот скрипт крутится постоянно и непрерывно на протяжении всей игры, выполняясь каждый кадр. Отлично подходит для постоянных проверок состояния или непрерывного движения объектов.
OnPress Срабатывает ровно ОДИН раз в тот момент, когда игрок (или несколько) наступает на плиту и она опускается. При этом, если в этот момент выполнялись скрипты OnRelease или WhileNotPressed, они мгновенно прерываются (останавливаются), чтобы не мешать логике нажатия.
WhilePressed Выполняется непрерывно по кругу все время, пока на плите кто-то стоит. Срабатывает сразу после OnPress и продолжается до OnRelease.
OnRelease Срабатывает ровно ОДИН раз, когда плита возвращается в исходное (ненажатое) состояние и все игроки с неё ушли. При этом скрипты OnPress и WhilePressed мгновенно останавливаются.
WhileNotPressed Выполняется непрерывно по кругу все время, пока на плите никого нет. Срабатывает после OnRelease.
Важное примечание: Все запущенные события и циклы жестко прерываются, когда вы включаете режим строительства, чтобы вы могли спокойно редактировать карту без вмешательства скриптов.

Логика срабатывания событий:

Start ➜ Update (постоянно) ↓ Игрок нажал ➜ OnPress (1 раз) ➜ WhilePressed (постоянно) ↓ Игрок ушёл ➜ OnRelease (1 раз) ➜ WhileNotPressed (постоянно)

Координаты и векторы (Vector3)

Для управления объектами в трёхмерном пространстве (позиция, размер, вращение) используется понятие вектора Vector3_X_Y_Z, где X, Y, Z — это числа, значения переменных или математические выражения. X - горизонтальное положение (влево-вправо), Y - вертикальное положение (вверх-вниз), Z - глубина (вперед-назад).

Создание вектора: Vector3_10_5_1.5

Где X=10, Y=5, Z=1.5

Применение вектора к объекту:

Вы можете применять вектор целиком к объекту для одновременного изменения всех координат:

Телепортация блока: transform_"Block"_position = Vector3_0_10_0;

Телепортирует блок в координаты X=0, Y=10 (вверх), Z=0

Или менять только конкретную ось (x, y или z):

Изменение отдельных осей: transform_"Block"_position_y += 5; transform_"Block"_position_x = 20; transform_"Block"_position_z -= 3;

Поднимет блок на 5 единиц, переместит на 20 по X, отодвинет на 3 по Z

Поддерживаемые оси: x, y, z

Работа с векторами в математике:

Вы можете использовать математические выражения при создании векторов:

Примеры с вычислениями: Vector3_10*2_5+5_1.5; transform_"Block"_position = Vector3_(player_target_activated_transform_position_x)_0_0;

Преобразование в текст (_tostring)

Для вывода координат, характеристик или результатов вычислений на текстовую панель, добавьте суффикс _tostring в конце переменной или свойства.

Вывести позицию блока: text_"MySign" = "Блок: " + transform_"Block"_position_tostring;
Вывести здоровье игрока: text_"HealthBar" = "HP: " + player_target_activated_hp_tostring;

SetActive - Управление видимостью

Управляет активностью объектов в игре. Неактивные объекты не отображаются, не взаимодействуют с физикой и не выполняют скрипты. Это полезно для скрытия/проявления объектов, управления сложностью сцены и создания динамических игровых механик.

Синтаксис:

Параметр Описание
a Имя объекта в кавычках, например "Door" или "Light". Может быть переменная (без кавычек)
b true (объект активен, видим и работает) или false (объект неактивен, скрыт)

Основные случаи использования:

Пример 1: Выключение двери SetActive_"Door"_false; Log_"Дверь скрыта";
Пример 2: Включение света SetActive_"Light"_true; transform_"Light"_position = Vector3_0_5_-10;
Пример 3: Использование переменных local_doorName = "MainDoor"; local_isOpen = true; SetActive_local_doorName_!local_isOpen;
Пример 4: Последовательное управление SetActive_"Door"_false; SetActive_"Light"_true; SetActive_"Trap"_false; text_"Status" = "Объекты переключены";
Пример 5: Циклическое переключение видимости Cycle_5 { SetActive_"Moving_Box"_true; Wait_1; SetActive_"Moving_Box"_false; Wait_1; }
Внимание: Неактивные объекты не выполняют свои скрипты, поэтому они не смогут обннаружить события типа OnCollision, пока не будут активированы.
Полезный совет: SetActive работает с объектами, а не с компонентами. Это полностью отключает/включает весь объект со всеми его компонентами и дочерними объектами.

ChangeSound - Управление звуком

Позволяет управлять параметрами динамика в реальном времени. Измените музыку, громкость, скорость воспроизведения, рабочий диапазон и другие свойства звукового источника.

Синтаксис:

ChangeSound_"speaker"_"SoundCode"_volume_speed_radius_canPlayerToggle_playOnStart_visible_globalAudio

Параметры:

Параметр Тип Описание
a string Имя объекта динамика
b string Код музыки (должен быть определен в свойствах карты)
c float Громкость музыки (0.0 - 1.0 и выше)
d float Скорость воспроизведения музыки (1.0 = нормальная)
e float Радиус доступности звука в игровых единицах
f bool Может ли игрок выключить/включить динамик (true/false)
g bool Воспроизводить музыку при загрузке карты (true/false)
h bool Видна ли 3D-модель динамика в мире (true/false)
k bool Слышно ли везде на карте, независимо от расстояния (true/false)

Примеры использования:

Пример 1: Установка новой музыки с параметрами ChangeSound_"speaker"_"WpNight"_1_1_15_false_true_false_true;
Пример 2: Изменение громкости local_volume = 0.5; ChangeSound_"speaker"_"WpNight"_local_volume_1_15_true_true_true_false;
Пример 3: Глобальный фоновый звук (слышен везде) ChangeSound_"AmbienceLoop"_"Forest"_0.8_1_100_false_true_false_true;
Пример 4: Локальный локационный звук ChangeSound_"BellRing"_"BellSound"_0.7_1_20_false_true_true_false;
Пример 5: Динамическое изменение при слушании if (contains_text_player_target_activated_name_"bot") { ChangeSound_"speaker"_"FastMusic"_1_1.5_20_false_true_false_false; } else { ChangeSound_"speaker"_"SlowMusic"_0.8_1_15_true_true_false_false; }
Полезно знать: Если параметр установлен на пустую строку (""), то динамик остановится. Глобальный аудиоформат (параметр k) игнорирует радиус и воспроизводит звук везде на карте.
Важно: Коды музыки должны быть предварительно определены в свойствах сцены/карты. При использовании неправильного кода музыка не будет воспроизведена.

Log - Вывод отладки

Выводит отладочные сообщения в консоль разработчика. Полезна для отслеживания выполнения скрипта, значений переменных и диагностики проблем.

Синтаксис:

Log_"Message";

Типы сообщений:

Параметр Тип Описание
a string Сообщение для вывода в кавычках (поддерживает склейку с +)
b string Тип лога (необязательно): "warning" (жёлтый) или "error" (красный). По умолчанию - обычное сообщение (белый)

Типы сообщений:

  • Обычное: Log_"Message"; (белое сообщение)
  • Предупреждение: Log_"Message"_"warning"; (жёлтое сообщение)
  • Ошибка: Log_"Message"_"error"; (красное сообщение)
Пример 1: Простое сообщение Log_"Hello World!";
Пример 2: Сообщение об ошибке Log_"Критическая ошибка!"_"error";
Пример 3: Предупреждение Log_"Низкое значение HP"_"warning";
Пример 4: Логирование значений переменных local_playerName = player_target_activated_name; local_score = 100; Log_"Игрок: " + local_playerName + ", Счёт: " + local_score;
Пример 5: Отслеживание выполнения событий Log_"Скрипт запущен!"; SetActive_"Door"_true; Log_"Дверь открыта"; Wait_2; Log_"Ожидание завершено"_"warning";
Совет: Используйте Log для отладки логики скрипта. Разные типы сообщений помогают быстро найти критические ошибки и важные события.
Сообщения с логированием: Сообщения Log видны только в режиме разработчика. В готовом проекте они можно отключаются для представления пользователям.

Wait - Задержка

Останавливает выполнение скрипта на указанное количество секунд. Это полезно для создания паузы между событиями, синхронизации анимаций, или создания задержек в логике игры.

Синтаксис:

Wait_seconds;

Параметры:

Параметр Тип Описание
a float/int Время в секундах - поддерживает десятичные числа (0.5, 1.25 и т.д.) и математические выражения

Особенности:

  • Время указывается в секундах
  • Поддерживаются десятичные числа для задержек менее 1 секунды
  • Можно использовать математические выражения
  • Во время ожидания остальной код не выполняется
  • Можно использовать переменные для времени
Пример 1: Простая задержка Log_"Начало"; Wait_2; Log_"Прошло 2 секунды";
Пример 2: Долюдь секунды Wait_0.5; // Полсекунды Wait_0.1; // 0.1 секунды
Пример 3: Математические выражения Wait_2+3; // Ожидание 5 секунд Wait_10/2; // Ожидание 5 секунд Wait_1*5; // Ожидание 5 секунд
Пример 4: Использование переменных local_delayTime = 3; Log_"Ожидание " + local_delayTime + " секунд"; Wait_local_delayTime; Log_"Ожидание завершено";
Пример 5: Создание последовательности событий SetActive_"Light1"_true; Wait_1; SetActive_"Light2"_true; Wait_1; SetActive_"Light3"_true; Wait_0.5; text_"Status" = "Все огни включены";
Пример 6: Проверся в цикле Cycle_3 { Clone_"Box"; Wait_0.5; Log_"Клон создан"; }
Внимание: Wait блокирует выполнение остальной части скрипта. Если нужна асинхронная задержка, учтите это при проектировании логики.
Совет: Используйте Wait для синхронизации с анимациями, временные паузы между действиями, и создания ритма в геймплее.

Cycle - Циклы

Выполняет блок кода определенное количество раз.

Параметр Описание
a Количество повторов: число (int) или inf (бесконечно)
Синтаксис: Cycle_5 { Log_"cycled"; }
Бесконечный цикл: Cycle_inf { Log_"Бесконечно"; }

Transform - Трансформация объектов

Позволяет изменять позицию, вращение и размер объектов.

Параметр Описание
a Имя объекта в кавычках
b Свойство: position, localposition, rotation, localrotation, scale
c Ось (необязательно): x, y или z
d Значение: число или Vector3_x_y_z
Примеры: transform_"Block"_position_y += 5; transform_"Block"_scale = Vector3_2_2_2; transform_"Block"_rotation_z = 45;

Clone - Клонирование объектов

Создает точные копии объектов при выполнении скрипта.

Способ 1: Автоматическое имя

Clone_"WoodCube";

Клон получит имя: WoodCube_(1), WoodCube_(2) и т.д.

Способ 2: Пользовательское имя

Clone_"WoodCube"_"MyNewCube";

Способ 3: Сохранить в переменную

local_SpawnedCube = clone_"WoodCube"; transform_local_SpawnedCube_position_y += 10;

Клонирование себя:

Clone_"self";

Destroy - Удаление объектов

Удаляет объект с карты во время игры.

Удалить объект: Destroy_"Door";
Удалить себя: Destroy_"self";
Примечание: Используйте "self" или "this" для удаления объекта, на котором запущен скрипт.

Parent - Привязка к родителю

Соединяет объекты в иерархию. Привязанный объект следует за движением родителя.

Привязать блок к другому блоку:

transform_"Hat"_parent = transform_"HeadBlock";

Привязать блок к игроку:

transform_"Block"_parent = player_target_activated;

Отвязать объект:

transform_"Hat"_parent = "none";

Привязать игрока к платформе:

player_target_activated_parent = "Platform";

Text - Изменение текста

Изменяет надписи на текстовых объектах.

Параметры:

  • a - Имя текстового объекта в кавычках
  • b - Текст в кавычках (поддерживает склейку с +)
Примеры: text_"MySign" = "Привет!"; text_"MySign" += " Как дела?"; textraw_"MySign" = "Просто текст";

Разница между text и textraw:

  • text - поддерживает склейку и переменные
  • textraw - вставляет текст как есть, без обработки

Player - Управление игроком

Мощная команда для взаимодействия с игроками, изменения характеристик и телепортации.

Режимы поиска (mode):

  • target - поиск по цели
  • nickname - поиск по нику
  • saved - использовать сохраненного игрока

Селекторы для target:

  • all - все игроки
  • nearest - ближайший игрок
  • farthest - самый дальний игрок
  • random - случайный игрок
  • activated - игрок, нажавший на плиту
  • local - локальный игрок

Примеры использования:

player_target_activated_hp -= 10; player_target_nearest_jumpForce += 5; player_target_all_moveSpeed = 10;

Сохранение игрока:

player_save_"Winner"_target_activated; player_saved_"Winner"_hp = 100;

Характеристики игрока (Stats)

Все доступные параметры для управления характеристиками игроков.

Основные показатели:

Характеристика Описание
hp Текущее здоровье игрока
maxHp Максимальное здоровье
moveSpeed Скорость бега
jumpForce Высота прыжка
respawnDuration Время ожидания перед возрождением

Стамина (выносливость):

Характеристика Описание
doesNotNeedStamina Отключить усталость (1=да, 0=нет)
maxStaminaValue Максимальный запас выносливости
staminaValue Текущая выносливость
staminaRegen Скорость восстановления стамины
staminaWaitTimeForRegen Задержка перед восстановлением
Примеры: player_target_activated_moveSpeed += 5; player_target_all_doesNotNeedStamina = 1; player_target_nearest_hp = player_target_nearest_maxHp;

Переменные и хранение данных

Переменные - это виртуальные "коробочки" для сохранения значений. Создание и изменение переменных не требует специальных команд.

Типы переменных по области видимости:

Тип Область видимости Пример
local_ Личные для игрока, для всех плит на карте local_Coins = 10;
global_ Синхронизируются на сервере, видны всем global_Score = 100;
self_ Только в этой плите, для текущего игрока self_Count = 5;
globalself_ Только в плите, синхронизируется для всех globalself_Health = 50;
plate_ Чужая локальная переменная plate_"Manager"_Value = 10;
globalplate_ Чужая глобальная переменная globalplate_"Boss"_HP = 100;

Работа с числами и текстом:

local_Health = 100; local_Health -= 25; local_Health *= 2; global_Name = "Player1"; local_Message = "Привет, " + global_Name;
Примечание: Текст обязательно пишется в кавычках!

Random - Случайные числа

В языке есть встроенный мощный генератор случайных чисел, который работает как переменная "на лету". Вместо имени переменной вы пишете команду random, и игра сама подставляет случайное число! Это позволяет создавать разнообразные и непредсказуемые игровые механики.

Базовый синтаксис:

random_(Мин)_(Макс)

Случайное целое число (int):

Генерирует целое число в диапазоне, включая границы:

Примеры: local_Dice = random_1_6; local_Chance = random_0_100; self_AttackDamage = random_10_25;

Выдаст числа: от 1 до 6, от 0 до 100, от 10 до 25 включительно

Случайное число с запятой (float):

Генерирует число с десятичной частью:

Примеры: local_Chance = random_0_1_float; local_Speed = random_0.5_2.5_float;

Выдаст числа: от 0.0 до 1.0 (например 0.43), от 0.5 до 2.5 (например 1.73)

Случайное число с шагом (округление):

Генерирует число, которое кратно определённому шагу:

Примеры: local_Angle = random_0_360_float_0.5; local_Price = random_100_1000_int_50;

Выдаст числа: от 0 до 360 с шагом 0.5 (45.5, 120.0 и т.д.), от 100 до 1000 с шагом 50

Практические примеры использования:

Позиционирование случайно: transform_"Enemy"_position_x = random_-50_50_float; transform_"Enemy"_position_z = random_-50_50_float;
Случайный выбор действия: local_Action = random_1_3; if (local_Action == 1) { Log_"Выбран вариант 1"; }

Условия (If / Else If / Else)

Условия позволяют выполнять разный код в зависимости от ситуации.

Базовый синтаксис:

if (условие) { // Код если верно } else if (другое_условие) { // Код если первое неверно, но это верно } else { // Код во всех остальных случаях }

Операторы сравнения:

  • == - равно
  • != - не равно
  • > - больше
  • < - меньше
  • >= - больше или равно
  • <= - меньше или равно

Логические операторы:

  • && - И (обе части должны быть верны)
  • || - ИЛИ (верна хотя бы одна часть)

Примеры проверки пароля:

if (local_Password == "1234") { SetActive_"Door"_false; Log_"Доступ разрешен!"; } else { Log_"Неверный пароль!"_"error"; }

Проверка здоровья игрока:

if (player_target_activated_hp < 30) { player_target_activated_hp += 50; Log_"Игрок спасен!"; } else if (player_target_activated_hp == player_target_activated_maxHp) { Log_"Здоровье на максимуме"; }

Сложная проверка с И/ИЛИ:

if (local_Coins >= 10 && local_HasKey == "true") { Log_"Сундук открыт!"; local_Coins -= 10; } else { text_"Info" = "Нужно 10 монет и ключ!"; }

Contains - Проверка текста

Оператор contains проверяет, содержится ли один текст внутри другого. Не зависит от заглавных букв.

Синтаксис:

if (текст1 contains текст2) { ... }

Проверка в имени объекта:

if (transform_"SecretDoor"_name contains "Door") { Log_"В имени есть слово Door!"; }

Проверка пароля:

if (local_EnteredPassword contains "admin") { Log_"Обнаружено слово admin"_"warning"; }

Foreach - Перебор списков

Foreach - это цикл, который проходит по каждому элементу списка (массива) и на каждом шаге сохраняет имя текущего элемента в переменную, которую вы указали. Внутри фигурных скобок вы пишете код, который выполнится для КАЖДОГО элемента списка по очереди.

Синтаксис:

foreach (переменная in список) { // Код выполнится один раз для каждого элемента // "переменная" будет содержать имя текущего элемента }

В качестве "переменная" можно указать любой тип переменной (local_, global_, self_ и т.д.), в него на каждом шаге будет записываться имя (name) текущего объекта или игрока из списка.

Доступные списки (массивы):

  • GetAllObjects - список всех объектов, присутствующих на карте
  • GetAllPlayers - список всех игроков, находящихся сейчас в игре
  • transform_(a)_childs - список дочерних объектов, "прикрепленных" к объекту (a)
  • player_(mode)_(selector)_childs - список дочерних объектов, "прикрепленных" к игроку
Важно: Эти списки нельзя записать в переменную напрямую, их можно только перебрать через foreach.

Примеры использования:

Вывести имена всех объектов на карте: foreach (local_Item in GetAllObjects) { Log_"Нашел объект: " + local_Item; }
Вылечить всех игроков на карте: foreach (local_P in GetAllPlayers) { player_nickname_local_P_hp = player_nickname_local_P_maxHp; }
Перебрать все дочерние объекты и выключить их: foreach (local_Child in transform_"Container"_childs) { SetActive_local_Child_false; }
Примечание: Чтобы дальше работать с игроком или объектом, чье имя вы получили в цикле, используйте player_nickname_ИмяПеременной_... или transform_ИмяПеременной_...

Name - Имена объектов и игроков

У каждого объекта и каждого игрока есть свое "имя" (name) - это тот же текст, который вы пишете в кавычках, когда обращаетесь к объекту (например "Door" или "Block"). Это имя можно не только использовать для обращения к объекту, но и прочитать как текст, а у объектов - даже поменять прямо во время игры.

Получить имя объекта:

Используйте transform_"Block"_name để прочитать текущее имя объекта:

Примеры: text_"MySign" = "Имя объекта: " + transform_"Block"_name; local_ObjectName = transform_"Door"_name;

Получить имя (или ник) игрока:

  • player_target_activated_name - служебное внутреннее имя игрока
  • player_target_activated_nickname - реальный ник игрока, если игра подключена к серверу, иначе вернет то же самое, что и name
Вывести приветствие игроку: text_"Welcome" = "Привет, " + player_target_activated_nickname + "!"; Log_"Игрок " + player_target_activated_name + " нажал на плиту";

Сменить имя объекта:

Имена объектов можно менять во время игры, что удобно для отслеживания состояния или создания группировки:

Примеры: transform_"Block"_name = "NewName"; transform_"Block"_name += "_2"; transform_"Door"_name = "Door_Opened";
Важно: Имя игрока сменить нельзя, скрипт не позволит вам это сделать. Команда player_target_activated_name = "..."; не сработает и выдаст предупреждение в debug-меню - это сделано специально, чтобы никто не мог притворяться другим игроком.

Использование имён для отслеживания:

Проверка через имя: if (transform_"Block"_name == "Block_Active") { Log_"Блок активирован"; } else { transform_"Block"_name = "Block_Active"; }