📖 Документация 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 | Выполняется непрерывно по кругу все время, пока на плите кто-то стоит. |
| OnRelease | Срабатывает ровно ОДИН раз, когда плита возвращается в исходное (ненажатое) состояние. Скрипты OnPress и WhilePressed мгновенно останавливаются. |
| WhileNotPressed | Выполняется непрерывно по кругу все время, пока на плите никого нет. |
Координаты и векторы (Vector3)
▼Для управления объектами в трёхмерном пространстве используется понятие вектора Vector3_X_Y_Z, где X, Y, Z — это числа, значения переменных или математические выражения. X - горизонтальное положение, Y - вертикальное положение, Z - глубина.
Vector3_10_5_1.5
transform_"Block"_position = Vector3_0_10_0;
transform_"Block"_position_y += 5;
transform_"Block"_position_x = 20;
Преобразование в текст (_tostring)
▼Для вывода координат, характеристик или результатов вычислений на текстовую панель, добавьте суффикс _tostring в конце переменной или свойства.
text_"MySign" = "Блок: " + transform_"Block"_position_tostring;
text_"HealthBar" = "Ваше здоровье: " + player_target_activated_hp_tostring;
SetActive - Управление видимостью
▼Управляет активностью объектов в игре. Неактивные объекты не отображаются, не взаимодействуют с физикой и не выполняют скрипты.
Синтаксис: SetActive_(a)_(b)
- a - Имя объекта в кавычках ("Door")
- b - true или false (активно/не активно)
SetActive_"Door"_false;
SetActive_"Light"_true;
ChangeSound - Управление звуком
▼Позволяет управлять параметрами динамика в реальном времени.
Синтаксис:
ChangeSound_"speaker"_"WpNight"_1_1_15_false_true_false_true
| Параметр | Описание |
|---|---|
| a | Имя объекта динамика |
| b | Код музыки |
| c | Громкость (float) |
| d | Скорость (float) |
| e | Радиус доступности звука |
| f | Может ли игрок переключать динамик (true/false) |
| g | Воспроизводить при старте (true/false) |
| h | Видна ли 3D-модель динамика (true/false) |
| k | Слышно ли везде на карте (true/false) |
Log - Вывод отладки
▼Выводит отладочные сообщения в консоль разработчика.
Log_"Hello World!";
Log_"Низкое значение HP"_"warning";
Log_"Критическая ошибка!"_"error";
Wait и Cycle (Задержки и циклы)
▼Wait останавливает выполнение скрипта на указанное количество секунд (поддерживает float).
Wait_2;
Wait_0.5;
Wait_2+3;
Cycle выполняет блок кода определенное количество раз (число или inf для бесконечности).
Cycle_5 {
Log_"cycled";
}
Трансформация, Клонирование и Удаление
▼Transform изменяет позицию, вращение и размер объектов.
transform_"Block"_position_y += 5;
transform_"Block"_scale = Vector3_2_2_2;
Clone создает точные копии объектов.
Clone_"WoodCube"; // Автоимя: WoodCube_(1)
Clone_"WoodCube"_"MyCube"; // Свое имя
local_Spawned = clone_"WoodCube"; // Сохранить в переменную
Destroy удаляет объект.
Destroy_"Door";
Destroy_"self"; // Удалить плиту со скриптом
Parent и Text
▼Parent привязывает объекты друг к другу или к игроку.
transform_"Hat"_parent = transform_"HeadBlock";
transform_"Block"_parent = player_target_activated;
transform_"Hat"_parent = "none";
Text изменяет надписи на объектах.
text_"MySign" = "Привет!";
text_"MySign" += " Как дела?";
textraw_"MySign" = "Просто текст без склейки";
Управление игроком и Характеристики
▼Мощная команда для взаимодействия с игроками: player_(mode)_(selector)_(stat)
Селекторы для target: all, nearest, farthest, random, activated, local.
Также можно искать по nickname или использовать сохраненного игрока (saved).
| Характеристика | Описание |
|---|---|
hp / maxHp | Текущее и максимальное здоровье |
moveSpeed | Скорость бега |
jumpForce | Высота прыжка |
respawnDuration | Время до возрождения |
doesNotNeedStamina | Отключить усталость (1=да, 0=нет) |
maxStaminaValue | Максимальная выносливость |
staminaValue | Текущая выносливость |
staminaRegen | Скорость восстановления стамины |
player_target_activated_hp -= 10;
player_target_all_doesNotNeedStamina = 1;
player_save_"Winner"_target_activated;
player_saved_"Winner"_hp = 100;
Чтение характеристик мира
▼Помимо ваших собственных переменных, вы можете использовать любые характеристики объектов или игроков в качестве чисел или текста для расчетов!
local_BlockHeight = transform_"MyBlock"_position_y;
local_HpDifference = player_target_activated_maxHp - player_target_activated_hp;
transform_"Block1"_position_y = transform_"Block2"_position_y + 10;
Последний пример заставит Блок 1 всегда быть на 10 единиц выше Блока 2.
Настройки камеры
▼Управлять камерой игрока можно так же, как и другими его характеристиками - через команду player_(mode)_(selector)_(stat). Ниже представлены все доступные настройки камеры.
| Характеристика | Описание |
|---|---|
cameraMode |
Вид камеры. 0 - от первого лица (FPV), 1 - от третьего лица (TPV). |
CanChangeView |
Может ли игрок сам переключать вид камеры (1 - можно, 0 - нельзя). |
fov |
Угол обзора камеры для обоих видов. Чем больше число, тем шире обзор. |
1fov / 3fov |
Угол обзора только для вида от первого лица (1fov) или третьего лица (3fov). |
minZoomMultiplier |
Мин. приближение камеры от 3 лица (0.4 = 40% от обычного расстояния). |
maxZoomMultiplier |
Макс. отдаление камеры от 3 лица (3 = 300% от обычного расстояния). |
player_target_activated_cameraMode = 0;
player_target_all_CanChangeView = 0;
player_target_activated_1fov = 90;
player_target_activated_minZoomMultiplier = 1;
player_target_activated_maxZoomMultiplier = 1;
Две последние команды полностью зафиксируют зум камеры игрока.
Переменные (Хранение данных)
▼Переменные - это виртуальные "коробочки" для сохранения значений (текста или чисел). Создание и изменение переменных не требует специальных команд.
| Тип | Область видимости | Пример |
|---|---|---|
| local_ | Личные для игрока, общие для всех плит на карте | local_Coins = 10; |
| global_ | Синхронизируются на сервере, видны всем | global_Score = 100; |
| self_ | Только в этой плите, для текущего локального игрока | self_Count = 5; |
| globalself_ | Только в плите, но синхронизируется для всех | globalself_Health = 50; |
| plate_ | Доступ к чужой локальной переменной | plate_"Manager"_Value += 1; |
| globalplate_ | Доступ к чужой глобальной переменной | globalplate_"Boss"_HP = 100; |
local_Health = 100;
local_Health *= 2;
global_Name = "Player1";
local_Message = "Привет, " + global_Name;
local_MyEnemy = clone_"Zombie";
Random - Случайные числа
▼В языке есть встроенный мощный генератор случайных чисел. Синтаксис: random_(Мин)_(Макс)
local_Dice = random_1_6;
local_Chance = random_0_1_float;
local_Angle = random_0_360_float_0.5;
Условия (If / Else) и Contains
▼Условия позволяют выполнять разный код в зависимости от ситуации. Операторы: ==, !=, >, <, >=, <=. Логические: && (И), || (ИЛИ).
if (local_Coins >= 10 && local_HasKey == "true") {
Log_"Сундук открыт!";
} else if (local_Coins < 10) {
Log_"Мало монет";
} else {
Log_"Нужен ключ";
}
Проверка текста (contains)
Оператор contains проверяет, содержится ли один текст внутри другого (без учета регистра).
if (transform_"SecretDoor"_name contains "Door") {
Log_"В имени есть слово Door!";
}
Подсчет игроков (standingplayers)
▼Каждая плита сама помнит, кто из игроков сейчас на ней стоит (даже если их несколько). Этот список называется standingplayers, и его можно узнать как у самой плиты, так и у любой другой на карте.
Узнать количество игроков:
plate_"self"_standingplayers_count
plate_"OtherPlate"_standingplayers_count
text_"Counter" = "Игроков на плите: " + plate_"self"_standingplayers_count;
if (plate_"self"_standingplayers_count >= 2) {
Log_"На плите толпа!";
}
Перебор стоящих игроков (без _count):
Вы можете перебрать всех игроков на плите через цикл foreach:
foreach (local_P in plate_"self"_standingplayers) {
player_nickname_local_P_hp = 100;
}
Массивы: Подсчет (_count) и вложенность
▼У любого списка (массива) можно узнать не только сами элементы, но и их количество, если добавить в конце _count. Игра сама посчитает элементы, без необходимости перебирать их вручную.
| Массив с _count | Описание |
|---|---|
GetAllPlayers_count |
Сколько всего игроков сейчас в игре |
GetAllObjects_count |
Сколько всего объектов сейчас на карте |
transform_"A"_childs_count |
Сколько дочерних объектов у блока "A" |
player_target_all_childs_count |
Сколько дочерних объектов у игрока |
if (GetAllPlayers_count > 0) {
Log_"В игре есть игроки!";
}
Вложенные списки (_true)
Обычно список выдает только "прямых" детей объекта. Если нужно получить ВСЕХ вложенных потомков сразу (детей, внуков, правнуков и т.д.), добавьте в конце суффикс _true.
transform_"Block"_childs_true
player_target_activated_childs_true
transform_"Block"_childs_true_count
Это вернет общее число прямых детей и всех их вложенных объектов.
Кастомные массивы и их создание
▼Массивы позволяют хранить в одной переменной сразу несколько значений. В языке Wall Plast кастомные массивы создаются через текстовые переменные, где значения разделяются запятыми ,. К отдельным элементам можно обращаться по их индексу (номеру) через квадратные скобки [индекс].
[0], второй — [1], третий — [2] и так далее.
Создание массива
Просто присвойте переменной строку с элементами, разделёнными запятыми:
local_Inventory = "sword,shield,potion";
Создан массив из трёх элементов: sword (индекс 0), shield (индекс 1), potion (индекс 2).
Чтение элемента по индексу
Используйте квадратные скобки с номером элемента:
text_"Display" = local_Inventory[0]; // Покажет "sword"
text_"Display" = local_Inventory[1]; // Покажет "shield"
local_Selected = local_Inventory[2]; // Сохранит "potion" в переменную
Изменение элемента по индексу
Можно заменить любой элемент массива, указав его индекс:
local_Inventory[1] = "bow"; // Массив стал: "sword,bow,potion"
local_Inventory[0] = "axe"; // Массив стал: "axe,bow,potion"
local_Inventory += ",helmet"; // Массив стал: "axe,bow,potion,helmet"
Подсчёт элементов массива (_count)
Узнать количество элементов в массиве можно через суффикс _count:
local_Total = local_Inventory_count; // Вернёт 3
text_"Info" = "В инвентаре: " + local_Inventory_count + " предмета";
Использование в условиях
Можно сравнивать элементы массива или проверять их количество:
if (local_Inventory[0] == "sword") {
Log_"У вас есть меч!";
}
if (local_Inventory_count >= 3) {
Log_"Инвентарь почти полон!";
}
Перебор массива через foreach
Можно перебрать все элементы массива, используя его имя как коллекцию:
foreach (local_Item in local_Inventory) {
Log_"Предмет: " + local_Item;
}
Выведет в лог: "Предмет: sword", "Предмет: bow", "Предмет: potion".
Индексация встроенных списков
Квадратные скобки работают не только с кастомными массивами, но и со встроенными списками:
local_FirstPlayer = GetAllPlayers[0]; // Первый игрок в игре
local_ThirdObject = GetAllObjects[2]; // Третий объект на карте
local_FirstChild = transform_"MyBlock"_childs[0]; // Первый дочерний объект
local_PlatePlayer = plate_"self"_standingplayers[0]; // Первый игрок на плите
plate_"Manager"_Inventory[0] // Первый элемент массива из плиты "Manager"
globalplate_"Data"_Items[2] // Третий элемент массива из глобальных данных плиты
Foreach - Перебор списков
▼Foreach - это цикл, который проходит по каждому элементу списка (массива) и на каждом шаге сохраняет имя текущего элемента в указанную переменную.
foreach (переменная in список) {
// Код выполнится для каждого элемента
}
Доступные базовые списки:
GetAllObjects- все объекты на картеGetAllPlayers- все игрокиtransform_"A"_childs- дочерние объекты блока "A"
foreach (local_Item in GetAllObjects) {
Log_"Нашел объект: " + local_Item;
}
foreach (local_P in GetAllPlayers) {
player_nickname_local_P_hp = 100;
}
Имена объектов и игроков (name)
▼У каждого объекта и каждого игрока есть свое имя, которое можно прочитать, а у объектов — даже изменить во время игры.
text_"MySign" = "Имя: " + transform_"Block"_name;
text_"Player" = "Привет, " + player_target_activated_nickname;
transform_"Block"_name = "NewName";
transform_"Block"_name += "_2";
Fog - Управление туманом
▼Позволяет управлять параметрами тумана на сцене (RenderSettings) прямо из скрипта плиты - включать\выключать его, менять цвет, дальность и плотность.
| Команда | Описание |
|---|---|
Fog_enabled = (a); |
Включает или выключает туман. a - true ИЛИ false. |
Fog_color = (a); |
Задает цвет тумана целиком. a - Color_r_g_b ИЛИ Color_r_g_b_a (альфа необязательна, по умолчанию 1). |
Fog_color_r = (a);Fog_color_g = (a);Fog_color_b = (a);Fog_color_a = (a); |
Меняет отдельный канал цвета тумана. Поддерживает +=, -=, *=, /=. |
Fog_mode = (a); |
Режим тумана. a - число (0 линейный, 1 экспоненциальный, 2 экспоненциальный квадрат) ИЛИ текст ("linear", "exponential", "exponentialSquared"). |
Fog_startDistance = (a); |
Дистанция начала тумана (линейный режим). Поддерживает +=, -=, *=, /=. |
Fog_endDistance = (a); |
Дистанция полной непрозрачности тумана (линейный режим). Поддерживает +=, -=, *=, /=. |
Fog_density = (a); |
Плотность тумана (экспоненциальные режимы). Поддерживает +=, -=, *=, /=. |
Fog_enabled = true;
Fog_color = Color_.25_.25_.25;
Fog_color_r = .5;
Fog_mode = "linear";
Fog_startDistance = 10;
Fog_endDistance = 50;
Fog_density += .01;
Чтение параметров тумана (например, для условий if): доступны те же параметры в нижнем регистре с приставкой fog_ (без слова Fog в начале команды присваивания):
| Токен для чтения | Описание |
|---|---|
fog_enabled | Вернет true (1), если туман включен, иначе false (0). |
fog_mode | Вернет число текущего режима тумана (0, 1 или 2). Всегда число, даже если режим был установлен текстом. |
fog_startdistance, fog_enddistance, fog_density | Текущие значения соответствующих параметров. |
fog_color_r, fog_color_g, fog_color_b, fog_color_a | Текущие значения каналов цвета тумана. |
fog_mode при чтении всегда возвращается числом - сравнение с текстом (fog_mode == "linear") не поддерживается, используйте числа (fog_mode == 0).
if (fog_enabled == true) {
Log_"Туман сейчас включен";
}
Fog_syncForAllClients - Синхронизация тумана
▼На карте всегда есть один служебный объект с настройками игры, у которого есть флаг синхронизации тумана между всеми игроками на сервере. Когда он включен, параметры тумана хоста автоматически применяются у всех игроков. Управлять этим флагом можно прямо из скрипта плиты.
Fog_syncForAllClients = true; // Включит синхронизацию тумана для всех игроков
Fog_syncForAllClients = false; // Выключит - туман снова станет локальным у каждого клиента
Также можно прочитать текущее состояние флага в условии:
if (fog_syncforallclients == true) {
Log_"Синхронизация тумана активна";
}
Булевы значения (true / false)
▼Помимо чисел 1 и 0, в условиях и математических выражениях теперь можно использовать привычные слова true и false - они автоматически считаются как 1 и 0 соответственно. Регистр букв не важен (TRUE, False, true - все сработает одинаково).
if (fog_enabled == true) {
Log_"Туман включен!";
} else {
Log_"Туман выключен!";
}