Первый игровой клиент
Соберите и запустите настольный клиент, подключённый к серверу примера Minimal Multiplayer, который принадлежит движку.
Предварительные требования
Сначала завершите руководство по headless-проекту. В отдельном checkout FOnline
остаётся подмодулем Engine/ рядом с файлом CMakeLists.txt примера.
В корне отдельного примера выполните:
python validate.py
В Linux используйте python3 validate.py. Команда конфигурирует и собирает
настольный клиент, headless-клиент, headless-сервер и baker, после чего запускает
полный автоматизированный урок.
Сопровождающие движок могут проверить исходники непосредственно из этого репозитория без материализации отдельного репозитория:
cd Examples\MinimalMultiplayer
python validate.py
В Linux используйте ту же точку входа python3 validate.py из Examples/MinimalMultiplayer.
Запуск видимого клиента
После успешного завершения validate.py откройте два терминала в корне
отдельного примера. Сначала запустите сервер:
Build\windows\Binaries\Server-Windows-win64\FOMM_ServerHeadless.exe -ApplyConfig FOnlineMinimalMultiplayer.fomain
Затем запустите настольный клиент:
Build\windows\Binaries\Client-Windows-win64\FOMM_Client.exe -ApplyConfig FOnlineMinimalMultiplayer.fomain
Имя сгенерированного платформенного каталога может отличаться в зависимости от
хоста и генератора. Клиент подключается к 127.0.0.1:4010, входит в игру через
Tutorial::EnterWorld() и загружает TutorialMap. Когда карта появится,
нажмите пробел. Клиент вызовет CollectSupply(), сервер увеличит
SuppliesCollected, а клиент отобразит синхронизированное значение.
В журнале должны появиться следующие этапы:
tutorial_client_connected
tutorial_server_world_ready
tutorial_client_map_loaded
tutorial_server_supply_collected=1
tutorial_client_supply_collected=1
Граница между клиентом и сервером
Полное поведение находится в
Scripts/Tutorial.fos:
- На клиенте
Game.OnStartпривязывает шрифт движка и вызываетGame.Connect(). - На клиенте
Game.OnConnectedвызывает серверный remote callEnterWorld(). - Сервер создаёт локацию, карту, криттеров и предмет, авторизует игрока, а затем вызывает
WorldReady(). - На клиенте
Game.OnMapLoadedвключает ввод и отрисовывает карту с небольшим интерфейсным слоем. - Пробел отправляет только намерение. Создание предмета и изменение реплицируемого свойства принадлежат серверу.
Клиент отвечает за представление и намерение, сервер — за авторитетное состояние мира и постоянные данные.
Контракт конфигурации
FOnlineMinimalMultiplayer.fomain
генерируется из текущих объявлений настроек движка, потому что при подготовке
дистрибутива Config baker требует полный набор серверных и клиентских настроек.
Решения проекта остаются явными в generate_config.py: изменяйте его
OVERRIDES или PROJECT_SECTIONS, повторно генерируйте .fomain и сохраняйте
проверку --check зелёной. При обычном запуске настройки применяются в таком
порядке:
- значения по умолчанию из движка;
- конфигурация проекта или встроенная конфигурация пакета;
- выбранные sub-config;
- доступный для записи кэш локальной конфигурации;
- переопределения командной строки;
- производные автоматические настройки.
Настольная цель размещает FOMM_BakerLib рядом с хостом, чтобы запуск без
пакета мог предварительно запечь изменённые исходники. Более строгий Config
baker для дистрибутива требует инициализации каждой сохраняемой настройки
проекта; CheckTutorialConfig обнаруживает рассогласование до запекания или
упаковки.
Восстановление после ошибок
Connection refused: сначала запустите сервер и убедитесь, что порт4010свободен.Config file not found: запускайте команду из корня примера или передайте полный путь в-ApplyConfig.- Отсутствует
FOMM_ClientLib.dllилиFOMM_BakerLib.dll: пересоберите пресетwindows-check; не копируйте DLL из другого проекта. - Изменение карты или скрипта не учитывается: выполните
cmake --build --preset windows-check, чтобы запечь ресурсы и повторить весь маршрут.
Продолжите с первого изменения контента.