S&Box DevBlog Март 2021 - S&box - Моддинг Игр и Серверов Jump to content
Guest

S&Box DevBlog Март 2021


OriginalShaman
 Share

Recommended Posts

S&Box DevBlog Июль 2021

*Повествование ведется от первого лица, так как текст - это перевод с официального сайта разработчика игры.

 

“Хедлайнерами этого месяца являются предикция и загрузка аддонов, но мы сделали массу вещей”

Ввод курсора (Garry)

Layla играется с какой-то штукой, для которой нужен был старый ввод курсора в стиле контекстного меню GModа, поэтому я ему его сделал.

Присоединение к игре друга

Играть с друзьями должно быть просто. В этом месяце я написал кучу всего в серверном лобби и RPC, чтобы действительно легко присоединяться к игре друга.

Я уже упоминал об этом в предыдущих блогах, но думаю, что это важный момент. Если вы создадите игру, то люди смогут присоединиться. Вам не нужно будет играться с брандмауэром, оно просто будет работать.

Март 2021, изображение №1
 
 

Предикция

У меня вся предикция работает. Я откладывал это на пару месяцев, потому что думал, что это будет заноза в заднице, в конце концов это заняло 2 дня и было не так уж плохо.

ЧТО ТАКОЕ ПРЕДИКЦИЯ

В общем, по-быстрому объясню как предикция работает в Source. Клиент создает пользовательскую команду, которая представляет собой структуру, описывающую входные данные игрока. Основные данные, такие как кнопки и углы прицеливания. Он посылает эту пользовательскую команду на сервер, и сервер перемещает игрока, стреляет из пистолета и т.д.

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

АТРИБУТЫ

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

Март 2021, изображение №2
 
 

Здесь нет ничего сложного, это как и любая другая сетевая переменная.

ПЕРВЫЙ РАЗ

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

Для этого мы создали защиту от дурака Predict.FirstTime. Оно всегда имеет значение true на сервере, но на клиенте принимает значение true лишь в том случае, если кадр прогнозируется впервые.

Март 2021, изображение №3
 
 

ОТКЛЮЧЕНИЕ

Когда ты стреляешь, проигрывается звук. Этот звук прогнозируется локально, но когда кадр воспроизводится сервером, звук проигрывается всегда. Мы немного подшаманили за кулисами, чтобы предотвратить проигрывание этого звука снова, если он был спрогнозирован локальным клиентом.

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

В таких ситуациях используется Prediction.Off() чтобы выключить предикцию. Он создает IDisposable, с которым легко охватить его. Мне не очень нравится этот синтаксис, потому что мы все-равно должны проводить проверку, воспроизводится ли код на сервере, поэтому синтаксис может измениться.

Март 2021, изображение №4
 
 

Обновленный Эффект Свечения(Sam)

Гарри хейтил L4D-подобный эффект свечения, который был по дефолту с движком, поэтому я переписал его, вдохновляясь нашим Facepunch.Highlight эффектом свечения меша, выводящемуся в HDR, потому само свечение получается естественным образом от интенсивности контура, что хорошо помогает ему выделиться.

 
 

Весь эффект достаточно легко настраивается, можно указать, аддитивен или прозрачен ли он, и сейчас он распознает глубину, видимую и скрытую часть свечения можно изменить, чтобы, к примеру, предметы, которые держатся физганом становились частично видимыми, когда закрыты каким-либо препятствием.

Чтобы свечение так работало, нужно просто чтобы видимые и скрытые части имели одни и те же параметры.

 

Можно сделать кучу всякого интересного с этим эффектом, он позволяет разработчикам создавать что-то неожиданное, например, если ты делаешь игровой режим в стиле Хищников / Зомби, ты можешь запросто использовать его чтобы создать что-то вроде волхака.

 

Улучшения ModelDoc(Layla)

В этом месяце я сделал еще несколько улучшений в ModelDoc. ModelDoc - инструмент, используемый для создания/импорта моделей в Source 2.

МНОЖЕСТВО БИНД ПОЗ

По умолчанию в ModelDoc FBX импорт поддерживает только одну бинд позу. И это вероятно хорошо, если вы делаете свои модели на заказ.. Но если вы, как мы - импортируете модели из других мест, вы столкнетесь с проблемами.

ViewModel Арбалета из Rust был сломан из-за этого, теперь он пофикшен.

 

VIEWMODEL РЕЖИМ

Теперь есть режим камеры “ViewModel”, который просто блокирует обзор на нули, это полезно для того, чтобы увидеть, как выглядит ваш viewmodel в игре, и если вам нужно будет его сместить. Вероятно есть и другие полезные режимы камеры, которые я могу добавить в будущем.

Март 2021, изображение №5
 
 

ИМПОРТ SOURCE МОДЕЛЕЙ

Я добавил поддержку для импорта моделей из первого Source. Конечно спорно, должны ли мы вообще включать это в S&box, потому что нам хочется поощрять создание новых ассетов, а не портирование старых. Однако, я вижу это так: люди все равно будут портировать старые ассеты и я бы не хотел, чтобы люди качали какие-то старые паленые MDL декомпиляторы

ФИКС PhysicsHullFromRender

Раньше это не работало. Не визуализировалась или не рассчитывалась информация о массе, потому я это исправил.

Март 2021, изображение №6
 
 

EntityIO(Garry)

Каждый, кто достаточно глубоко погрузился в маппинг с использованием Hammer, наверное знает о Entity IO. Это система, которая позволяет связать выходы энтитей со входами других энтитей.

Март 2021, изображение №7
 
 

К примеру, можно вызвать выход на кнопке, названной “OnPressed” ко входу света названного “Toggle”, и кнопка будет включать или выключать свет.

В этом месяце я перенес это в C#. Чтобы создать вход на энтити, нужно просто отметить его с помощью атрибута “Input”.

Март 2021, изображение №8
 
 

И чтобы запустить выходы, нужно просто вызвать “FireOutput”.

Март 2021, изображение №9
 
 

Здесь есть чего еще доработать, но все работает так, как вы и ожидали.

ПЕРЕДАЧА ФАЙЛОВ

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

Идеальный сценарий в релизе - это загрузка файлов в аддонах, или скачивание с вебсайта. Таким образом мы сможем поддерживать несколько загрузок одновременно, и все будет грузиться гораздо быстрее. Это то, как оно должно работать в 99% случаев и обязательно будет поддерживаться.

Но мне кажется, что загрузка с сервера важна при разработке аддона. Если я делаю игровой режим и люди на моем сервере не хотят грузить аддон со свежими изменениями - они должны получить их в реальном времени.

И это то что происходит сейчас. Если я меняю таблицу стилей на моем сервере, клиенты будут оповещены об этом, и в итоге осознают, что у них нет того нового файла, и затем загрузят его с сервера. Когда они загрузят его, он будет загружен “на горячую”, и все будет снова синхронизировано.

Иметь возможность редактировать в реальном времени имеет огромную разницу. Таким образом преобразуется процесс разработки. Игроки на сервере становятся лабораторными крысами, реагирующими на каждую перемену разочарованием или радостью. Разработка превращается в игру.

Асинхронная Стратегия

Какое-то время я пытался понять, как же работает асинхронизация, но затем начал разбирать все это по полочкам на этой неделе. Вот вам FAQ.

ЧТО ТАКОЕ АСИНХРОНИЗАЦИЯ

Это позволяет воспроизводить вам функции асинхронно

Март 2021, изображение №10
 
 

Таким образом, если вызвать функцию сверху, она будет воспроизводиться до await, затем <секунд> секунд позже она воспроизведет Toggle(). Может быть, это не так примечательно само по себе, но можно связать эти вещи.

Март 2021, изображение №11
 
 

Также они могут возвращать значения, таким образом можно ожидать значение из функции - что довольно-таки полезно для вещей, вроде вызова API.

ЭТО МУЛЬТИПОТОЧНОСТЬ?

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

КАКОВА СТРАТЕГИЯ?

Думая о задачах для аддонов, мы должны подумать о паре вещей.

Во-первых, если использовать Задачу на энтити, и энтити удалена, что должно произойти. Я хочу обуздать это хорошим и автономным способом. Я не хочу страдать с CancellationTokens и прийти к тому, что асинхронизация станет невыносимо долгой.

Также, если вы воспроизводите задачу и затем отключаетесь с сервера, задача должна отмениться. У нас не должна оставаться куча задач, воспроизводящихся в меню после отключения от игры.

Существующие по умолчанию функции типа Task.Delay воспроизводятся в реальном времени, а мы, вероятно, хотим использовать внутриигровое время по умолчанию.

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

И КАК С ЭТИМ ДЕЛА?

Мне кажется, у нас есть неплохое, сбалансированное решения для всех этих вещей.

Использование Игроком

В этом месяце я реализовал использование кнопки игроком. Я говорю о кнопке Use у игрока, но в целом она универсальна, так что технически NPC тоже могут ее использовать.

Чтобы сделать объект пригодным для использования, вы просто подключаете этот интерфейс.

Март 2021, изображение №12
 
 

Автозаполнение

Я добавил автозаполнение в стандартное поле “TextEntry”. Он также может иметь историю на базе файлов cookie, так что история сохраняется между игровыми сессиями.

Я сделал это для консоли, но оно доступно для использования всем..

Март 2021, изображение №13
 
 

Реализация Энтитей

Вместо использования нативных энтити, нам лучше всего перенести их в C#.

Такое чувство, что у нас есть возможность здесь, начать с чистого листа, удалить и очистить все, чтобы сделать их более осмысленными

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

 

Поэтому в этом месяце в качестве первого шага, я конвертировал энтити дверей, кнопок, и освещения в C#.

Это раскрыло еще больше энтитей, которые я бы хотел перенести в C#. Нативный код имеет “MOVETYPE_PUSH“ систему, где энтити(как двери) двигаются, но и толкают энтити. Они могут убивать энтити, которые блокируют путь и т.д.

Это система, которая нам нужна, потому что мы действительно не хотим делать такие вещи, как контроллеры игроков / npc базирующиеся чисто физически. Но я также думаю, что это система, которую нам лучше реализовать на C#, так что мы можем манипулировать ею немного легче.

 

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

Голосовой чат(Layla)

Голосовой чат это нечто, что уже было в Source 2, но как и большинство фич - если оно связано с геймплеем, в идеале мы хотим перенести это в C#, чтобы начать с нуля и иметь полный контроль над этой фичей.

Игрок может записывать вход с микрофона, который передается на сервер, эти две функции ниже являются виртуальными функциями в игровом режиме.

Март 2021, изображение №14
 
 

Существует серверная функция для входящих голосовых данных, и ваш игровой режим может затем решить, кто будет их слышать

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

 

Рендер захвата сцены

Мы хотели получить способ рендера 3D объектов на UI. Можно разделить это на две части. Первая часть заключается в том, что сцены, которые ты хочешь отрисовать на UI, в идеале, не должны существовать в основной сцене, ведь будет не очень круто спавнить энтити в основной мир и прятать его лишь ради того, чтобы отрисовать его на UI

Вместо этого, новые миры - сцены могут быть созданы и объекты сцены добавлены к ним. Объекты сцены являются по сути тем, что вся игра использует для рендера мира, поэтому их можно просто использовать без расходов на создание новых энтитей.

Вторая часть заключается в том, чтобы иметь возможность рендерить мир сцены на цель рендера. Как только есть цель для рендера, эта текстура может быть просто отрисована на UI

Март 2021, изображение №15
 
 

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

Эти объекты моделей сцены могут быть анимированы, но в данный момент API поддерживает только настройку костей. В следующем месяце я сделаю так, что их можно будет анимировать с помощью animgraph.

Загрузки игровых режимов(Garry)

Процесс установки - отстой. Представь, если бы тебе пришлось устанавливать вебсайт, который ты хочешь посетить. Такое мое отношение к игровым режимам и картам в S&box.

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

По большей части, это невидимо для конечного пользователя, в такой степени, что можно ввести “gamemode dm98” в консоль и затем “map testmap” и она автоматически установит dm98 и игра начнется в течение 5 секунд.

 

Очевидно, загрузка до абсурдности быстрая, поскольку игровой режим весит только 500КБ, но держите в уме, что в этот маленький период загрузки отправляется запрос гитхабу на последнюю версию, загружается, разархивируется, компилируется и, наконец, запускается.

МАСТЕРСКАЯ

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

Хотите ли вы загрузить игровой режим в Workshop, либо на Github, либо на свой собственный веб-сайт - не имеет значения, пока мы можем его скачать

Баги, выявленные в игре

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

ERROR МОДЕЛИ

Март 2021, изображение №16
 
 

Много моделек были еррорками, потому что клиент не мог найти настоящие модели. Так случилось потому что модельки занетворчены как ResourceID, которые, в свою очередь, являются хэшами файловых имен и типов. Клиент имеет ResourceID, только если ресурс загружен.

Я нашел кучу кода сетевого прекэша в движке, но он не был ни к чему привязан, поэтому я полностью снес его и перенес в C#.

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

ЧИТЫ

Люди имели возможность использовать читы. В частности, Layla летал повсюду и спавнил ботов. Я попытался исправить это пару раз и у меня не вышло, потому все закончилось переписыванием большей части системы консольных команд.

На самом деле, у нас было две системы консолей. Когда мы делали игру на Unreal Engine, я сделал нашу собственную систему консоли, которая была единственной системой консоли, которую мы использовали. Она в значительной степени отражала работу системы Source консоли.

Теперь, когда мы используем Source 2, это имеет меньше смысла. Мы все еще хотим использовать консольные команды и консольные переменные, но единственная настоящая система консоли должна быть родной. Вот как это работает в данный момент.

СМЕЩЕНИЕ ЭНТИТЕЙ

Март 2021, изображение №17
 
 

У нас какое-то время был баг, когда клиентская энтити была смещена относительно серверной. Это можно наблюдать на картинке выше… зеленая сетка - серверная физика. Серебряная мусорка находится в самом конце карты для сервера, но для клиента она находится прямо перед игроком.

Пока что, это нераскрытое дело, ожидающее расследования.

Улучшения CSS Рендеринга(Sam)

Я потратил довольно немало времени чтобы вернуться к элементам пользовательского интерфейса; рефакторинг; оптимизация и завершение некоторых незакрепленных итогов, это начинает казаться почти таким же, как если бы вы могли проектировать с полной силой CSS браузера сейчас, без гигантской массы фактического ношения браузера.

Для каждого элемента мы делаем кучу тестов, чтобы убедиться, что все соответствует ожидаемому результату.

CSSBOX

CSSBox контейнер был почти целиком переписан, и границы, и сам “box” имеет очень хорошее, гладкое аналитическое субпиксельное сглаживание, оно выглядит особенно хорошо, когда оно анимировано, или движется динамически как в HUD, где есть динамическое перекрестие.

Март 2021, изображение №18
 
 

РЕНДЕРИНГ ТЕКСТА

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

Март 2021, изображение №19
 
 

И вы можете все видеть тесты что у нас есть для него:

Март 2021, изображение №20
 
 

ГРАНИЦЫ КАРТИНОК

Я также реализовал 9-сегментное масштабирование, вы можете использовать изображение в качестве границы вашего контейнера, и украшать его так, как вам нравится, игры типа MMO и RPG отлично используют его, вы можете спроектировать его так же, как и с CSS border-image параметром.

Март 2021, изображение №21
 
 

Для референса, чтобы помочь визуализировать, используемое изображение в качестве 9-сегментной текстуры для тестирования границ выше выглядит примерно так:

Март 2021, изображение №22
 
 

СООТВЕТСТВИЕ

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

Карты Детматча(Louie)

Я начал в Facepunch с экспериментов над картами для детматча, которые, надеюсь, выйдут достаточно универсальными, для использования в нескольких разных игровых режимах.

Масштаб Карты

Нам начала встречаться проблема с некоторыми ассетами из Rust, так как они имеют неоднозначные размеры. Большая часть ощущений от Source движка это неоднозначный масштаб для всего.

И для того чтоб помочь нам с этим, я сделал карту для референса размеров при создании карт и моделей.

Март 2021, изображение №23
 
 

Карты тестов объектов

Гарри хотел несколько карт для тестирования кнопок, дверей, двигающихся платформ и пуш-тригеров. Эти карты были созданы до того как энтити были внедрены и были использованы для тестирования их во время разработки.

Март 2021, изображение №24
 
 
Март 2021, изображение №25
 
 

CodeGen Оптимизации(Garry)

При компиляции аддонов мы применяем поверх них codegen. Это модифицированная версия Source Generators и она добавляет кучу трюков которые мы используем с RPC и сетевыми переменными. Это занимало примерно 4 секунды на нашем базовом аддоне (у которого очень много файлов).

Я переписал его и теперь это занимает 0.1 секунды.

Виртуальный Скроллинг

Когда у тебя огромный список чего-то в UI, ты часто сталкиваешься с проблемой что получается слишком много панелей. И не важно на сколько быстрая у тебя UI система, количество панелей всегда станет тем что сломает её.

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

Так что вместо создания панелей ты добавляешь данные в список. Потом ты просто говоришь какой тип дочерней панели создать.

 

Итоги

Еще один хороший месяц прогресса, хорошая скорость. Все обретает форму, где я хочу всё начать.

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

Я говорю это в каждом девблоге, но в этом месяце я немного раздвоен по поводу выпуска раннего доступа. Часть меня хочет в течение месяца воздержаться и возиться с созданием разных игровых режимов. Если мы откроемся, я не думаю, что смогу это сделать, потому что надо будет работать над документацией, будут запросы фич и отчеты об ошибках. Но с другой стороны, будет больше людей, с которыми можно будет поиграть и поделиться.

Думаю, я уговорил себя. Мы будем раздавать несколько ключей в Апреле.

Link to comment
Share on other sites

 Share

Подписывайтесь на нас во Вконтакте!

×
×
  • Create New...
Search In
  • More options...
Find results that contain...
Find results in...

Write what you are looking for and press enter or click the search icon to begin your search