Unity: прокрутите камеру и не переходите на определенную позицию - PullRequest
0 голосов
/ 05 февраля 2019

в моем маленьком платформере у меня есть персонаж, который может прыгать.Если он прыгает достаточно высоко, камера должна следовать за персонажем вверх.Если он недостаточно высок, камера остается на своей оси Y и следует только за игроком через ось X.Я добился этого примерно так:

void FixedUpdate()
{
    float posX = Mathf.SmoothDamp(transform.position.x, player.transform.position.x, ref velocty.x, smoothTimeX);
    float posY = Mathf.SmoothDamp(transform.position.y, (player.transform.position.y + OffSetY), ref velocty.y, smoothTimeY);

    if(player.transform.position.y > heightOfPlayerForCamFollow) // change camera hight only when player has reached certain height level
    {
        transform.position = new Vector3(posX, posY, transform.position.z);
    }
    else
    {
        transform.position = new Vector3(posX, 0, transform.position.z);
    }


}

Однако теперь, когда игрок достиг определенной высоты прыжка, камера прыгает на позицию игрока, а не следует за ним.Просто из-за того, что я даю игрокам позицию Y.Как бы я изменил свой код, чтобы камера следовала, а не телепортировалась к игроку?

Спасибо :)

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Это должно сработать:

void FixedUpdate()
{

    float prevY = transform.position.y;

    float step = followSpeed * Time.deltaTime;  // need to set followSpeed
        transform.position = Vector3.MoveTowards(transform.position, player.transform.position, step));

    if (player.transform.position.y < heightOfPlayerForCamFollow) {
        transform.position = new Vector3(transform.position.x, prevY, transform.position.z);
    }
}
0 голосов
/ 05 февраля 2019

Мне кажется, что лучший способ приблизиться - это переместить условное в другое место.Вы можете установить целевое значение Y на основе if, но затем в любом случае интерполировать, используя smoothdamp, так что оно будет плавно возвращаться к 0 (или какому-либо другому базовому значению)

void FixedUpdate()
{
    float posX = Mathf.SmoothDamp(transform.position.x, player.transform.position.x, ref velocty.x, smoothTimeX);
    float yTarget=0;
    if(player.transform.position.y > heightOfPlayerForCamFollow) 
         yTarget=(player.transform.position.y + OffSetY) 
     else 
        yTarget=0;
    float posY =Mathf.SmoothDamp(transform.position.y, yTarget, ref velocty.y, smoothTimeY);
    transform.position = new Vector3(posX, posY, transform.position.z);


}
0 голосов
/ 05 февраля 2019

Измените transform.position = new Vector3(posX, posY, transform.position.z); на целевую позицию, а не устанавливайте ее в качестве положения камеры.Затем непрерывно LERP позиции Y вашей камеры к этой позиции Y.

Так что в своего рода псевдокоде:

if(camera.pos.y = target.pos.y)
skip
else
camera.pos.y.MoveTowards(target.pos.y, 10%)

https://docs.unity3d.com/ScriptReference/Mathf.Lerp.html обеспечивает хорошую функцию для интерполяции между 2 значениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...