Обновление EdenSpark 1.0

Обновление

Мультиплеер — играйте вместе по сети

В игры EdenSpark теперь можно играть вместе! Игра запускается как сервер, клиенты подключаются к нему, а состояние мира передаётся между ними самостоятельно: вы пишете игру один раз, помечаете, чем делятся игроки, и движок синхронизирует копию у каждого игрока.

Лобби и сетевые сервисы встроены и интегрируются в игру через сетевой API Eden. Игрок открывает лобби прямо из игры, входит в систему, создаёт комнату и приглашает друзей; тот, кто её создал, хостит матч в своём процессе. Присоединение по приглашению запускает игру уже подключённой.

Пометка того, чем делятся игроки, — это одна аннотация. Компонент, написанный для одиночной игры, продолжает работать: добавьте [replicated] и копия компонента с сервера появится на каждом клиенте вместе с нодой, на которой он находится — его позицией, родителем, именем, мешем и коллизией.

[replicated]
class Health : Component {
    hp : float = 100.0

    def override on_update {
        if (hasRemoteAuthority) {   // someone else's copy: show it, decide nothing
            updateHealthBarUI()
            return
        }
        hp = min(hp + 5.0 * get_delta_time(), 100.0)
    }
}

Движок берёт на себя самое сложное. Движущийся объект показывается с небольшим отставанием от сервера и интерполируется между обновлениями, поэтому движение при игре по сети остаётся плавным, а не дёргается с частотой прихода пакетов. Физический объект движется с собственной физикой к позиции, которую указывает сервер, поэтому он взаимодействует с миром по пути, а не проходит сквозь него. Игра решает, кому разрешено видеть каждый объект и кто им управляет, а движок не отправляет ничего тому, кто не должен знать.

Для персонажа игрока, где любая задержка ощущается напрямую, игра может запустить локальную симуляцию сразу, а сервер подтвердит её позже, исправляя только расхождения.

Два проекта для старта: samples/new/net_cubes показывает всю настройку в минимальном виде, а samples/new/net_ships — играбельная арена, где несколько игроков толкают друг друга при реальной задержке.

Мультиплеер — новый функционал и активно развивается, в ближайших обновлениях он будет дорабатываться.

Закадровая эмиссия в глобальном освещении

Эмиссия теперь видна вычислениям закадрового глобального освещения. Это значит, что светящиеся поверхности могут освещать вашу сцену, даже когда вы на них не смотрите. Это также сильно повышает вклад эмиссии в глобальное освещение, позволяя таким объектам работать как площадные источники света.

Без закадровой эмиссии
С закадровой эмиссией

Статические источники света

Теперь у источников света, как и у мешей, есть свойство isStatic, по умолчанию оно отключено. Сейчас его единственный эффект — исключить нестатические источники света из вклада в закадровое глобальное освещение в HD Renderer. До этого все источники света были видны глобальному освещению и их перемещение вызывало постоянное обновление с заметным «кипящим» шумом. Хотя мы сильно ускорили и сгладили обновления освещения в глобальном освещении, оно было рассчитано на ситуативные изменения сцены во время игрового процесса или при создании игровой сцены. С добавлением закадровой эмиссии, основанной на кэшировании основного освещения, у глобального освещения теперь появляется дополнительная задержка при перемещении источников света. Поэтому мы решили отделить динамические источники света, которые при перемещении не добавляют лишних затрат и шума. Обратите внимание, что они всё ещё видны трассировкам глобального освещения в пространстве экрана. Мы также переименовали чекбокс meshStatic в редакторе в nodeStatic, вместе с парой связанных функций, поскольку теперь это состояние учитывает и источники света.

UI-канвасы в поле зрения камеры и в мировом пространстве

UI-канвас больше не привязан ко всему экрану. Теперь он может жить внутри области поля зрения одной камеры — например, HUD одного игрока при разделённом экране или интерфейс картинки в картинке — либо висеть в 3D-сцене как поверхность, на которую можно смотреть под любым углом и кликать.

Канвас в сцене рендерится и становится кликабельным через выбранные для него камеры — так же, как меши выбирают свои камеры.

Ввод, диагностика и стабильность в редакторе

Редактор сводит настройку ввода, диагностику и обратную связь по проекту в более понятный рабочий процесс. Пользовательское меню показывает элементы управления и сведения об ошибках, необходимые для разработки.

Действия ввода: поддержка аналоговых осей, указателя и движения мыши

Действия ввода теперь ведут себя одинаково для кнопок, триггеров, осей, джойстиков и ввода указателя. Одни и те же запросы «нажато» и «только что нажато» можно использовать и для цифровых, и для аналоговых элементов управления, что упрощает совместное использование ввода на основе действий между разными схемами управления. Кнопочные действия также могут выбирать, принимаются ли дополнительные клавиши-модификаторы.

Выделение и поиск в дереве сцены

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

📐Изменения API

miscellaneous.md

  • Свойство fontScaling удалено из компонентов UIText и Text3D, поскольку оно не имеет смысла для векторного рендеринга шрифтов, который мы теперь используем.

Статические источники света

  • set_mesh_static_recursive и get_mesh_static_status переименованы в set_node_static_recursive и get_node_static_status соответственно. Старые функции остались как устаревшие псевдонимы для совместимости с существующим кодом.

✨ Добавлено

  • Канвас можно прикрепить к камере, и он следует за её областью просмотра: размещается, отрисовывается и получает клики внутри неё. Без камеры он покрывает весь экран, как раньше.
  • Канвас можно разместить в мировом пространстве и показывать только в выбранных вами камерах.
  • Разрешение, относительно которого масштабируется канвас, теперь можно задать явно, а не брать из размера канваса на первом кадре.
  • Центр масс и тензор инерции больше не сбрасываются автоматически при изменении формы
  • CharacterController теперь можно задать массу
  • Свойства RigidBody.inertia и RigidBody.inertiaRotation теперь доступны для записи
  •  Игра по сети — один процесс запускает игру как сервер, другие подключаются к нему как клиенты; открытая сессия работает внутри игры самого игрока, без отдельного сервера для развёртывания
  • Лобби и приглашения — открывайте лобби из игры, входите в систему, создавайте комнату или присоединяйтесь и приглашайте друзей; присоединение по приглашению запускается сразу в матче
  • Компоненты [replicated] — пометьте компонент и копия с сервера появится на каждом клиенте вместе с трансформацией узла, родителем, именем и его компонентами движка
  • Плавное движение на реальном соединении —  объекты у подключённых по сети игроков показываются немного позже попадания на сервер и интерполируются между обновлениями; физические тела действуют по законам физики и взаимодействуют друг с другом.
  • Предсказание поведения персонажа игрока — локальные действия персонажа происходят сразу, а затем сверяется в с ответом сервера, так что управление остаётся отзывчивым при задержках сети
  • Видимость и владение — игра решает для каждого игрока, какие объекты вообще он видит, и какой игрок каким объектом управляет
  • Обмен сообщениями между узлами (peers) — отправка сообщений другой стороне и их обработка в месте получения с учетом требований к гарантии доставки для каждого типа сообщения.
  • Два демонстрационных проекта — net_cubes (минимальная конфигурация) и net_ships (полноценная многопользовательская арена).
  •  Поддержка эмиссии света объектами, находящихся за пределами экрана, в системе глобального освещения.
  • Свойство isStatic для компонентов PointLight и SpotLight. Оно скрыто в редакторе и управляется через флажок `nodeStatic` у ноды.
  • Настройка осей движения мыши, чувствительности и инверсии в разделе настроек ввода пользовательского меню.
  • Возможность копирования полного списка ошибок компиляции и выполнения из пользовательского меню (с помощью Ctrl+C или контекстного меню панели ошибок).
  • Функции is_action_pressed, is_action_just_pressed и is_action_just_released теперь поддерживают действия, связанные с кнопками, триггерами, осями, джойстиками и относительным перемещением курсора.
  • - Для функций is_action_pressed, is_action_just_pressed, is_action_just_released и is_action_state_active добавлен необязательный аргумент ModifierMatchMode. Существующие вызовы с одним аргументом остаются действительными; режим ModifierMatchMode.Strong (по умолчанию) требует точного совпадения настроенных модификаторов, тогда как ModifierMatchMode.Weak допускает наличие дополнительных модификаторов.
  • Движение мыши можно назначить в качестве оси действия (горизонтальной или вертикальной) с настройкой чувствительности и инверсии.
  • Действия с курсором поддерживают раздельные настройки инверсии по осям X и Y (только в режиме Delta).
  • Возможность множественного выбора нод сцены с использованием стандартных для редактора методов выделения, включая выбор диапазона.

🔧Улучшено

  • Текст предупреждений теперь отображается в более читаемом янтарном цвете на темном фоне редактора.
  • Вкладка ввода в пользовательском меню теперь отображает понятные сообщения по центру экрана, если игра остановлена, система ввода инициализируется или не определено ни одного набора действий.
  • Расширенные настройки ввода и буферизация логов скрыты или отключены для автономных проектов, не запущенных в режиме разработчика.
  • Действия, которые были активированы до включения соответствующего набора действий (action set), больше не сообщают о состоянии активации. Они снова становятся активными только после возврата в нейтральное состояние и повторного нажатия.
  • Функция is_action_state_active сообщает об активности в кадре отпускания, тогда как is_action_pressed возвращает только текущее ненулевое значение. Для действий типа «кнопка» оба метода учитывают строгое или нестрогое соответствие модификаторов.
  • При вставке нод в качестве дочерних или соседних элементов целевым объектом теперь служит последняя выбранная нода, а не первая в списке выделения.

🐛 Исправлено

  • В настройках внешнего редактора плейсхолдеры {file} и {editor} теперь заменяются путями, заключенными в кавычки, поэтому вручную добавлять кавычки больше не нужно.
  • Исправлены ошибки, связанные с флагом autoResizeFrame в компонентах UIText и Text3D: он больше не зависит от fontScaling, учитывает параметр margin, а также устранена циклическая зависимость, приводившая к необратимому уменьшению рамки при изменении размера шрифта.
  • Исправлена работа свойства margin в компонентах UIText и Text3D: отступ текста теперь точно соответствует заданному значению, все четыре параметра смещают текст внутрь, а выравнивание текста учитывается корректно.
  • Исправлено некорректное позиционирование UIImage при использовании нескольких камер и режиме рендеринга канваса ScreenSpaceOverlay.
  • Клики по повернутому или наклоненному канвасу в сцене теперь регистрируются именно там, где отрисован канвас.
  • В режиме разделенного экрана клики по канвасу больше не проходят сквозь камеру, которая его не отображает, а канвас, привязанный к конкретной камере, игнорирует действия мыши за пределами области этой камеры на экране.
  • Сжатие логов консоли больше не приводит к искажению данных стека или сбоям при копировании или отображении пропущенных записей.