WebView
Client JavaScript предоставляет varion.WebView через platform bootstrap. WebView-команды передаются в client runtime и дальше в WebEngine overlay.
Конструктор
// Базовый overlay (второй аргумент true = overlay-режим)
const view = new varion.WebView(url, true);
// Fullscreen overlay
const view = new varion.WebView(varion.assetUrl('ui-pack', 'index.html'), true);
view.pos = { x: 0, y: 0 }; // левый верхний угол (нормализованные 0–1)
view.size = { x: 1, y: 1 }; // 1×1 = полный экран
view.visible = true;
view.focused = true;
view.emit('hud:setHealth', 200);
view.on('hud:ready', () => varion.log('ui ready'));Второй аргумент конструктора — булев флаг overlay. Если true, WebView рендерится поверх игры. Если пропущен или false — режим DUI (in-world texture), который сейчас является scaffold и деградирует до screen billboard (см. ниже). Конструктор также принимает new varion.WebView(url, pos, size).
Координаты pos и size нормализованы: {x: 0, y: 0} — левый верхний угол, {x: 1, y: 1} — правый нижний. По умолчанию размер 0.15 × 0.1 — для fullscreen задавайте size = {x: 1, y: 1} явно.
Factory
const overlay = varion.WebView.create({
url: varion.assetUrl('ui-pack', 'index.html'),
overlay: true,
pos: { x: 0, y: 0 },
size: { x: 1, y: 1 },
visible: true,
headers: { 'X-Auth': token },
});WebView.create(options) — рекомендуемый способ. Передача drawable / targetTexture в options переводит view в DUI-режим (билборд-fallback).
Статические члены
| API | Назначение |
|---|---|
WebView.create(options) | Создать WebView из options-объекта |
WebView.all | Массив всех WebView |
WebView.count | Количество WebView |
WebView.getByID(id) | Найти WebView по id |
WebView.gpuAccelerationActive | GPU-ускорение активно (true) |
Глобальные хелперы событий: varion.onWebView(name, cb), varion.onceWebView(name, cb), varion.offWebView(name, cb).
Методы экземпляра
| Метод | Назначение |
|---|---|
on(name, cb) | Подписаться на событие из WebView (возвращает { destroy() }) |
once(name, cb) | Подписаться на одно событие |
off(name, cb) | Удалить обработчик |
emit(name, ...args) | Отправить событие в WebView |
emitRaw(name, ...args) | То же, что emit |
getEventListeners(name) | Список обработчиков (или всех, если name не задан) |
execJS(code) | Выполнить JavaScript внутри WebView |
reload(ignoreCache) | Перезагрузить страницу |
focus() / unfocus() | Сфокусировать / снять фокус |
sendKey(key, state) | Отправить нажатие клавиши (state — down/up) |
attachTo(target, offset) | Привязать к сущности (world billboard) |
detach() | Отвязать от сущности |
addOutput(output) | Добавить audio-output (напр. AudioOutputWorld) |
removeOutput(output) | Убрать audio-output |
getOutputs() | Список привязанных audio-outputs |
setExtraHeader(name, value) | Дополнительный HTTP-заголовок |
setZoomLevel(level) | Уровень масштабирования |
setCookie(cookie) | Установить cookie (строка или объект) |
openDevTools() | Открыть DevTools |
destroy() | Уничтожить WebView |
Плюс мета-хелперы: getMeta(key), hasMeta(key), setMeta(key, value), deleteMeta(key).
Свойства (get/set)
| Свойство | Назначение |
|---|---|
url | URL страницы (переустановка перезагружает видимый view) |
unfocusedUrl | URL, на который переключиться при потере фокуса |
pos = {x, y} | Позиция левого верхнего угла (нормализованные 0–1) |
size = {x, y} | Размер (нормализованные 0–1, 1×1 = fullscreen) |
z | Z-порядок (наложение) |
opacity | Прозрачность 0–1 |
visible / isVisible | Показать или скрыть WebView |
focused | Фокус WebView (синхронизирует game controls) |
Только для чтения (состояние)
| Геттер | Назначение |
|---|---|
isReady | Страница загружена и готова |
isLoaded | Страница загружена |
isLoading | Идёт загрузка (видим и ещё не загружен) |
isStreamedIn | View застримлен (для world-attach — по сущности) |
isFocused | В фокусе |
isDuiCompat | Работает в DUI-совместимом (billboard) режиме |
worldOnScreen | World-view сейчас на экране |
valid | View ещё существует (не уничтожен) |
События
view.on('load', () => {}); // страница загрузилась (isReady/isLoaded = true)
view.on('loadError', () => {}); // ошибка загрузки
view.on('customEvent', (a, b) => {}); // любое событие, отправленное со страницыСо стороны страницы события отправляются в client через bridge WebEngine, а view.emit(...) / view.execJS(...) доставляют данные обратно на страницу.
Поведение visible и focused
Установка visible = true автоматически фокусирует WebView. Когда WebView focused и visible, syncWebViewGameControls отключает управление игрой.
DUI / in-world
In-world texture (DUI) — это scaffold. Non-overlay режим и attachTo(entity) деградируют до screen billboard, спроецированного на сущность, а не до реальной in-world текстуры. Отдельный класс-заготовка varion.WebViewDui(url, width, height) существует как каркас будущей in-world текстуры:
const dui = new varion.WebViewDui(url, 512, 512);
dui.emit('event', payload);
dui.isReady; // true, когда текстура готова (пока scaffold)
dui.destroy();Загрузка URL
const url = varion.httpUrl('cef/index.html'); // HTTP-сервер ресурса
const url = varion.assetUrl('mymode', 'ui/index.html'); // asset-pack ресурсаhttp/https-URL должны совпадать с manifest-http или asset-pack ресурса; локальные схемы (file/data/blob, относительные пути) разрешены.
Source backing
Страница основана на sdk/client-js-runtime/injected/platform-bootstrap.js, client/src/scripting/CClientScriptRuntime.cpp, client/src/webengine/CWebEngineOverlay.cpp и client/src/webengine/CWebEngineOverlay.h.