离线制作多人游戏原型,当我点击网格时会崩溃。有谁能说出原因?

时间:2015-04-20 04:35:16

标签: c# unity3d multiplayer

因此,在我实施服务器之前,我试图让这款游戏正常工作,而且我已经获得了大部分积极的结果。然而,当玩家遇到对手时会出现一个有趣的情况。它会口吃半秒钟,除非我及时拉回来,否则它会冻结。我使用武力移动,这可能是造成这种情况的原因。但是,我有一个明确的理由。

雅虎游戏网络是我对多人游戏的基本服务,因为它让我为服务器编写C#.dll并管理事物。

void FixedUpdate () {

    RunTime = GetTime();

    mInput.y = Input.GetAxis("Vertical");
    mInput.x = Input.GetAxis("Horizontal");

    if (Ready)
    {
        SelfTick(RunTime);
        UpdatePlayerInput();
        foreach (KeyValuePair<int, PlayerController> Target in Targets)
        {

        }
    }   
}

void SelfTick(int T)
{
    Player.FixedStep(T);
}

void UpdatePlayerInput()
{
    if (mInput.x != 0 || mInput.y != 0)
    {
        Player.UpdateInput(mInput);

        // Send Connection Data Here //
    }
}

此代码运行主循环,在第一个播放器上连接到此循环。其他人都在foreach循环检查中运行,该检查发送相应的命令:

public void FixedStep(int _T)
{
    if (LastTimeStep == 0)
    {
        LastTimeStep = _T;
    }

    int Offset = System.Math.Min(_T - LastTimeStep, 1000);

    for (int i = 0; i < Offset; i++)
    {

        Vector3 actionPoint = transform.position + transform.TransformDirection(buoyancyCentreOffset);
        float forceFactor = 1f - ((actionPoint.y - waterLevel) / floatHeight);

        if (forceFactor > 0f)
        {
            Vector3 uplift = -Physics.gravity * (forceFactor - GetComponent<Rigidbody>().velocity.y * bounceDamp);
            rigidBody.AddForceAtPosition(uplift, actionPoint);
        }

        rigidBody.AddRelativeForce(0f, 0f, mInput.y * Speed);
        rigidBody.AddRelativeTorque(0f, mInput.x * TurnSpeed, 0f);
    }

    LastTimeStep = _T;

    Debug.Log(rigidBody.velocity);
}

我能够在一个崩溃实例中看到一个调试错误,它指出施加的力太高 - 无限。大多数情况下,当它崩溃时,它会崩溃而没有错误。这是我的时间码:

public int GetTime()
{
    System.DateTime EpochStart = new System.DateTime(1970, 1, 1, 0, 0, 0, System.DateTimeKind.Utc);
    int Current_Time = (int)(System.DateTime.UtcNow - EpochStart).TotalMilliseconds;
    return Current_Time;
}

有人可以提供任何建议吗?我使用Unity3D作为我的主要游戏开发IDE,使用Visual Studio而不是MonoDevelop。

1 个答案:

答案 0 :(得分:0)

为您的提升变量设置最小和最大限制...以使其保持在范围内并查看它是否会停止崩溃。在AddForceAtPosition之前在其上设置CLAMP函数。

赖安