Unity Online Interpolation Lerp闪烁2D Gameobject

时间:2015-02-18 16:53:46

标签: unity3d synchronization interpolation multiplayer flicker

我正在尝试将我的基本游戏放到网上并遇到一些问题。 我跟着this tutorial这是非常好的,一切都有效,但有一点是插值。

没有插值,我有太多的延迟问题(另一个玩家“滞后”很多)。我试着按照教程添加

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:当我使用插值时,它会闪烁很多,但我可以看到位置是正确的,它不像以前那样滞后,所以最好是解决如何进行插值而不是删除它。 / p>

1 个答案:

答案 0 :(得分:0)

首先,不要在FixedUpdate()中使用Time.deltaTime。 FixedUpdate()仅用于物理,实际运行大约50fps。另一方面,Time.deltaTime是最后一帧的时间。所以,从技术上讲,你的lerp函数会闪烁。使用Update()中的函数。我可以看到,你只是在改变立场。那么,为什么要僵尸2D.position?您可以使用transform.position并将整个代码移动到Update()。希望它会有所帮助。