Unity3D c # 2D игровая камера Follow совершает прыжки

#c# #unity3d #camera

#c# #unity3d #камера

Вопрос:

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

Я даже не могу сказать, совершает ли прыжки камера или объект Player. Но я думаю, что это Камера, потому что возникающие препятствия также совершают прыжки. В чем может быть проблема? Правильно ли я использую метод для камеры?

 public class Player
{
    float speed = 5f;
    void Update()
    {
        transform.Translate(0, speed*Time.deltaTime, 0);
    }
}
 

И это скрипт, который прикреплен к камере:

 public class CameraFollow
{
    private Vector3 FollowVector;
    public Transform Player;
    void LadeUpdate()
    {
        FollowVector = Player.position - new Vector3(0, -4f, 10);
        transform.position = Vector3.Lerp(transform.position, FollowVector, Time.deltaTime * 4f);
    }
 }
 

Ответ №1:

Происходит ли прыжок каждые 4 секунды? Я думаю, что проблема может быть в вашей Vector3.Lerp функции. По сути, это свободное отслеживание камеры, которое занимает 4 секунды ( Time.deltaTime * 4f ), чтобы плавно перейти из точки A в точку B. Каждые 4 секунды он сбрасывает свой путь, отсюда и прыжок. По крайней мере, это моя теория.

Если вы не возражаете, чтобы камера жестко следовала за игроком, я бы просто удалил Lerp и просто установил transform.position значение FollowVector следующим образом:

 void LadeUpdate()
    {
        transform.position = Player.position - new Vector3(0, -4f, 10);
    }
 

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

1. Это решение позволяет камере следовать действительно плавно, однако мне нужен какой-то Lerp, потому что игрок иногда может ускориться на 1 секунду, что заставляет его подняться немного выше, но затем возвращает его в предыдущее положение камеры. Возможно ли использовать функцию Lerp в вашем решении?

2. Единственное, что я могу себе представить на данный момент, это то, что вы останавливаетесь только тогда, когда игрок ускоряется. Возможно, оператор IF, который активирует Lerp на 1 секунду при запуске ускорения, в противном случае по умолчанию используется описанный выше подход.

Ответ №2:

Попробуйте использовать Vector3.MoveTowards

 float step =  speed * Time.deltaTime;
transform.position = Vector3.MoveTowards(transform.position, Player.position - new Vector3(0, -4f, 10f), step);