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

Передвижение персонажа между ключевыми точками?

СообщениеДобавлено: 04 фев 2020, 12:13
Anskelann
Здравствуйте форумчане. Прощу прощения за возможно наивный вопрос новичка. Не могу понять каким образом реализовать передвижение персонажа по местности между ключевыми точками по заданным между ними скрытым точкам. Как я понял в Unity нельзя реализовать движение по кривой , лишь от точки до точки. Нужно что бы герой двигался от одной ключевой точки до другой по нажатию (однократно) на нее мышки, по скрытым точкам (дорожке). При этом герой не может останавливаться на скрытых точках, только на ключевых. Также герой должен иметь возможность ходить только на соседние ключевые точки, то есть на те которые соединяет дорожка (как на рисунке).

Я пробовал использовать
[SerializeField] private GameObject[] WayPoints;
private int WayPointId = 0;

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

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

Буду признателен за любую помощь.

Изображение

Re: Передвижение персонажа между ключевыми точками?

СообщениеДобавлено: 04 фев 2020, 12:21
1max1
Погугли про Безье, норм чувак был)) И ассетов на Безье тоже дохера, вот пример для 3д.
http://www.cyberforum.ru/post13554186.html
По поводу твоего случая, скорей всего в каждом главном ноде "красная точка" тебе надо хранить список на соседние и пути к ним, ну а потом дело техники.

Re: Передвижение персонажа между ключевыми точками?

СообщениеДобавлено: 04 фев 2020, 13:23
Friend123
Дык, это же алгоритм поиска пути A*. А вайпоинты в нем сделать с неким enum-статусом (обычная и скрытая), где уже прописать условия, что будет, если остановиться на той или другой точке.

Re: Передвижение персонажа между ключевыми точками?

СообщениеДобавлено: 05 фев 2020, 19:18
Anskelann
Большое спасибо за помощь. Реализовал с помощью NavMesh (надо бы понять отличие его от A*) Получилось сделать без скрытых нодов , вручную огораживая путь стенками (Подскажите стоит ли так делать? (в будущем хочу сделать местность в 3д редакторе, там стенку одним объектом бы сделал)) и ограничил работу NavMesh-а по щелчку по ключевому ноду.(Ниже скрипты, вдруг пригодятся)

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

Такое ощущение что это будет очень тяжело. И я сомневаюсь что эта система заработает на android.

Синтаксис:
Используется csharp
 public class Player : MonoBehaviour
{
    private Camera MainCamera;
    private NavMeshAgent agent;
    public int Go = 0;

    void Start()
    {
        MainCamera = Camera.main;
        agent = GetComponent<NavMeshAgent>();
    }

    void Update()
    {
        if(Go == 1)
        {
            if(Input.GetMouseButtonDown(0))
            {
                RaycastHit hit;
                if(Physics.Raycast(MainCamera.ScreenPointToRay(Input.mousePosition), out hit))
                {
                    agent.SetDestination(hit.point);
                    Go = 0;
                }
            }
        }
    }


Синтаксис:
Используется csharp
public class Point : MonoBehaviour
{
    bool NeedToGo=false;
    public Player Player1;

    void Start()
    {
       

    }

   
    void Update()
    {
       if(NeedToGo)
       {
            Player1.Go = 1;
            NeedToGo=false;
       }
    }

    void OnMouseDown()
    {
        NeedToGo=true;
    }



Изображение

Re: Передвижение персонажа между ключевыми точками?

СообщениеДобавлено: 05 фев 2020, 20:13
1max1
На ключевых точках лепи триггер + скрипт (ниже) + слой "Points".

Синтаксис:
Используется csharp
class Player : MonoBehaviour
{
    // Стартовый поинт,
    // откуда начинает идти игрок
    [SerializeField] Point startPoint;

    Camera mainCamera;
    NavMeshAgent agent;

    void Start()
    {
        mainCamera = Camera.main;
        agent = GetComponent<NavMeshAgent>();
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit hit;
            var ray = mainCamera.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out hit, 1 << LayerMask.NameToLayer("Points")))
            {
                var hitPoint = hit.transform.GetComponent<Point>();

                if (hitPoint.nearPoints.Contains(startPoint))
                {
                    startPoint = hitPoint;

                    agent.SetDestination(hit.transform.position);
                }
            }
        }
    }
}

class Point : MonoBehaviour
{
    // Ближайшие точки,
    // к которым можно попасть из текущей
    // (заполняем в инспекторе)
    public List<Point> nearPoints;
}

Re: Передвижение персонажа между ключевыми точками?

СообщениеДобавлено: 06 фев 2020, 17:57
Anskelann
1max1
Спасибо. Прости не понял как это сделать, вроде и так и так крутил лепил, но логики не уловил. Точнее, я понимаю твой скрипт, что персонаж двигается только по слою "Points"
(Physics.Raycast(ray, out hit, 1 << LayerMask.NameToLayer("Points"))
за счет лучей из камеры
RaycastHit hit;
var ray = mainCamera.ScreenPointToRay(Input.mousePosition);
и при нахождении на каждом ноде "startPoint" он может переходить на ноды в List<Point>.
Но почему этот скрипт надо кидать на ноды, ведь в нем используется novameshagent (Который должен висеть на персонаже, и если этот скрипт висит на ноде то он ни как не взаимодействует с персонажем на котором novameshagent) понять не могу. Не смог разобраться как с этим скриптом взаимодействует тригер, поскольку он никак не связан с персонажем.
Возможно надо было мне додумать и разобраться получше (чем я сейчас и занимаюсь) но если не сложно и будет время намекните как все таки работает это в связке, буду очень благодарен.

Re: Передвижение персонажа между ключевыми точками?

СообщениеДобавлено: 06 фев 2020, 18:46
1max1
Скрипт поинт на ноды, в них заполняешь поля соседних нодов, скрипт игрока на игрока, все просто)) Зачем кидать скрипт игрока на ноды я тоже не знаю))

Re: Передвижение персонажа между ключевыми точками?

СообщениеДобавлено: 07 фев 2020, 13:32
Anskelann
1max1
Спасибо большое. Все сделал, все работает единственно выдает ошибку при клике на другие слои
NullReferenceException: Object reference not set to an instance of an object
Character.Update () (at Assets/Scenes/Assets/Scripts/Character.cs:34)


34. if (hitPoint.nearPoints.Contains(startPoint))

Re: Передвижение персонажа между ключевыми точками?

СообщениеДобавлено: 07 фев 2020, 15:29
1max1
КАК?

if (Physics.Raycast(ray, out hit, 1 << LayerMask.NameToLayer("Points")))

Тут же маска стоит, рейкаст не может попасть по другим слоям ><

Re: Передвижение персонажа между ключевыми точками?

СообщениеДобавлено: 10 фев 2020, 16:20
Anskelann
Имею ввиду при клике на все кроме назначенных нодов выдает такую ошибку

Re: Передвижение персонажа между ключевыми точками?

СообщениеДобавлено: 10 фев 2020, 19:52
1max1
Anskelann писал(а):Имею ввиду при клике на все кроме назначенных нодов выдает такую ошибку

Я это и имею ввиду, что это не возможно. Ты не можешь кликнуть на все, потому что там стоит маска, из-за которой, ты можешь кликать только по нодам. Код дальше первого ифа не пойдет, если слой будет другой, ну либо ты его как-то модифицировал... Или еще вариант, слой Points уже висит не только на нодах, а еще где-то.