因此,在我实施服务器之前,我试图让这款游戏正常工作,而且我已经获得了大部分积极的结果。然而,当玩家遇到对手时会出现一个有趣的情况。它会口吃半秒钟,除非我及时拉回来,否则它会冻结。我使用武力移动,这可能是造成这种情况的原因。但是,我有一个明确的理由。
雅虎游戏网络是我对多人游戏的基本服务,因为它让我为服务器编写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。
答案 0 :(得分:0)
为您的提升变量设置最小和最大限制...以使其保持在范围内并查看它是否会停止崩溃。在AddForceAtPosition之前在其上设置CLAMP函数。
赖安