следование за игроком и обход препятсвий в 2d

Форум для всего, что связано с ИИ.

следование за игроком и обход препятсвий в 2d

Сообщение MrDmitry 28 июл 2019, 22:01

Здравствуйте, подскажите как можно реализовать бота, для 2д игры с видом сверху, который следовал бы за игроком и при этом обходил препятсвия? Много читал в интернете на эту тему, знаю про алгоритмы A* или алгоритм дейкста. Но для их использования требуется создать матрицу, на основе игровой карты, в которой будут указаны веса и возможные пути. Тогда вопрос, как сделать матрицу по карте? A* Pathfinding Project - но для моей простой игры он слишком сложный да и хотелось бы самому разобраться в вопросе.

Сейчас бот идет за игроком но если между ним и игроком стена он упирается в нее(что естественно из кода)
Синтаксис:
Используется csharp
Vector3 vectorToTarget = player.transform.position - transform.position;
            float angle = Mathf.Atan2(vectorToTarget.y, vectorToTarget.x) * Mathf.Rad2Deg;
            Quaternion q = Quaternion.AngleAxis(angle, Vector3.forward);
            transform.rotation = Quaternion.Slerp(transform.rotation, q, Time.deltaTime * rSpeed);

            Vector3 dir = player.transform.position - gameObject.transform.position;
            gameObject.transform.position += dir.normalized * speed * Time.deltaTime;
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21

Re: следование за игроком и обход препятсвий в 2d

Сообщение MrDmitry 29 июл 2019, 14:11

Ни кто не может дать дельный совет или кинуть какую-то ссылку на полезный вариант по этой теме?(
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21

Re: следование за игроком и обход препятсвий в 2d

Сообщение waruiyume 29 июл 2019, 14:23

В [unity 3D] есть встроенный поиск пути.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: следование за игроком и обход препятсвий в 2d

Сообщение MrDmitry 29 июл 2019, 19:39

Вы не могли бы хотя бы намекнуть как он называется? Или вы про NavMesh? Так он вроде только для 3D
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21

Re: следование за игроком и обход препятсвий в 2d

Сообщение waruiyume 29 июл 2019, 20:08

https://forum.unity.com/threads/2d-navm ... st-3792835
Судя по толщине ветки это чуть сложнее чем я думал, но как видно осуществимо.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: следование за игроком и обход препятсвий в 2d

Сообщение MrDmitry 31 июл 2019, 19:28

Огромное спасибо за ссылку, помучился пару дней, но в итоге разобрался и все работает как надо! )
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21

Re: следование за игроком и обход препятсвий в 2d

Сообщение MrDmitry 30 ноя 2019, 07:10

Спустя долгое время подниму тему еще раз. Собственно как и писал выше разобрался с тем как настроить поиск пути при помощи NavMesh в 2D при помощи привиденных ссылок. Теперь задача несколько другая, нужно чтоб за игроком следовало куча ботом, но при этом держались всегда на на большой дистанции от игрока, при этом эта куча не должна упираться друг в друга.


Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class BotControl : MonoBehaviour
{
    public float TargetDist = 2;
    public static Transform MainPlayer;
    private NavMeshAgent agent;
    private Rigidbody2D rb;
    private Animator anim;

    void Start()
    {
        anim = GetComponent<Animator>();
        MainPlayer = Spawn.Player.transform;

        agent = GetComponent<NavMeshAgent>();
        agent.updateRotation = false;
        agent.updateUpAxis = false;
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        if (GetDistance(MainPlayer))
        {
            anim.SetBool("Move", true);
            agent.SetDestination(MainPlayer.position);
            transform.up = agent.velocity;
        }
        else
        {
            anim.SetBool("Move", false);
            rb.velocity = 0;
        }
    }

        private bool GetDistance(Transform target)
        {
        if (Vector3.Distance(target.position, transform.position) <= TargetDist)
            return true;
        else
            return false;
        }
}


В этом коде я получаю ошибку на строке
Синтаксис:
Используется csharp
rb.velocity = 0;

Без этой строчки, боты идут на игрока упираются в него и все равно продолжают двигаться в игрока уперевшись.
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21

Re: следование за игроком и обход препятсвий в 2d

Сообщение MrDmitry 02 дек 2019, 14:02

Ну помогите осуществить задуманное, реально сам не к чему прийти не могу. Может быть стоит отказаться от NavMash и использовать что то другое?
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21

Re: следование за игроком и обход препятсвий в 2d

Сообщение 1max1 02 дек 2019, 14:10

https://docs.unity3d.com/ScriptReferenc ... tance.html
rb.velocity = 0;
Без этой строчки, боты идут на игрока упираются в него и все равно продолжают двигаться в игрока уперевшись.

Это вообще-то вектор, и обнуляется он как вектор.
rb.velocity = Vector2.zero;
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: следование за игроком и обход препятсвий в 2d

Сообщение MrDmitry 02 дек 2019, 18:58

Ох извиняюсь, привел не верный код (((

Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class BotControl : MonoBehaviour
{
    public float TargetDist = 2;
    public static Transform MainPlayer;
    private NavMeshAgent agent;
    private Rigidbody2D rb;
    private Animator anim;

    void Start()
    {
        anim = GetComponent<Animator>();
        MainPlayer = Spawn.Player.transform;

        agent = GetComponent<NavMeshAgent>();
        agent.updateRotation = false;
        agent.updateUpAxis = false;
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
            anim.SetBool("Move", true);
            agent.SetDestination(MainPlayer.position);
            transform.up = agent.velocity;
    }

        private bool GetDistance(Transform target,float dist)
        {
        if (Vector3.Distance(target.position, transform.position) > dist)
            return true;
        else
            return false;
        }
}


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

Re: следование за игроком и обход препятсвий в 2d

Сообщение 1max1 02 дек 2019, 19:41

Синтаксис:
Используется csharp
// void start
agent.stoppingDistance = 5.0f;

Это не работает?
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: следование за игроком и обход препятсвий в 2d

Сообщение MrDmitry 03 дек 2019, 06:52

Спасибо за ваш ответ. Это почти то что надо, но нужно доделывать. Дело в том что на сцене может быть несколько ботов(пока 7) которые будут следовать за игроком, с данной командой боты начинают упираться друг в друга стремясь подойти к заданной точке. Так же при достижении игрока, у ботом остается анимация ходьбы(как проверять что бот остановился?) и бота разворачивает в сторону как он был поставлен изначально.

PS боты и игрок спаунятся скриптом.

Изображение
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21

Re: следование за игроком и обход препятсвий в 2d

Сообщение 1max1 03 дек 2019, 10:17

с данной командой боты начинают упираться друг в друга стремясь подойти к заданной точке

В 3д это делалось obstacle`ами.
как проверять что бот остановился?

https://docs.unity3d.com/ScriptReferenc ... opped.html
https://docs.unity3d.com/ScriptReferenc ... tatus.html
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51


Вернуться в Искуственный Интеллект

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

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