Vector3.Lerp выполняет только первую линейную интерполяцию

avatar
Wil Prim
8 апреля 2018 в 03:44
129
1
-1

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

Вот сценарий Game master, который проверяет ввод пользователя и передает его Player controller, который выполняет Lerp:

Мастер игры:

void Update ()
{
    if (gameIsRunning)
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            //Go Left
            player.MovePlayer("left");
        }
        else if (Input.GetKeyDown(KeyCode.D))
        {
            //Go Right
            player.MovePlayer("right");
        }

        //Only run this if the game is running...
        if (player.Lives <= 0)
        {
            gameIsRunning = false;
        }
    }
}

Контроллер игрока:

public void MovePlayer (string dir)
{
    if (dir == "left")
    {
        if (currentPosition == Position.Left)
        {
            //Do Nothing!
            return;
        }

        if (currentPosition == Position.Middle)
        {
            transform.position = Vector3.Lerp(middlePos.position, leftPos.position, .5f);
            currentPosition = Position.Left;
        }

        if (currentPosition == Position.Right)
        {
            transform.position = Vector3.Lerp(rightPos.position, middlePos.position, .5f);
            currentPosition = Position.Middle;
        }
    }

    if (dir == "right")
    {
        if (currentPosition == Position.Right)
        {
            //Do Nothing!
            return;
        }

        if (currentPosition == Position.Middle)
        {
            transform.position = Vector3.Lerp(transform.position, rightPos.position, .5f);
            currentPosition = Position.Right;
        }

        if (currentPosition == Position.Left)
        {
            transform.position = Vector3.Lerp(transform.position, middlePos.position, .5f);
            currentPosition = Position.Middle;
        }
    }
}

Снимок экрана:

enter image description here

Почему это происходит?

Источник

Ответы (1)

avatar
Jinjinov
11 апреля 2018 в 11:34
0

lerp должен вызываться с изменяющимся параметром. попробуйте что-то вроде:

Контроллер игрока:

enum Direction
{
    Left,
    Right
}

Direction moveDir;
float progress;

public void MovePlayer (Direction dir)
{
    moveDir = dir;
    progress = 0.0f;
}

public void Update()
{
    switch(dir)
    {
        case Direction.Left:
        if (currentPosition == Position.Middle)
        {
            transform.position = Vector3.Lerp(middlePos.position, leftPos.position, progress);
            if(progress >= 1.0f)
                currentPosition = Position.Left;
            else
                progress += 0.1f; // change as necessary
        }

        if (currentPosition == Position.Right)
        {
            transform.position = Vector3.Lerp(rightPos.position, middlePos.position, progress);
            if(progress >= 1.0f)
                currentPosition = Position.Middle;
            else
                progress += 0.1f; // change as necessary
        }
        break;
        case Direction.Right:
        // ...
        break;
    }
}