Страница 1 из 1

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

СообщениеДобавлено: 28 июл 2019, 22:01
MrDmitry
Здравствуйте, подскажите как можно реализовать бота, для 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;

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

СообщениеДобавлено: 29 июл 2019, 14:11
MrDmitry
Ни кто не может дать дельный совет или кинуть какую-то ссылку на полезный вариант по этой теме?(

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

СообщениеДобавлено: 29 июл 2019, 14:23
waruiyume
В [unity 3D] есть встроенный поиск пути.

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

СообщениеДобавлено: 29 июл 2019, 19:39
MrDmitry
Вы не могли бы хотя бы намекнуть как он называется? Или вы про NavMesh? Так он вроде только для 3D

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

СообщениеДобавлено: 29 июл 2019, 20:08
waruiyume
https://forum.unity.com/threads/2d-navm ... st-3792835
Судя по толщине ветки это чуть сложнее чем я думал, но как видно осуществимо.

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

СообщениеДобавлено: 31 июл 2019, 19:28
MrDmitry
Огромное спасибо за ссылку, помучился пару дней, но в итоге разобрался и все работает как надо! )

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

СообщениеДобавлено: 30 ноя 2019, 07:10
MrDmitry
Спустя долгое время подниму тему еще раз. Собственно как и писал выше разобрался с тем как настроить поиск пути при помощи 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;

Без этой строчки, боты идут на игрока упираются в него и все равно продолжают двигаться в игрока уперевшись.

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

СообщениеДобавлено: 02 дек 2019, 14:02
MrDmitry
Ну помогите осуществить задуманное, реально сам не к чему прийти не могу. Может быть стоит отказаться от NavMash и использовать что то другое?

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

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

Это вообще-то вектор, и обнуляется он как вектор.
rb.velocity = Vector2.zero;

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

СообщениеДобавлено: 02 дек 2019, 18:58
MrDmitry
Ох извиняюсь, привел не верный код (((

Синтаксис:
Используется 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;
        }
}


Вот с таким кодом, боты идут к игроку упираются в него и продолжают стремится к точке, которая по всей видимости находится по центру игрока...

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

СообщениеДобавлено: 02 дек 2019, 19:41
1max1
Синтаксис:
Используется csharp
// void start
agent.stoppingDistance = 5.0f;

Это не работает?

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

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

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

Изображение

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

СообщениеДобавлено: 03 дек 2019, 10:17
1max1
с данной командой боты начинают упираться друг в друга стремясь подойти к заданной точке

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

https://docs.unity3d.com/ScriptReferenc ... opped.html
https://docs.unity3d.com/ScriptReferenc ... tatus.html