我正在创建一个简单的多人游戏(服务器权威),我需要能够将所有玩家位置发送给所有玩家
因此,只要有一位玩家移动,我都会这样做
private void SendPositions()
{
foreach (var item in ActiveUser.activeUsers)
{
foreach (var i in ActiveUser.activeUsers)
{
Net_OnMovement om = new Net_OnMovement();
ActiveUser user = i.Value;
om.username = user.username;
Debug.Log(om.username);
om.x = user.position[0];
om.y = user.position[1];
SendClient(item.Value.channelId, item.Value.connId, om);
}
}
}
首先,我更新玩家位置,然后将所有位置发送给所有玩家(在这里您只能看到全部发送给所有玩家)在客户端上,当用户名等于客户端的用户名时,我移动用户,否则我移动“ otherPlayer(s)”当只有一个播放器时,效果很好,但是在连接另一个播放器后,一切都会延迟很多,而且反应迟钝。这种发送数据的方式有问题吗?还是应该在其他地方查找错误
编辑
*玩家实际上在按下按钮后立即开始移动,但是移动缓慢,并且在释放按钮后它会继续移动很长时间(我握住的时间越长,移动后就保持移动的时间越长)-这实际上意味着服务器无法处理我猜的速度?
发生的情况是,作为一名玩家,您正在将移动命令传送到服务器,并且必须等待服务器回复更新的位置才能真正看到自己的移动。如果服务器延迟50毫秒(这是一个合理的值),那么您将不得不等待100毫秒才能看到位置被更新(60帧/秒,6帧),这会导致延迟。
这是一个众所周知的问题,有多种解决方案。快速游戏中最常见的一种称为客户端预测和服务器协调。基本上,您会在收到输入时使播放器立即移动到客户端,这样就不会出现迟钝的感觉(这是客户端的预测)。但是由于您的服务器仍然具有权限并且您在服务器上处于领先地位,因此播放器将被放回到服务器以为您所在的位置,这将在客户端产生不稳定的动作。为避免这种情况,您必须在接收服务器更新时检查玩家提供的玩家位置是否是客户端预测的,如果是,则不要强行将玩家返回该位置(即服务器对帐)。
我强烈建议您阅读this guide,以更好地理解Client-Server体系结构中的网络问题。