Социальная ферма на реальных часах. Культуры зреют настоящие минуты и часы — пять минут у первой ступени, двенадцать часов у восьмой, — урожай снимает игрок кликом, партия живёт на сервере. Пока игрока нет, ферма растёт без него: за тем и возвращаются.
Вокруг этого — друзья по имени фермы, визиты на чужие фермы, подарки, рынок между игроками и колония жителей, которые делают всё, кроме сбора.
| Движок | 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/* с базой 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.