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

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

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

Сообщение Anskelann 04 фев 2020, 12:13

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

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

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

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

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

Изображение
Anskelann
UNец
 
Сообщения: 5
Зарегистрирован: 04 фев 2020, 11:15

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

Сообщение 1max1 04 фев 2020, 12:21

Погугли про Безье, норм чувак был)) И ассетов на Безье тоже дохера, вот пример для 3д.
http://www.cyberforum.ru/post13554186.html
По поводу твоего случая, скорей всего в каждом главном ноде "красная точка" тебе надо хранить список на соседние и пути к ним, ну а потом дело техники.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

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

Сообщение Friend123 04 фев 2020, 13:23

Дык, это же алгоритм поиска пути A*. А вайпоинты в нем сделать с неким enum-статусом (обычная и скрытая), где уже прописать условия, что будет, если остановиться на той или другой точке.
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

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

Сообщение Anskelann 05 фев 2020, 19:18

Большое спасибо за помощь. Реализовал с помощью 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;
    }



Изображение
Anskelann
UNец
 
Сообщения: 5
Зарегистрирован: 04 фев 2020, 11:15

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

Сообщение 1max1 05 фев 2020, 20:13

На ключевых точках лепи триггер + скрипт (ниже) + слой "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;
}
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

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

Сообщение Anskelann 06 фев 2020, 17:57

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

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

Сообщение 1max1 06 фев 2020, 18:46

Скрипт поинт на ноды, в них заполняешь поля соседних нодов, скрипт игрока на игрока, все просто)) Зачем кидать скрипт игрока на ноды я тоже не знаю))
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

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

Сообщение Anskelann 07 фев 2020, 13:32

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))
Anskelann
UNец
 
Сообщения: 5
Зарегистрирован: 04 фев 2020, 11:15

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

Сообщение 1max1 07 фев 2020, 15:29

КАК?

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

Тут же маска стоит, рейкаст не может попасть по другим слоям ><
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

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

Сообщение Anskelann 10 фев 2020, 16:20

Имею ввиду при клике на все кроме назначенных нодов выдает такую ошибку
Anskelann
UNец
 
Сообщения: 5
Зарегистрирован: 04 фев 2020, 11:15

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

Сообщение 1max1 10 фев 2020, 19:52

Anskelann писал(а):Имею ввиду при клике на все кроме назначенных нодов выдает такую ошибку

Я это и имею ввиду, что это не возможно. Ты не можешь кликнуть на все, потому что там стоит маска, из-за которой, ты можешь кликать только по нодам. Код дальше первого ифа не пойдет, если слой будет другой, ну либо ты его как-то модифицировал... Или еще вариант, слой Points уже висит не только на нодах, а еще где-то.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51


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

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

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