Добавлено: Вс Мая 02, 2021 10:11
Заголовок сообщения:
Так, ну надо что-то рассказать, расскажу о нахождении путей.
Проблема была из-за большого количества коллизий и пересечения путей. Изначально я сделал строгое ограничение, что юниты не могут наезжать друг на друга. Но из-за постоянно меняющейся обстановки пути надо было пересчитывать для каждого юнита (это медленно), а когда юниты-таки друг на друга наезжали или застревали в узких проходах, выйти из блокировки они уже не могли, и если я чинил в одном месте, ломалось в другом. Сценариев "застревания" было слишком много, и придумать решение, которое исправляло всё, но ничего не ломало, казалось невозможно.
В итоге решение таково, что генерируется поле, которое от всех точек карты ведет в целевую, как воронка. Все юниты двигаются строго к нему, невзирая на препятствия и других челиков, т.е. наезжая друг на друга. Чтобы не было склеивания юнитов, я ввожу силы оттакливания, т.е. они если близко подходят, отталкиваются друг от друга, как резинки. Иначе говоря, заменяю жесткое ограничение мягким. Я представил себе желаемое поведение - это поток юнитов, которые идут к цели как горстка резиновых - мягких, но упругих - шариков, сплавляющихся по реке, и физику движения написал в соответствии с такой концепцией.
Препятствия это такие же, по сути, отталкивающие штуки. Кроме того, юниты создают такие же "воронки" для вражеских юнитов, т.е. есть второе поле, которое "тянет" юнита к врагам.
Из плюсов, эти "поля" общие для всех юнитов одной команды, что сокращает расчеты в N раз.
Вот визуализация общего поля
Сейчас готовлю код, чтобы можно было больше действий давать одному юниту (не только ходить и бить вплотную). Каждое действие имеет метод оценки эффективности, и юнит имеет список доступных действий, каждое из которых оценивает свою эффективность, и выбирается лучшее.