Променял React на C#: осваиваю новые для себя инструменты (AI-Evolution # ?)

Уже некоторое время не писал новостей по проекту. Напомню для контекста: я занимаюсь разработкой эволюционного симулятора, где агенты (скажем так, животные) бегают по полю, живут и взаимодействуют с окружением не на основе жесткого дерева условий, а с помощью нейросетей.

Пока только научился создавать на карте агентов и кусты.
Пока только научился создавать на карте агентов и кусты.

То есть вместо банального скрипта «если увидел куст — беги к кусту», мозг агента оценивает всё, что находится перед его глазами: расстояние, окружение, текущий уровень голода. На основе этого сеть выдает управляющий сигнал — в какую сторону повернуться и с какой скоростью двигаться.

Финальная точка на данный момент в проекте React + Python.

Лирическое отступление: откуда растут ноги?

Видеоигры я люблю с детства. Когда у меня впервые появился домашний ПК, это был настоящий культурный шок. Так получилось, что любимыми жанрами с ранних лет стали стратегии и RPG. Мне нравилась возможность управления ресурсами и подопечными — будь то экономика в градостроях вроде Zeus, Emperor или мирный SimCity. А в ролевых играх всегда привлекала возможность развития: когда твой герой растет, адаптируется и меняется. Поэтому неудивительно, что в основу своего симулятора я закладываю именно эти концепции — менеджмент ресурсов и персональное развитие цифровых сущностей.

Променял React на C#: осваиваю новые для себя инструменты (AI-Evolution # ?)

Первоначально для проекта я выбрал стек React + Python. Просто потому, что с этими инструментами я хорошо знаком по основной работе. Относительно быстро набросав игровое поле на React + HTML5 Canvas, я подключил Python с NumPy для вычислительного бэкенда, где на чистых матрицах считаются простенькие нейросети. Обмен данными между фронтом и бэком настроил через WebSockets с частотой дважды в секунду. Собрать такой прототип оказалось несложно, даже с учетом того, что с Python до этого я сталкивался только в учебных целях.

Новых кадров с старого проекта все равно нет , поэтому вот козел жует куст)
Новых кадров с старого проекта все равно нет , поэтому вот козел жует куст)

Но что меня сразу напрягло (хотя поначалу я предпочитал об этом не думать): абсолютно любой «чих» физики мира приходилось рассчитывать вручную. Поле зрения агента, тригонометрическая проверка, находится ли каждый конкретный куст в зоне видимости, затем пространственное хэширование ради оптимизации... Не спорю, эти задачи заставили пошевелить мозгами и вспомнить школьную геометрию. Но делать всё это с нуля ради отрисовки обычных кружочков в браузере — откровенный оверхед.

Конечно это шутка) Я осознаю важность и полезность тригонометрии.
Конечно это шутка) Я осознаю важность и полезность тригонометрии.

Вдобавок к багам в собственных математических расчетах началась классическая веб-борьба за производительность интерфейса и Canvas в браузере. Стало очевидно: архитектура «клиент-сервер» для локальной песочницы в реальном времени — это стратегическая ошибка. Спасибо внимательным читателям в комментариях, которые мягко подтолкнули меня к мысли, что проект лучше бы перевести на рельсы полноценного игрового движка.

Играюсь с созданием объектов на Unity.
Играюсь с созданием объектов на Unity.

Опыта в других языках у меня практически нет. Когда-то давно я изучал Java, а от попыток подступиться к C++ до сих пор ловлю «вьетнамские флешбеки» из-за указателей, ссылок и ручного управления памятью. Немного поразмыслив, в качестве нового фундамента я выбрал Unity + C#.

В геймдеве я полный ноль, но, в конце концов, я и занялся этим пет-проектом, чтобы учиться новому, а не повторять то, что уже умею. Почему именно Unity? Как минимум потому, что вся физика твердых тел и коллизии доступны здесь «из коробки». Встроенные лучи (Raycasts) идеально закроют задачу имитации зрения агентов, а независимый рендеринг GUI на базе UI Toolkit (с родным для меня Flexbox) в перспективе избавит от просадок FPS при выводе графиков статистики.

Первые строки кода на C# уже написаны. То, что язык компилируемый, строгий и типизированный — для меня огромный плюс после Python. Ошибки с размерностями матриц теперь ловятся еще до запуска симуляции. Да, встроенных удобных функций для работы с матрицами вроде NumPy тут нет, но простейший хелпер для матричного умножения (DotProduct) пишется за пять минут руками, так что подобные ограничения меня не пугают.

Просто пытаюсь разобраться в новом инструменте.
44