Я бы сделал это с помощью какого-то решения дерева поведения - вы идете к цели и принимаете к сведению все препятствия, которые блокировали ваш A *. Если вы терпите неудачу, вы проверяете, есть ли объекты, которые могут помочь преодолеть эти препятствия, в этом случае путь к этому объекту. Повторение. Это означает, что агент должен попытаться найти путь к цели и потерпеть неудачу, прежде чем получить представление об использовании инструментов, хотя это может занять время, особенно если существует огромный мир плиток, которые необходимо проверить. Может показаться неуместным, что агенту нужно время, чтобы подумать, как решить проблему.
Однако я могу представить себе реальное, хардкорное решение. Добавьте другое измерение в вашу сетку поиска пути. Таким образом, в случае 2D-карты вы делаете сетку для поиска пути 3D. В этом простом примере это новое измерение будет иметь только глубину два, но в реальной игре оно быстро увеличится.
При z = 0 вы отображаете местность в обычных условиях, что означает, что водные плитки считаются непроходимыми.
При z = 1 вы отображаете местность в том виде, в котором она есть, имея грабли, что означает, что водяные плитки считаются пригодными для ходьбы (но если у вас есть, например, настенные плитки, они могут оставаться сплошными).
Нахождение пути - это обычный A * в измерениях x и y, означающий, что каждая ячейка сетки имеет доступ к своим соседям. В измерении z, однако, A * не допускается распространение.
Кроме того, где грабли. Грабли объект действует как отверстие между z = 0 и z = 1 в сетке поиска пути.
Это означает, что A * будет заполнять заливку в z = 0, попадать в воду и заканчиваться без вариантов - тогда он будет распространяться до z = 1 через грабли, и в z = 1 (где вода проходима) найти свой путь к цели. В результате NPC без колебаний перемещается к рейку, а затем перемещается по кратчайшему пути к цели.