【问题标题】:Unity Online Interpolation Lerp Flickering 2D GameobjectUnity Online Interpolation Lerp 闪烁 2D 游戏对象
【发布时间】:2015-02-19 05:31:07
【问题描述】:

我正在尝试让我的基本游戏上线,但遇到了一些问题。 我关注了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

PPS:当我使用插值时,它闪烁很多,但我可以看到位置是正确的,它不像以前那样滞后,所以最好解决如何进行插值而不是删除它。

【问题讨论】:

    标签: unity3d synchronization interpolation multiplayer flicker


    【解决方案1】:

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

    【讨论】:

    • 我试图将 lerp 插值放在 Update() 中,但它确实改变了一些东西。使用 transform 或 rigibody2D 也没有改变。还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多