我正在创建一个简单的多人游戏(服务器权威(,我需要能够向所有玩家发送所有玩家位置
所以每当其中一个玩家移动时,我都会这样做
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);
}
}
}
首先,我更新玩家位置,然后将所有位置发送给所有玩家(在这里您只能看到全部发送到所有部分( 在客户端,当用户名等于客户端的用户名时,我移动用户,否则我移动"其他玩家" 当只有一个玩家时,工作得很好,但在连接另一个玩家后,一切都会延迟很多并且没有响应。这种发送数据的方式有问题吗?还是我应该在其他地方寻找错误
编辑
*播放器实际上在按下按钮后立即开始移动,但移动滞后,并且在释放按钮后很长时间内仍在移动(我握的时间越长,它继续移动的时间就越长( - 这实际上意味着服务器无法处理我猜的节奏?
这取决于您的测试环境,但如果它不在本地网络上,那么您遇到的只是简单的网络延迟。通信不是即时的,可能需要更多或更少的时间,具体取决于您的连接和与服务器的距离。
正在发生的事情是,作为一名玩家,你正在将移动的命令传输到服务器,你必须等待服务器回复更新的位置才能真正看到自己移动。如果服务器有 50 毫秒的延迟(这是一个不错的值(,那么您必须等待 100 毫秒才能看到位置正在更新(6 帧,60fps(,从而导致滞后感。
这是一个众所周知的问题,有多种解决方案。快节奏游戏中最常见的一种称为客户端预测和服务器协调。基本上,你让玩家在收到输入时立即移动客户端,这样就不会有滞后的感觉(这是客户端预测(。但是由于您的服务器仍然具有权限并且您在服务器上领先,因此您的玩家将被放回服务器认为您所在的位置,这将在客户端创建断断续续的动作。为了防止这种情况,您必须在接收服务器更新时检查玩家给出的玩家位置是否被预测为客户端,如果是,请不要强制玩家回到该位置(即服务器协调(。
我强烈建议您阅读本指南,以更好地了解客户端-服务器体系结构的网络问题。