Использование NavMeshAgent через tcp / udp сервер в сочетании с предсказанием клиента? - PullRequest
0 голосов
/ 19 апреля 2020

Я пытался заставить сервер авторизованного игрока перемещаться в единстве с 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);
    }
}

Но это не очень хорошо работает, потому что игрок идет не совсем так и останавливается на поворотах? Есть ли лучшие варианты? Я знаю, что вопрос немного запутанный, но любая помощь будет отличной.

...