Заставьте игрока следовать по путевой точке, но при этом иметь возможность контролировать движение игрока

#c# #unity3d #artificial-intelligence

Вопрос:

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

Вот фрагмент кода, который я использую прямо сейчас.

 #region Following the path
     if (PathGenerator.instance.wayPoints.Count > 0)
     {
         Transform currentNode = PathGenerator.instance.wayPoints[currentNodeCount];

         transform.position = Vector3.MoveTowards(transform.position, currentNode.position, forwardSpeed * Time.deltaTime);
         transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(currentNode.position - transform.position), 1 * Time.deltaTime);

         float distance = Vector3.Distance(transform.position, currentNode.position);
         if(distance < 1f)
         {
             if(currentNodeCount < PathGenerator.instance.wayPoints.Count - 1)
             currentNodeCount  ;
         }
     }
     #endregion
 

Но проблема здесь в том, что игрок идет прямо к путевой точке, даже если я перемещаю ее влево и вправо. Он просто вернулся бы в центр путевой точки.
смотрите gif:-

Демонстрационный Gif

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

Может ли кто-нибудь, пожалуйста, направить меня сюда и помочь мне решить мою проблему? Любая помощь или идея будут оценены по достоинству.

Спасибо.

Комментарии:

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

2. Мне очень жаль, но я ничего не понял. Не могли бы вы поподробнее, пожалуйста?

Ответ №1:

Приведенное ниже может быть не лучшим решением этой проблемы, но поможет продвинуться дальше

Вы можете настроить плеер, как показано ниже

Объект игрока со сценарием и персонажем(капсулой) в качестве ребенка, пожалуйста, проверьте изображение ниже

player_heirarchy

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

 void Update()
{
    //made a similar situation from your code
    if (waypoints.Length > 0)
    {
        Transform currentNode = waypoints[currentNodeCount].transform;

        transform.position = Vector3.MoveTowards(transform.position, currentNode.position, 10f * Time.deltaTime);
        transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(currentNode.position - transform.position), 1 * Time.deltaTime);

        float distance = Vector3.Distance(transform.position, currentNode.position);
        if (distance < 1f)
        {
            if (currentNodeCount < waypoints.Length - 1)
                currentNodeCount  ;
        }
    }

    // side movement to child object, in m case it is Player Object's second child
    if (Input.GetKey(KeyCode.LeftArrow))
    {
        transform.GetChild(1).Translate(Vector3.left * 5f * Time.deltaTime);
    }
    else if (Input.GetKey(KeyCode.RightArrow))
    {
        transform.GetChild(1).Translate(Vector3.right * 5f * Time.deltaTime);
    }
}
 

Также прикрепляем выходное видео
Follow_waypoint_along_with_manual_side_movement

P.S. : Это мой первый ответ, пожалуйста, простите, если я не ответил в правильном формате.

Комментарии:

1. Привет, Хирен, большое тебе спасибо за твои подробности и усилия в этом ответе. Это именно тот эффект, который я искал, и решение оказалось настолько простым, чем я думал, что сейчас я чувствую себя глупо. почему я об этом не подумал? :p Большое вам спасибо за вашу помощь и за то, что помогли мне решить эту проблему. Ты потрясающая! <3

2. За возможность ограничить боковое движение вместо Translate того, чтобы делать, например var pos = transform.localPosition; pos.x = 5f * Time.deltaTime; pos.x = Mathf.Clamp(pos.x, minX, maxX); transform.localPosition = pos;