多人游戏-发送玩家位置

时间:2019-12-28 21:30:07

标签: c# unity3d server client multiplayer

我正在创建一个简单的多人游戏(服务器权威),我需要能够将所有玩家位置发送给所有玩家

所以只要有一位玩家移动,我都会这样做

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)” 当只有一个播放器时,效果很好,但是在连接另一个播放器后,一切都会延迟很多,而且反应迟钝。这种发送数据的方式有问题吗?还是应该在其他地方寻找错误

编辑

*播放器实际上在按下按钮后立即开始移动,但是移动缓慢,并且在释放按钮后它一直保持移动很长时间(我握住的时间越长,它保持移动的时间就越长)-这实际上意味着服务器无法处理我猜的速度?

1 个答案:

答案 0 :(得分:0)

这取决于您的测试环境,但是如果它不在本地网络上,那么您遇到的是简单的网络延迟。通信不是即时的,可能会花费更多或更少的时间,具体取决于您的连接和与服务器的距离。

发生的事情是,作为一名玩家,您正在将移动命令传送到服务器,并且您必须等待服务器回复更新的位置才能真正看到自己的移动。如果服务器延迟50毫秒(这是一个不错的值),那么您将不得不等待100毫秒才能看到位置被更新(60帧/秒,6帧),这会导致延迟。

这是一个众所周知的问题,有多种解决方案。快速游戏中最常见的一种称为客户端预测和服务器协调。基本上,您会在收到输入时使播放器立即移动到客户端,这样就不会出现迟钝的感觉(这是客户端的预测)。但是由于服务器仍然具有权限并且您在服务器上处于领先地位,因此播放器将被放回到服务器认为您所在的位置,这将在客户端产生不稳定的动作。为了防止这种情况,您必须在接收服务器更新时检查玩家提供的玩家位置是否是客户端预测的,如果是,则不要强行将玩家返回该位置(服务器对帐)。

我强烈建议您阅读this guide,以更好地了解Client-Server体系结构中的网络问题。