0

Я пытаюсь получить основную игру онлайн и попал в некоторые проблемы. Я следовал this tutorial, который действительно хорош, и все работает, но одно, интерполяция.Unity Online Interpolation Lerp Мерцание 2D Gameobject

Без интерполяции у меня слишком много проблем с задержкой (другой игрок «сильно отстает»). Я пытался следовать учебник, добавив

void FixedUpdate() 
{ 
    if (networkView.isMine) 
    else{ 
     syncTime += Time.deltaTime; 
     rigidbody2D.position = Vector3.Lerp(syncStartPosition, syncEndPosition, syncTime/syncDelay); 
    } 

И с помощью этого метода:

void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info) 
{ 
    Vector3 syncPosition = Vector3.zero; 
    if (stream.isWriting) 
    { 
     syncPosition = rigidbody2D.position; 
     stream.Serialize(ref syncPosition); 
    } 
    else 
    { 
     stream.Serialize(ref syncPosition); 

     syncTime = 0f; 
     syncDelay = Time.time - lastSynchronizationTime; 
     lastSynchronizationTime = Time.time; 

     syncStartPosition = rigidbody2D.position; 
     syncEndPosition = syncPosition; 
    } 
} 

Но теперь другой игрок невидим, когда не движется, и виден, но мерцающий много при движении (мерцающий так я почти не вижу этого). Так как мой метод вызывается из FixedUpdate, мне интересно, просто ли в этом игровом объекте так много освежает, что я его даже не вижу. Это возможно?

В любом случае, есть ли у вас идея о том, как исправить это?

Благодарим вас за помощь!

PS: Я пытался залезть только в том случае, если syncTime/syncDelay < 1.0, чтобы убедиться, что я не экстраполирую, но это ничего не изменило.

PPS: Когда я использую интерполяцию, он мерцает много, но я вижу, что позиция правильная, она не отстает, как раньше, поэтому лучше всего было бы решить, как сделать мою интерполяцию, а не удалять ее.

ответ

0

Прежде всего, не используйте Time.deltaTime в FixedUpdate(). FixedUpdate() предназначен только для физики и фактически работает около 50 кадров в секунду. С другой стороны Time.deltaTime - это время для последнего кадра. Итак, технически вы будете мерцать в своей функции lerp. Используйте функцию в Update(). И я вижу, вы просто меняете позиции. Итак, зачем жестко? вы можете использовать transform.position и переместить все коды в Update(). Надеюсь, это поможет.

+0

Я попытался поместить интерполяцию lerp в Update(), но это изменило вещь. Использование transform или rigibody2D ничего не изменило. Спасибо, в любом случае. –

Смежные вопросы