Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多人游戏-发送玩家位置_C#_Unity3d_Server_Client_Multiplayer - Fatal编程技术网

C# 多人游戏-发送玩家位置

C# 多人游戏-发送玩家位置,c#,unity3d,server,client,multiplayer,C#,Unity3d,Server,Client,Multiplayer,我正在创建一个简单的多人游戏(服务器权威),我需要能够发送给所有玩家所有玩家的位置 所以每当一个玩家移动时,我都会这样做 private void SendPositions() { foreach (var item in ActiveUser.activeUsers) { foreach (var i in ActiveUser.activeUsers) { Net_OnM

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

所以每当一个玩家移动时,我都会这样做

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毫秒才能看到位置被更新(以60帧/秒的速度6帧),从而产生滞后的感觉

这是一个众所周知的问题,有多种解决方案。在快节奏的游戏中,最常见的是客户端预测和服务器协调。基本上,当你接收到输入时,你会让玩家立即移动到客户端,这样就不会有滞后的感觉(这就是客户端预测)。但是,由于你的服务器仍然拥有权限,而你在服务器上处于领先地位,你的玩家将被放回服务器认为你所在的位置,这将在客户端造成波动。为了防止这种情况发生,您必须在接收服务器更新时检查播放机提供的播放机位置是否是客户端预测的,如果是,则不要强制播放机返回到该位置(即服务器协调)


我强烈建议您阅读本书,以便更好地了解客户机-服务器体系结构的网络问题。

您是在尝试制定自己的多用户协议,还是在使用现有的多种协议之一。如果你自己做,客户端应该只发送它的权威,例如它的播放器,服务器应该发送其他人的更新到服务器client@BugFinder我用的是unity的llapi?你建议用什么?只是看看。。是的,您需要确保只发送您权威的数据,因为问题是我仅在本地网络上,并且“错误”仅在连接第二个播放机后出现。因为当只有一个玩家时,我会在连接第二个玩家后直接向他发送消息,我会发送4MSG。。我想这就是问题的原因,但我不知道如何使这更有效。在本地网络上,这确实有点奇怪,因为他们不应该有太多的延迟。但是,嘿,我想这可能会发生。顺便问一下,当你说只有一个玩家时,它是一个客户端和一个服务器,还是一个侦听服务器,其中第一个客户端也是服务器?因为如果是后者,当第二个玩家出现时,它可能会解释问题。无论如何,如果你打算在真实的网络环境中使用你的游戏,你很可能必须实现客户端预测和服务器协调架构,这很可能会解决你的问题。这是客户端和服务器的问题。尝试ping服务器(让客户端向服务器发送包含消息发送时客户端时间的时间戳的消息,并让服务器发回消息,然后测量时间戳与接收消息时客户端时间之间的差异)在1人和2人环境中检查2人环境是否以某种方式引入延迟。如果是,则客户端预测/服务器协调是解决方案。否则,就会发生其他事情。