Я пытался заставить сервер авторизованного игрока перемещаться в единстве с NavMeshAgent. Я отправляю точку на сервер, сервер устанавливает пункт назначения из navmeshagent. Затем сервер отправляет позицию от игрока + следующий угол от NavMeshAgent + оставшееся время для этого расстояния клиенту обратно:
float remainingTime = Vector3.Distance(agent.path.corners[1], transform.position) / agent.speed;
ServerSend.troopMove(transform.position, agent.path.corners[1], remainingTime);
На клиенте я пытаюсь сделать движение плавным. Так я У меня есть две функции. В функции FixedUpdate я пытаюсь плавно пройти между этими двумя точками.
public void PredictState( float time, Vector3 position, Vector3 nextDestination, float _timeRemaining)
{
if(Vector3.Distance(transform.position, position) >= 1f)
{
transform.position = position;
}
//TODO check if position is right
if (lastTime != 0f)
{
latency = time - lastTime;
}
lastTime = time;
nextPosition = nextDestination;
lastPosition = transform.position;
timeRemaining = _timeRemaining;
t = 0f;
}
private void FixedUpdate()
{
if (isWalking && isSelected && timeRemaining != 0f)
{
t += Time.fixedDeltaTime / (timeRemaining - latency);
transform.position = Vector3.Lerp(lastPosition, nextPosition, t);
}
}
Но это не очень хорошо работает, потому что игрок идет не совсем так и останавливается на поворотах? Есть ли лучшие варианты? Я знаю, что вопрос немного запутанный, но любая помощь будет отличной.