Вы говорите нам, что вы хотите, чтобы код делал, это хорошо. Вы также публикуете код, который реализовали для достижения своей цели, это тоже хорошо. Можете ли вы также сказать нам, что не работает, поскольку вы хотите, чтобы это работало в результате этого кода?
Насколько я понимаю, это "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);
}