Проблема с алгоритмо поиска пути

Программирование на Юнити.

Проблема с алгоритмо поиска пути

Сообщение JustNomad 12 авг 2020, 11:56

Добрый день! Я пытаюсь написать простого бота, который будет находить путь на карте от точки А до точки Б и перемещаться по установленному кратчайшему пути. Весь алгоритм я пытаюсь написать собственноручно, я знаю что есть такие вещи как NavMeshSurface + NavMeshAgent, но мне нужно именно своими руками все реализовать.
Для реализации я выбрал А* алгоритм поиска пути и реализовал его. Была проблема с определением стен на пути, эту проблему я решил путем создания двухмерной сетки и проверкой WallLayout. Как результат, пока, недобот находит кратчайший путь до точки и перемещается туда.
Проблема заключается в неровных поверхностях. Весь алгоритм и построение сетки работает на плоской поверхности, если я добавляю поверность с каким-нибудь наклоном, например любой подъем вверх, то я недогоняю как правильно построить координаты пути.
Пример работы алгоритма:
Скрытый текст:
Изображение
Изображение

Пример неровной поверхности:
Скрытый текст:
Изображение

Скрипт построения сетки:
Скрытый текст:
Синтаксис:
Используется csharp
public class Grid : MonoBehaviour
{
    [SerializeField]
    private Transform StartPosition;
    [SerializeField]
    private LayerMask WallMask;
    [SerializeField]
    private Vector2 vGridWorldSize;
    [SerializeField]
    private float fNodeRadius;
    [SerializeField]
    private float fDistanceBetweenNodes;

    Node[,] NodeArray;
    public List<Node> FinalPath;

    float fNodeDiameter;
    int iGridSizeX, iGridSizeY;


    private void Start&#40;&#41;
    {
        fNodeDiameter = fNodeRadius * 2;
        iGridSizeX = Mathf.RoundToInt&#40;vGridWorldSize.x / fNodeDiameter&#41;;
        iGridSizeY = Mathf.RoundToInt&#40;vGridWorldSize.y / fNodeDiameter&#41;;
        CreateGrid&#40;&#41;;
    }

    void CreateGrid&#40;&#41;
    {
        NodeArray = new Node[iGridSizeX, iGridSizeY];
        Vector3 bottomLeft = transform.position - Vector3.right * vGridWorldSize.x / 2 - Vector3.forward * vGridWorldSize.y / 2;
        for &#40;int x = 0; x < iGridSizeX; x++&#41;
        {
            for &#40;int y = 0; y < iGridSizeY; y++&#41;
            {
                Vector3 worldPoint = bottomLeft + Vector3.right * &#40;x * fNodeDiameter + fNodeRadius&#41; + Vector3.forward * &#40;y * fNodeDiameter + fNodeRadius&#41;;
                bool Wall = true;

                if &#40;Physics.CheckSphere&#40;worldPoint, fNodeRadius, WallMask&#41;&#41;
                {
                    Wall = false;
                }
                NodeArray[x, y] = new Node&#40;Wall, worldPoint, x, y&#41;;
            }
        }
    }
JustNomad
UNец
 
Сообщения: 1
Зарегистрирован: 12 авг 2020, 11:36

Re: Проблема с алгоритмо поиска пути

Сообщение misereli 15 авг 2020, 09:49

Поставить стены вокруг неровности там, где не должен заходить бот.
Unity3d.ru :) Discord worldadmin#5845
Аватара пользователя
misereli
UNITрон
 
Сообщения: 165
Зарегистрирован: 05 мар 2012, 14:13
Откуда: Tver


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7