📖 Документация 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 (объект неактивен, скрыт) |
Основные случаи использования:
SetActive_"Door"_false;
Log_"Дверь скрыта";
SetActive_"Light"_true;
transform_"Light"_position = Vector3_0_5_-10;
local_doorName = "MainDoor";
local_isOpen = true;
SetActive_local_doorName_!local_isOpen;
SetActive_"Door"_false;
SetActive_"Light"_true;
SetActive_"Trap"_false;
text_"Status" = "Объекты переключены";
Cycle_5 {
SetActive_"Moving_Box"_true;
Wait_1;
SetActive_"Moving_Box"_false;
Wait_1;
}
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) |
Примеры использования:
ChangeSound_"speaker"_"WpNight"_1_1_15_false_true_false_true;
local_volume = 0.5;
ChangeSound_"speaker"_"WpNight"_local_volume_1_15_true_true_true_false;
ChangeSound_"AmbienceLoop"_"Forest"_0.8_1_100_false_true_false_true;
ChangeSound_"BellRing"_"BellSound"_0.7_1_20_false_true_true_false;
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;
}
Log - Вывод отладки
▼Выводит отладочные сообщения в консоль разработчика. Полезна для отслеживания выполнения скрипта, значений переменных и диагностики проблем.
Синтаксис:
Log_"Message";
Типы сообщений:
| Параметр | Тип | Описание |
|---|---|---|
| a | string | Сообщение для вывода в кавычках (поддерживает склейку с +) |
| b | string | Тип лога (необязательно): "warning" (жёлтый) или "error" (красный). По умолчанию - обычное сообщение (белый) |
Типы сообщений:
- Обычное: Log_"Message"; (белое сообщение)
- Предупреждение: Log_"Message"_"warning"; (жёлтое сообщение)
- Ошибка: Log_"Message"_"error"; (красное сообщение)
Log_"Hello World!";
Log_"Критическая ошибка!"_"error";
Log_"Низкое значение HP"_"warning";
local_playerName = player_target_activated_name;
local_score = 100;
Log_"Игрок: " + local_playerName + ", Счёт: " + local_score;
Log_"Скрипт запущен!";
SetActive_"Door"_true;
Log_"Дверь открыта";
Wait_2;
Log_"Ожидание завершено"_"warning";
Wait - Задержка
▼Останавливает выполнение скрипта на указанное количество секунд. Это полезно для создания паузы между событиями, синхронизации анимаций, или создания задержек в логике игры.
Синтаксис:
Wait_seconds;
Параметры:
| Параметр | Тип | Описание |
|---|---|---|
| a | float/int | Время в секундах - поддерживает десятичные числа (0.5, 1.25 и т.д.) и математические выражения |
Особенности:
- Время указывается в секундах
- Поддерживаются десятичные числа для задержек менее 1 секунды
- Можно использовать математические выражения
- Во время ожидания остальной код не выполняется
- Можно использовать переменные для времени
Log_"Начало";
Wait_2;
Log_"Прошло 2 секунды";
Wait_0.5; // Полсекунды
Wait_0.1; // 0.1 секунды
Wait_2+3; // Ожидание 5 секунд
Wait_10/2; // Ожидание 5 секунд
Wait_1*5; // Ожидание 5 секунд
local_delayTime = 3;
Log_"Ожидание " + local_delayTime + " секунд";
Wait_local_delayTime;
Log_"Ожидание завершено";
SetActive_"Light1"_true;
Wait_1;
SetActive_"Light2"_true;
Wait_1;
SetActive_"Light3"_true;
Wait_0.5;
text_"Status" = "Все огни включены";
Cycle_3 {
Clone_"Box";
Wait_0.5;
Log_"Клон создан";
}
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";
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 (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";
}