BLOXAR Script Engine
Официальная документация по скриптовому движку BLOXAR. Пишите логику миров, анимации, механики и мини-игры прямо в браузере — без сборщиков и фреймворков.
💡 Движок
Скрипты пишутся на чистом JavaScript. Движок вызывает ваш код 60 раз в секунду — это даёт плавные анимации и мгновенную реакцию на ввод игрока.
🚀 Первый скрипт
- Откройте проект в Studio Mode.
- В панели Explorer нажмите
➕и выберите📜 Script. - Перетащите скрипт внутрь любого блока
📦 Part. - Кликните по скрипту — откроется редактор кода.
- Напишите код и нажмите
Save & Close.
Важно: Скрипты не работают в Студии. Нажмите Publish World и зайдите как игрок.
🧬 Системные переменные
4 переменные доступны в каждом скрипте без объявления.
3D-блок, внутри которого лежит скрипт. Доступны .position, .rotation, .scale.
Время в секундах с запуска. Используй с Math.sin(time) для цикличных анимаций.
Объект персонажа. Например: parent.position.distanceTo(player.position) — расстояние до игрока.
Объект скрипта. Храни переменные в script.userData — они не сбрасываются каждый кадр.
Пример: script.userData.count = (script.userData.count || 0) + 1;
🛠️ Манипуляции с объектами
Команды для изменения внешнего вида и положения блоков. Вызываются через BLOXAR.*
Красит объект. Формат цвета: 0xFF0000 (красный), 0x00FF00 (зелёный).
Сдвигает объект на заданное расстояние. Вызывай каждый кадр для непрерывного движения.
Вращает объект. Углы в радианах. Math.PI = 180°. Для постоянного вращения вызывай каждый кадр.
❤️ Игрок и Здоровье
Наносит урон. Максимум здоровья = 100. При 0 — игрок умирает и возрождается.
Восстанавливает здоровье. Не может превысить 100.
🔊 Аудио и UI
Воспроизводит звук. Доступные типы: 'step', 'jump', 'land'.
Возвращает true, если клавиша зажата. Принимает строку в нижнем регистре.
Примеры: 'e', 'f', 'shift', 'space', 'arrowup'.
Показывает текст-подсказку в центре экрана. Передай "" чтобы скрыть.
Воспроизводит пространственный звук в точке мира. Чем дальше игрок, тем тише.
Доступные типы: 'step', 'jump', 'explosion', 'pickup'. intensity — громкость (по умолчанию 1).
🧱 Создание и удаление блоков
Создаёт блок в мире и возвращает его. Если hasPhysics = true — блок падает под действием гравитации. sx/sy/sz — масштаб по осям (по умолчанию 1).
Удаляет объект и освобождает память GPU. Всегда вызывай для динамически созданных блоков, которые больше не нужны.
// Создаём красный куб и удаляем через 3 секунды
const cube = BLOXAR.createPart(0, 5, 0, 0xFF3B3B, 1, 1, 1, false);
if (!script.userData.timer) script.userData.timer = time;
if (time - script.userData.timer > 3) {
BLOXAR.destroyPart(cube);
}
✨ Эффекты и Частицы
Создаёт взрыв частиц в точке. count — количество частиц (по умолчанию 10). Частицы автоматически исчезают.
// Эффект взрыва на позиции блока при приближении игрока
const dist = parent.position.distanceTo(player.position);
if (dist < 2 && !script.userData.exploded) {
script.userData.exploded = true;
BLOXAR.spawnEffect(parent.position.x, parent.position.y, parent.position.z, 0xFF6600, 25);
BLOXAR.playSound('land');
}
🗡️ Инструменты (Weapons & Items)
Система для создания оружия, предметов и экипировки в руки персонажа.
Создаёт 3D-меш инструмента. shape: 'box' | 'sphere' | 'cone' | 'cylinder'. Возвращает объект — передай его в equipTool().
Крепит инструмент к правой руке в слот slotNum (1–5). Смещение по умолчанию: (0, -0.8, 0.3).
Снимает и удаляет инструмент из указанного слота.
Изменяет позицию уже надетого инструмента относительно ладони.
Устанавливает подпись слота в инвентаре (отображается как tooltip).
Возвращает номер активного слота (1–5). Используй для отслеживания, что держит игрок.
// Создаём меч в слоте 1 при старте
if (!script.userData.ready) {
script.userData.ready = true;
const sword = BLOXAR.createTool('box', 0xC0C0C0, 0.1, 1.2, 0.1);
BLOXAR.equipTool(sword, 1);
BLOXAR.setToolName(1, 'Меч');
}
// Удар при нажатии E
if (BLOXAR.isKeyPressed('e')) {
BLOXAR.playAnimation('swing');
BLOXAR.spawnEffect(player.position.x, player.position.y + 1, player.position.z, 0xffffff, 8);
}
💪 Анимации рук
Быстрые одноразовые анимации правой руки. Идеальны для атак, броска, взаимодействий.
Запускает пресет анимации правой руки. Автоматически останавливается по завершении.
Немедленно останавливает анимацию руки и возвращает её в исходное положение.
Доступные пресеты рук
// Атака при нажатии ЛКМ (клавиша 'f' как замена)
if (BLOXAR.isKeyPressed('f')) {
if (!script.userData.attacking) {
script.userData.attacking = true;
BLOXAR.playAnimation('swing');
BLOXAR.damagePlayer(-10); // Лечим как пример логики
}
} else {
script.userData.attacking = false;
}
🕺 Анимации тела
Полные анимации персонажа: все конечности одновременно. Два подхода: пресеты и ручное управление.
Запускает пресет анимации всего тела. Большинство анимаций зацикленные — останавливай через stopBodyAnim().
Останавливает анимацию тела и сбрасывает все конечности в нейтральное положение.
Напрямую задаёт вращение конечности. Вызывай каждый кадр для плавной анимации. Углы в радианах.
Доступные limbName: 'rArm', 'lArm', 'rLeg', 'lLeg', 'head', 'body'.
Доступные пресеты тела
// Танцевать при нажатии G, остановить при отпускании
if (BLOXAR.isKeyPressed('g')) {
BLOXAR.playBodyAnim('dance');
} else {
BLOXAR.stopBodyAnim();
}
// Кастомная анимация через setLimb — кивание головой
BLOXAR.setLimb('head', Math.sin(time * 3) * 0.4, 0, 0);
// Поднять левую руку синусоидой
BLOXAR.setLimb('lArm', Math.sin(time * 2) * 1.2, 0, Math.cos(time) * 0.3);
💾 DataStore (Сохранения)
Сохраняй прогресс игрока между сессиями. Данные привязаны к конкретному плейсу и конкретному игроку.
Сохраняет значение под ключом. Данные записываются локально мгновенно и асинхронно синхронизируются с сервером.
Читает сохранённое значение по ключу. Возвращает null если ключа нет.
⚠️ Только в игре: DataStore не работает в Студии и в Sandbox. Тестируй в опубликованном плейсе.
// Счётчик посещений — увеличивается каждый заход
if (!script.userData.loaded) {
script.userData.loaded = true;
let visits = BLOXAR.loadData('visits') || 0;
visits += 1;
BLOXAR.saveData('visits', visits);
BLOXAR.showText('Ты здесь уже ' + visits + ' раз!');
// Через 3 секунды скрыть текст
script.userData.showUntil = time + 3;
}
if (script.userData.showUntil && time > script.userData.showUntil) {
BLOXAR.showText('');
script.userData.showUntil = null;
}
⚡ Система событий (Events)
Регистрируй колбеки (функции), и движок сам вызовет их в нужный момент.
Срабатывает один раз при загрузке скрипта. Идеально для спавна NPC или настройки начальных данных.
Срабатывает, когда игрок входит в зону блока (хитбокс блока + небольшой запас).
Срабатывает, когда игрок выходит из зоны блока.
Вызывает функцию каждый кадр, пока игрок находится ближе, чем distance юнитов. В функцию передается текущее расстояние.
Срабатывает один раз при нажатии указанной клавиши (например, 'e').
Срабатывает один раз при отпускании клавиши.
BLOXAR.onTouched(() => {
BLOXAR.setColor(parent, 0x2EE6A6);
BLOXAR.playSound('pickup');
});
BLOXAR.onKeyDown('f', () => {
BLOXAR.showText("Нажата клавиша F!");
});
👾 Система NPC и Врагов
Спавн и управление мобами.
Создаёт NPC. Принимает объект с настройками. Возвращает объект NPC для дальнейшего управления. Не работает в Studio Mode.
Наносит урон конкретному NPC. При уроне моб мигает красным, полоска HP обновляется.
Немедленно убивает NPC, проигрывает эффект частиц и удаляет его из мира.
Возвращает массив всех активных NPC на карте.
Устанавливает функцию, которая выполнится при смерти данного NPC.
BLOXAR.onStart(() => {
const boss = BLOXAR.spawnNPC({
x: parent.position.x, y: parent.position.y + 2, z: parent.position.z,
name: "Босс Охраны", color: 0xFF0000, hp: 300, attackDamage: 25
});
BLOXAR.setNPCOnDeath(boss, () => {
BLOXAR.showText("Босс повержен!");
BLOXAR.playSound3D(parent.position.x, parent.position.y, parent.position.z, 'explosion');
});
});
🎒 Инвентарь и Предметы
Даёт предмет игроку. Возвращает номер слота (1-5), куда попал предмет, или null, если инвентарь полон. Учитывает стаки (maxStack).
Забирает указанное количество предмета из слота. Если количество становится ≤ 0, слот очищается.
Возвращает данные предмета в указанном слоте.
Возвращает номер первого слота, в котором найден предмет с указанным ID.
Срабатывает при клике ЛКМ, когда у игрока в руках находится предмет.
🖥️ GUI Builder (Интерфейс)
Создание кастомных 2D-интерфейсов на экране игрока. Все элементы отрисовываются поверх игры.
Создаёт панель-контейнер. anchor: 'topleft', 'center', 'bottomright' и т.д.
Создаёт текстовую надпись внутри указанного Frame.
Создаёт кликабельную кнопку внутри Frame. onClick — функция-колбек при нажатии.
Создаёт полосу прогресса (полезно для HP боссов, опыта, таймеров).
Обновляет значения существующего ProgressBar.
Удаляет конкретный элемент по ID или полностью очищает весь созданный интерфейс.
BLOXAR.onStart(() => {
// Создаем окно по центру
BLOXAR.gui.createFrame('shop', { width: 250, height: 120, anchor: 'center' });
BLOXAR.gui.createLabel('shop_title', 'shop', { text: 'Магазин', bold: true, align: 'center' });
// Кнопка покупки
BLOXAR.gui.createButton('buy_sword', 'shop', {
text: 'Купить меч (100 🟡)',
onClick: () => {
BLOXAR.giveItem({ id: 'sword', name: 'Меч', icon: '🗡️' });
BLOXAR.gui.destroy('shop'); // Закрываем магазин
}
});
});
🌍 Окружение и Свет
Управление погодой, небом и динамическим освещением.
Включает погоду. Доступные типы: 'none', 'rain', 'snow'.
Устанавливает время суток (0..1). Например, 0.25 — полдень, 0.75 — полночь.
Меняет цвет зенита и горизонта (работает, если отключен цикл дня и ночи).
Создаёт источник света. type: 'point', 'spot', 'directional'.
Удаляет созданный источник света из мира.
Настраивает или отключает туман на карте.
🏃 Физика и Движение
Управление скоростью, прыжками и положением игрока.
Мгновенно телепортирует игрока в указанные координаты.
Обновляет точку возрождения и принудительно убивает/возрождает игрока.
Устанавливает множитель скорости бега (например, 0.2 для ускорения).
Изменяет силу прыжка (по умолчанию 0.3).
Применяет физический толчок к игроку (подбрасывает или отталкивает).
Изменяет глобальную гравитацию (по умолчанию 0.015).
💬 Уведомления и Очки
Показывает стильное уведомление внизу экрана (toast-сообщение).
Огромный текст по центру экрана (идеально для "УРОВЕНЬ ПРОЙДЕН").
Открывает модальное окно с кнопкой. Код останавливается до закрытия пользователем.
Изменяет глобальный счетчик очков (⭐) на экране игрока.
Создаёт текстовую надпись, которая парит прямо в 3D мире.
Вспышка экрана указанным цветом (например, при получении урона или бонуса).
🎬 Плавные анимации (Tweens)
Встроенная система для плавного перемещения и изменения блоков без ручного расчета.
Плавно перемещает объект в новую точку за duration секунд.
Плавно изменяет масштаб объекта.
Плавно перекрашивает материал объекта.
Заставляет блок дрожать (отлично подходит для разрушающихся платформ).
Тряска экрана игрока (эффект взрыва или землетрясения).
⏱ Таймеры и Лучи
Выполняет функцию через указанное количество секунд.
Бесконечно повторяет функцию каждые X секунд. Возвращает ID таймера (для отмены через cancelLoop).
Пускает невидимый луч из точки (o) в направлении (d). Возвращает первый блок, в который попал луч.
Пускает луч ровно из центра экрана игрока (туда, куда он смотрит).
💡 Готовые примеры (Copy & Paste)
Парящий блок-хамелеон
// Вращение
BLOXAR.rotate(parent, 0, 0.05, 0.02);
// Парение
parent.position.y += Math.sin(time * 5) * 0.005;
// Смена цвета по клавише F
if (BLOXAR.isKeyPressed('f')) {
BLOXAR.setColor(parent, 0xFFD700);
} else {
BLOXAR.setColor(parent, 0x1A2639);
}
Интерактивная кнопка
const dist = parent.position.distanceTo(player.position);
if (!script.userData.isPressed) {
if (dist < 3) {
BLOXAR.showText('Нажми [E] чтобы активировать');
if (BLOXAR.isKeyPressed('e')) {
script.userData.isPressed = true;
BLOXAR.playSound('jump');
BLOXAR.setColor(parent, 0x2EE6A6);
BLOXAR.showText('');
}
} else {
BLOXAR.showText('');
}
}
Ловушка-шипы (урон при касании)
const dist = parent.position.distanceTo(player.position);
if (dist < 1.2) {
if (!script.userData.cooldown || time - script.userData.cooldown > 1.5) {
script.userData.cooldown = time;
BLOXAR.damagePlayer(20);
BLOXAR.playSound('land');
BLOXAR.spawnEffect(player.position.x, player.position.y, player.position.z, 0xFF3B3B, 15);
}
}
Танцевальная зона
const dist = parent.position.distanceTo(player.position);
if (dist < 3) {
if (!script.userData.dancing) {
script.userData.dancing = true;
BLOXAR.playBodyAnim('dance');
BLOXAR.showText('🎵 Танцевальная зона!');
}
} else {
if (script.userData.dancing) {
script.userData.dancing = false;
BLOXAR.stopBodyAnim();
BLOXAR.showText('');
}
}
Портал с эффектом вращения
// Постоянное вращение блока
BLOXAR.rotate(parent, 0.02, 0.04, 0.01);
// Пульсация частицами
if (Math.floor(time * 4) % 2 === 0 && !script.userData.lastPulse) {
script.userData.lastPulse = true;
BLOXAR.spawnEffect(parent.position.x, parent.position.y, parent.position.z, 0x2F6BFF, 5);
} else if (Math.floor(time * 4) % 2 !== 0) {
script.userData.lastPulse = false;
}
// Телепорт при касании
const dist = parent.position.distanceTo(player.position);
if (dist < 1.5) {
BLOXAR.showText('⚡ Телепорт активен');
} else {
BLOXAR.showText('');
}