Движение врага по точкам(координатам х, y)

Общие вопросы о Unity3D

Движение врага по точкам(координатам х, y)

Сообщение AlkoTroll 30 дек 2021, 02:27

Добрый день. Помогите пожалуйста. Есть скрипт который спавнит точки и записывает их координаты(x,y) в лист. И есть честно позаимствованный скрипт врага который ходит по клеткам. Но проблема в том что он ходит не только по точкам но и по блокам. Как дать ему понять что нужно ходить рандомно только по координатам из листа? К самой ближней к нему точке и тд, и если точки перед ним 2-4 то выбрать рандомную? Подскажите пожалуйста.

Синтаксис:
Используется csharp
public class EnemyAI : MonoBehaviour
    {
        [SerializeField] private float moveSpeed = 5f;

        Vector3 currentGrid, nextGrid;
        public List<Vector3> gridPositions;
        float startTime, currentTime, totalDistance;
        [SerializeField] private Transform enemySprite;
        bool canMove, isCaged = true;
        WaitForSeconds waitTime = new WaitForSeconds(1f);

        // Start is called before the first frame update
        void Start()
        {

            startTime = Time.time;
            currentGrid = nextGrid = transform.position;
            canMove = CanMove();
            if (canMove == true)
            {
                isCaged = false;
                GetNextGrid();
                totalDistance = Vector3.Distance(currentGrid, nextGrid);
            }
            else
            {
                StartCoroutine(CheckIfCaged());
            }
        }


        // Update is called once per frame
        void Update()
        {
            if (isCaged == false)
                Move();
        }

        bool CanMove()
        {
            gridPositions = new List<Vector3>();

            CheckAvailableDirection(Vector3.up);
            CheckAvailableDirection(Vector3.down);
            CheckAvailableDirection(Vector3.left);
            CheckAvailableDirection(Vector3.right);

            if (gridPositions.Count > 0)
            {
                return true;
            }
            return false;
        }

        void GetNextGrid()
        {
            int val = Random.Range(0, gridPositions.Count);
            nextGrid = gridPositions[val];
        }

        private void CheckAvailableDirection(Vector3 direction)
        {
            Спасите помогите. Понимаю что проверка пути должна быть здесь, но не понимаю как ее организовать(
        }

        void Move()
        {
            if (Vector3.Distance(transform.position, nextGrid) > 0.1f)
            {
                currentTime = Time.time;
                float distanceCovered = (currentTime - startTime) * moveSpeed;
                float fraction = distanceCovered / totalDistance;
                transform.position = Vector3.Lerp(currentGrid, nextGrid, fraction);
            }
            else
            {
                transform.position = nextGrid;
                startTime = Time.time;
                currentGrid = nextGrid;
                canMove = CanMove();
                if (canMove)
                {
                    GetNextGrid();
                    totalDistance = Vector3.Distance(currentGrid, nextGrid);
                }
            }
        }

        IEnumerator CheckIfCaged()
        {
            yield return waitTime;

            if (CanMove())
            {
                isCaged = false;
                yield return null;
            }

            StartCoroutine(CheckIfCaged());
        }

        void LookAT2D(Vector2 startPos, Vector2 endPos)
        {
            Vector2 diff = endPos - startPos;
            float zRot = Mathf.Atan2(diff.y, diff.x) * Mathf.Rad2Deg;
            enemySprite.rotation = Quaternion.Euler(0, zRot + 180, 0);
        }

    }
 
AlkoTroll
UNIт
 
Сообщения: 128
Зарегистрирован: 26 сен 2013, 18:55

Re: Движение врага по точкам(координатам х, y)

Сообщение samana 30 дек 2021, 09:53

Здесь не всё так однозначно.

AlkoTroll писал(а):Но проблема в том что он ходит не только по точкам но и по блокам.

Как это понять? Что такое блоки в вашей игре? Вы о них ничего не рассказали.

Враг должен идти к точкам напролом? Или он должен обходить препятствия?

У вас клеточный мир в игре?
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Движение врага по точкам(координатам х, y)

Сообщение AlkoTroll 30 дек 2021, 10:47

Прошу прощения, об этом не упомянул.
Блоки это обычные GameObject с коллайдерами.
Враг должен двигаться рандомно по (зеленым) точкам и обходить препятствия.
Точки это пустые GameObject, чьи координаты записаны в лист.

Изображение
AlkoTroll
UNIт
 
Сообщения: 128
Зарегистрирован: 26 сен 2013, 18:55

Re: Движение врага по точкам(координатам х, y)

Сообщение samana 30 дек 2021, 11:41

Если вы хотите, чтобы враг целенаправленно двигался от точки А в точку Б на другом конце карты, тогда нужно писать алгоритм поиска пути (в вашем случае подойдёт простой обход графа в ширину, или волновой алгоритм).

Либо вы можете постоянно передвигать врага только на одну случайную ближайшую клетку. Примерно как ездили танчики врагов на 8-bit картриджах.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Движение врага по точкам(координатам х, y)

Сообщение AlkoTroll 30 дек 2021, 12:54

Либо вы можете постоянно передвигать врага только на одну случайную ближайшую клетку. Примерно как ездили танчики врагов на 8-bit картриджах.


Вот мне нужен именно такой вариант)
AlkoTroll
UNIт
 
Сообщения: 128
Зарегистрирован: 26 сен 2013, 18:55

Re: Движение врага по точкам(координатам х, y)

Сообщение DiZZarK2 31 дек 2021, 00:22

AlkoTroll писал(а):Изображение


Вот здесь у вас указан 2мерный массив выбираете нужную точку из 8 прилегающих и отдаете команду на перемещение
Аватара пользователя
DiZZarK2
UNец
 
Сообщения: 42
Зарегистрирован: 03 дек 2021, 10:21

Re: Движение врага по точкам(координатам х, y)

Сообщение AlkoTroll 10 янв 2022, 10:12

Массив есть, но как определить эту самую точку?
AlkoTroll
UNIт
 
Сообщения: 128
Зарегистрирован: 26 сен 2013, 18:55

Re: Движение врага по точкам(координатам х, y)

Сообщение Xtir 10 янв 2022, 10:29

AlkoTroll писал(а):Массив есть, но как определить эту самую точку?

Изображение
Наверное как-то так
Xtir
UNIверсал
 
Сообщения: 498
Зарегистрирован: 21 окт 2016, 00:37

Re: Движение врага по точкам(координатам х, y)

Сообщение AlkoTroll 19 янв 2022, 20:10

Добавил в скрипт спавна точек перебор из листа (нашел на просторах необъятного)

Синтаксис:
Используется csharp
public void AdPoints()
    {
        foreach (GameObject go in list)
        {
            gridArray[(int)transform.position.x, (int)transform.position.y] = go;
            GetObjAtGrid(go.transform.position);
        }
    }

    public GameObject GetObjAtGrid(Vector2 position)
    {
        GameObject obj = null;

        if (gridArray[(int)position.x, (int)position.y])
            obj = gridArray[(int)position.x, (int)position.y];


        return obj;
    }


И в cкрипт врага добавил:
Синтаксис:
Используется csharp
private void CheckAvailableDirection(Vector3 direction)
        {
        GameObject obj = levelService.GetComponent<BlockSpawn>().GetObjAtGrid(transform.position + direction);

        if (obj == null || obj.GetComponent<EnemyAI>() != null)
        {
            gridPositions.Add(transform.position + direction);
        }


Но юнити выдает ошибку IndexOutOfRangeException: Index was outside the bounds of the array. на вот этой строке if (gridArray[(int)position.x, (int)position.y]) в чем может быть проблема?
AlkoTroll
UNIт
 
Сообщения: 128
Зарегистрирован: 26 сен 2013, 18:55

Re: Движение врага по точкам(координатам х, y)

Сообщение MrDmitry 13 фев 2022, 06:05

Для того чтоб AI ходил от точки к точке с обходом блоков(стен, деревьем и прочих препядствий) нужно использовать поиск пути. Вероятно вас вполне устроит стандартныйnavmesh
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21


Вернуться в Общие вопросы

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

Сейчас этот форум просматривают: GoGo.Ru [Bot] и гости: 11