У меня есть физическое гребное устройство, которое постоянно отправляет оставшуюся дистанцию своей гребной гонки в Unity (то есть 350 м осталось для завершения гонки). Когда я пытаюсь соответствующим образом обновить позицию своего игрока (только по оси Z), движение меняется.
Как я могу интерполировать такие движения, чтобы они были более плавными?
Моя первая попытка выглядела так:
void Update()
{
player.position = new Vector3(player.position.x, player.position.y,
pm5.Pm5_distance);
}
Это привело к прерывистому движению, возможно потому, что игрок просто телепортировался на следующую позицию.
Далее я попытался перейти на следующую позицию, но я не уверен, правильно ли я это сделал или это работает вообще, поскольку мой игрок получает новую позицию в каждом кадре:
private float startTime;
private float journeyLength;
public float speed = 5.0F;
void Start()
{
startTime = Time.time;
}
void Update()
{
if (player.position != new Vector3(player.position.x,
player.position.y, pm5.Pm5_distance))
{
journeyLength = Vector3.Distance(player.position, new
Vector3(player.position.x, player.position.y, pm5.Pm5_distance));
float distCovered = (Time.time - startTime) * speed;
float fracJourney = distCovered / journeyLength;
transform.position = Vector3.Lerp(player.position, new
Vector3(player.position.x, player.position.y, pm5.Pm5_distance),
fracJourney);
}
}
Несмотря на то, что это не приводит к ошибкам, похоже, это не решает и мою проблему. Может быть, вся концепция неверна? Я был бы рад, если бы кто-нибудь мог помочь мне здесь.
ИЗМЕНИТЬ 25.04.19:
После попытки с кодом моего Дэвида я приземлился здесь:
void Update()
{
if (useLerpMovementModel)
{
float newDistance = pm5.Pm5_distance;
if (player.position.z != newDistance)
{
// Distance moved
float distCovered = journeyLength - pm5.Pm5_distance;
// Fraction of journey completed = current distance divided by total distance.
float fracJourney = distCovered / journeyLength;
// Set our position as a fraction of the distance between the markers.
transform.position = Vector3.Lerp(player.position, new Vector3(player.position.x, player.position.y, newDistance), fracJourney);
}
}
else
{
player.position = new Vector3(player.position.x, player.position.y, journeyLength - pm5.Pm5_distance);
}
}
Я не уверен, что это вообще что-то делает, хотя с точки зрения сглаживания движения по сравнению с player.position = new Vector3(player.position.x, player.position.y, journeyLength - pm5.Pm5_distance);