Социальная ферма, где всё растёт в реальном времени. Культуры первой ступени созревают за пять минут, восьмой — за двенадцать часов. Урожай игрок собирает сам, кликом, а сохранение хранится на сервере. Пока вас нет, ферма продолжает расти — ради этого в игру и возвращаются.
Кроме того, в игре есть друзья (их находят по названию фермы), гости на чужих фермах, подарки, рынок между игроками и жители, которые берут на себя всю работу, кроме сбора урожая.
| Движок | Unity 6000.5.6f1 (Unity 6.5), URP Forward+ |
| Интерфейс | UI Toolkit (UXML/USS), без uGUI |
| Управление | Input System — мышь и тач |
| Сеть | UnityWebRequest + Awaitable, только HTTP |
| Сервер | Python (только стандартная библиотека) + SQLite |
| Клиент | WebGL, около 18 МБ в gzip |
1. Запустите сервер. Игра работает и без него, но тогда прогресс не сохраняется между запусками.
python Tools/server.pyСервер один: он отдаёт и файлы веб-сборки, и API (/api/*, база — Tools/farm.db).
Всё работает на порту 8000, так что проблем с CORS не возникает. Если папки Build/Web
нет, сервер запустится только с API — этого достаточно, чтобы играть из редактора.
Порт менять нельзя: сессии игроков хранятся в PlayerPrefs, а браузер привязывает их
к домену и порту.
2. Откройте Assets/Scenes/MainMenu.unity — это стартовая сцена (индекс 0).
Нажмите Play и создайте ферму: придумайте название и пароль. Главное меню загрузит
сохранение с сервера и передаст его в сцену фермы.
3. Сама ферма — Assets/Scenes/FarmerDemo.unity. Её можно открыть и напрямую, но тогда
сохранение не загрузится и игра начнётся с нуля.
Что делать в игре: собирать созревший урожай, объединять грядки перетаскиванием, поливать и удобрять их инструментами с нижней панели, покупать в «Магазине», выполнять заказы горожан, приглашать друзей и ходить к ним в гости.
В редакторе — меню Farm → Собрать веб-версию. Из командной строки:
Unity -quit -batchmode -projectPath . -executeMethod Farm.Game.EditorTools.WebBuild.BuildFromCommandLineВсе настройки плеера задаются в WebBuild.cs, а не вручную в окне Player Settings.
Иначе рано или поздно настройки в инспекторе разойдутся с тем, как игра собирается
на самом деле. Сборка занимает около четырёх минут и складывается в Build/Web.
Используется сжатие gzip, а не brotli: brotli экономит 4,3 МБ, но браузеры принимают
его только по HTTPS.
Код разбит на восемь сборок: Farming (ядро), Characters (жители), Net (сеть),
Interaction (мышь и тач), Juice (визуальные и звуковые эффекты), UI, Game
(игровая сессия, сцены, окна) и инструменты редактора. Архитектура держится на трёх
правилах.
-
Никакого поиска по сцене. Все игровые объекты регистрируются в статических реестрах (
GrowableRegistry,BuildingRegistry,MovableRegistryи т. д.) с операциями за O(1). Нужна ближайшая созревшая грядка — спрашиваем реестр, а не вызываемFindObjectsByType. -
Рост считается от времени посадки, а не таймером. Грядка хранит момент, когда её засадили, и в любой момент может вычислить свою стадию. Один
GrowthSchedulerна всю ферму будит грядки ровно тогда, когда у них меняется стадия. Время берётся с сервера в unix-секундах (ServerClock), поэтому ферма, которую не открывали всю ночь, догоняет реальное время за один вызов. -
Системы общаются через события. Ядро генерирует события, а звук, частицы, UI и сеть на них подписываются. Если убрать
JuiceилиUI, игра продолжит работать — просто без звука и интерфейса.
-
Собирать урожай и объединять грядки может только игрок. Нанятый житель собирает лишь простые культуры — не выше третьей ступени. Дорогие культуры, которые растут часами, автоматически не собираются никогда. Гость может помочь хозяину с пятью грядками, урожай при этом достаётся хозяину.
-
Ночные ресурсы — только для игрока. Светлячков и росу можно собрать только вручную.
-
Случайность — для атмосферы, а не для решений. Взгляды, мысли жителей и небольшой разброс в таймингах не влияют на то, чем житель займётся, каким путём пойдёт и как быстро будет работать. Случайность в работе выглядит как баг, а в безделье — как жизнь.
Объединение грядок («Слияние 2.0»). Объединять можно грядки одной культуры любого уровня: уровни складываются, максимум — 20. Две грядки двадцатого уровня превращаются в грядку уровня 10 с культурой следующей ступени той же линейки. Это необязательный способ получить дорогие культуры, и он намеренно позволяет обойти ограничение по уровню игрока.
Tools/server.py — один процесс на стандартной библиотеке Python: раздача статики,
REST API и SQLite. Что он умеет:
- аккаунты по названию фермы и паролю. Клиент отправляет не сам пароль, а его
sha256с названием фермы в качестве соли; на сервере хранитсяPBKDF2-HMAC-SHA256с 600 000 итераций; - отдельные сессии для каждого устройства;
- друзья — заявку нужно явно принять;
- асинхронные визиты на чужие фермы;
- подарки;
- рынок, где цены на лоты фиксированы по каталогу;
- HTTPS (
--certи--key).
Насколько сервер доверяет клиенту. Игровую логику считает клиент, и сервер ему
доверяет. Сервер отвечает за время, аккаунты и базовые проверки на явно некорректные
данные (лимиты золота, числа грядок, уровней). Ещё он применяет мягкую эвристику
по экономике на основе выгрузки каталога (Tools/catalog.json): подозрительная ферма
помечается, но сохранение не отклоняется. Чтобы полностью пересчитывать экономику
на сервере, пришлось бы продублировать там весь каталог контента и все бонусы. Делать
это до того, как у игры появятся настоящие игроки, пока нет смысла.
Вся 3D-графика и звуки — бесплатные наборы Kenney и Quaternius под лицензией CC0. Шрифт — Inter под SIL OFL 1.1. Полный список наборов и лицензий — в CREDITS.md.
Иконки ресурсов и деревянное оформление интерфейса сгенерированы скриптами
Tools/icons.py и Tools/skin.py.
Код распространяется под лицензией MIT. На сторонние ассеты действуют лицензии их авторов — см. CREDITS.md.
A social farming game on real-world time: crops ripen over real minutes and hours (5 minutes at tier 1, 12 hours at tier 8), the player harvests by hand, and the save lives on the server — so the farm keeps growing while you're away. Friends, visits to other farms, gifts, a player market, and a colony of residents who do everything except the harvesting.
Unity 6.5 (URP, UI Toolkit) on the client; the server is a single Python file — standard library plus SQLite — serving both the WebGL build and the REST API on one port. Code is MIT licensed; art is CC0 from Kenney and Quaternius. Source, comments and in-game text are in Russian.