Поведение камеры - PullRequest
       8

Поведение камеры

0 голосов
/ 31 октября 2018

Этот скрипт камеры предназначен для поворота и просмотра игрока, когда он движется и медленно привязывается к игроку, пока он не движется. (Игрок проходит над Vector3 beforeMoving до того, как он начинает движение). Моя проблема в том, что я хочу «кормить» deltaPosition медленно, чтобы это не было внезапным щелчком, а скорее медленным и плавным переходом, а также прекратить добавление, если оно появилось.

    private void LateUpdate()
{
    if (player.isMoving)
    {
        desiredPosition = player.beforeMoving + offset;
    }
    else
    {
        Vector3 deltaPosition = player.transform.position - player.beforeMoving; 
        desiredPosition += deltaPosition * Time.deltaTime;
    }
    Quaternion camTurnAngle =
    Quaternion.AngleAxis(input * rotationSpeed, Vector3.up);
    desiredPosition = camTurnAngle * desiredPosition;
    transform.position = Vector3.Slerp(transform.position, desiredPosition, smoothFactor);
    transform.LookAt(player.transform);
}

Редактировать: Я думал, что поделюсь окончательным кодом.

    private void LateUpdate()
{
    Quaternion rotation = Quaternion.Euler(GetDegree(), input.x * rotationSpeed, 0f);
    if (player.isMoving)
    {
        desiredPosition = player.beforeMoving + offset;
        CalculatePanTime();
    }
    else if (!player.isMoving)
    {
        desiredPosition = player.transform.position + offset;
    }
    transform.position = Vector3.Slerp(transform.position, rotation * desiredPosition, GetSpeed());
    transform.LookAt(player.transform);
}

private void CalculatePanTime()
{
    stoppedTime = Time.time;
    playerDelta = Vector3.Distance(player.transform.position, player.beforeMoving);
    timeToPan = (playerDelta / snappingSpeed) * Time.deltaTime;
}

private float GetSpeed()
{
    if (Time.time < stoppedTime + timeToPan)
    {
        controlsDisabled = true; return snappingSpeed;
    }
    else
    {
        controlsDisabled = false; return smoothSpeed;
    }
}

1 Ответ

0 голосов
/ 31 октября 2018

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

Насколько я понимаю, это "Vector3 deltaPosition = player.transform.position - player.beforeMoving; requiredPosition + = deltaPosition * Time.deltaTime; "не ведет себя так, как вы ожидаете, чтобы

возможно попробуйте что-то вроде этого:

private void LateUpdate()
{
    // snap the rotation center slowly to the player's position if not moving, or player's position before he started moving
    desiredPosition = Vector3.Lerp(desiredPosition, player.beforeMoving, 0.1f);

    // rotate around rotation center
    Quaternion camTurnAngle = Quaternion.AngleAxis(rotationSpeed * Time.time, Vector3.up);      
    desiredPosition += camTurnAngle * offset;

    // set the position to rotate around rotation center, and look towards player
    transform.position = Vector3.Lerp(transform.position, desiredPosition, smoothFactor);
    transform.LookAt(player.transform);
}

проблема с вашим кодом в том, что вы перегружены. Если вы хотите реализовать что-то, что решает, как быстро камера снимает, или сколько времени нужно, чтобы сделать снимок, попробуйте ввести float player.timeStopMoving = Time.time, который вы можете использовать для правильного вычисления коррекции положения, когда он не движется .

if(player.isMoving)
{
    desiredPosition = player.beforeMoving;
}
else
{
    const float timeNeededToSnap = 2f;
    // or float timeNeededToSnap = (player.transform.position - player.beforeMoving).magnitude; // (which you could compute only once in player script, when he stops moving, and then reuse the value instead of performing a ".magnitude" every frame)
    if(Time.time < player.timeStopMoving + timeNeededToSnap)
    {
        desiredPosition = Vector3.Lerp(desiredPosition, player.transform.position, (Time.time - player.timeStopMoving) / timeNeededToSnap);
    }
    else
    {
        // an other problem here is: if the player starts moving AGAIN before your desiredPosition got the value, do you want desired position to glich to the new player.beforeMoving?...
        desiredPosition = player.transform.position;
    }
}

РЕДАКТИРОВАТЬ:

Чтобы сделать его менее линейным, вы можете использовать:

if(Time.time < player.timeStopMoving + timeNeededToSnap)
{
    var t = Mathf.Cos(Maths.Pi * 0.5f * (Time.time - player.timeStopMoving) / timeNeededToSnap); // as timeDelta/totalTime goes from 0->1, multiply it by Pi/2 and the Cos will also go from 0->1 but with a smoothing speed
    desiredPosition = Vector3.Lerp(desiredPosition, player.transform.position, t);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...