标签: multiplayer

实施实时多人游戏有哪些问题

我有一些使用套接字制作多人回合制游戏的经验,但我从未尝试过实时动作游戏.我需要处理哪些额外的问题?我是否需要保留玩家行为的历史,以防滞后的玩家在过去做些什么?我真的需要使用UDP数据包还是TCP足够?还有什么?

我还没有真正决定要做什么,但出于这个问题的目的,你可以考虑一个带有XY运动的10人2D游戏.

sockets networking udp tcp multiplayer

15
推荐指数
3
解决办法
3642
查看次数

如何在多人游戏中同步物理?

我试图找到最好的方法来做到这一点,考虑到在移动(3G带宽)上使用抛射和下降块的转弯交叉平台游戏.

我想知道一个设备(当前播放器转=服务器角色)是否可以运行物理并将一些"关键帧"数据(块的位置,方向)发送到另一个设备,该设备只是从当前状态插入到"关键帧"接收.使用这种方法,我非常害怕大量数据,以保证其他播放器设备上的视觉效果.

另一种方法应该是发送物理数据(力,加速......)并在其他设备上运行物理,但我恐怕永远不会有相同的结果.

mobile networking multiplayer game-physics

13
推荐指数
2
解决办法
8920
查看次数

我是否可以在不支付Unity多人游戏服务的情况下使用Unity网络HLAPI?

我看到Unity的多人游戏服务页面,我完全糊涂了:

我是否可以在已发布的游戏中使用Unity的高级网络API(NetworkManager/NetworkManagerHUD)而无需支付Unity Matchmaker和中继服务器(无论这些是什么)?

我有自己的基于云的VM,我想在其上运行专用服务器.我的项目只是一个小游戏,我会和我的朋友玩(没有商业或大规模).我想在我的VM上以专用服务器模式运行该游戏的已发布副本,并让我的朋友运行他们发布的客户端副本并通过NetworkManager连接到服务器.

我可以免费吗?我不介意我的朋友是否必须使用NetworkManagerHUD在他们的游戏副本中手动输入服务器的IP和端口.他们这样做会被视为"CCU"(Unity Personal限制为20)吗?那会使用Unity Matchmaker带宽(0.49美元/ GB,甚至不适用于Unity Personal)吗?

任何澄清将不胜感激!:)

c# multiplayer unity-game-engine matchmaking

13
推荐指数
1
解决办法
2万
查看次数

Unity Networking-UNet中的加法场景加载

简短说明:我正在我的主场景中加载一个添加场景,它的加载很好,但添加场景的GameObject(包含网络标识组件)正在变得禁用.

详细信息: 我正在通过此代码加载一个附加场景,以便添加一个场景加载到我的服务器和所有工作正常的客户端:

  [ClientRpc]
    public void RpcLoadLevelAcrossNetwork() {
        SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);    
    }
Run Code Online (Sandbox Code Playgroud)

虽然它已将我的场景加载到客户端/服务器,但具有网络标识的对象是禁用的(这是默认行为,因为我检查了Unity UNetSceneObjects,它指出:

加载场景时,将禁用场景中具有NetworkIdentity组件的所有对象; 在客户端和服务器上.然后,当场景完全加载时,将调用NetworkServer.SpawnObjects()来激活这些联网的场景对象.这将在服务器场景完成加载时由NetworkManager自动完成 - 或者可以由用户代码直接调用.

由于文档声明它将自动激活网络标识对象,但它在我的上下文中没有发生.我的场景加载很好,但其网络标识对象不活动.

我做错了什么?

我还试图通过在我新加载的场景中调用NetworkServer.SpawnObjects()来激活我自己 的对象,但它只在服务器端生成对象,同时在客户端显示错误

未找到1个Spawn场景对象的Spawn场景对象找不到2个未找到的Spawn场景对象..... ..

任何Unet冠军可以帮助我吗?

编辑/更新方法:

我已根据添加场景加载的统一论坛讨论更改了我的代码,它在服务器上加载我的附加场景有错误(如下所示),仍然我的客户端的场景网络标识对象被禁用:

错误:

使用无效连接对象调用Ready():conn = null

另一个代码尝试:

 #region AdditiveSceneLoadingSetup

    [Command]//calling this for additive scene load- its start
    public void CmdLoadAdditiveSceneMainCall() {

        RpcLoadAdditiveScene();
        StartCoroutine(LoadAdditiveSceneAtServer());

    }

    [ClientRpc]
    public void RpcLoadAdditiveScene() {
        Debug.Log("RpcLoadAdditiveScene");
        StartCoroutine(LoadAdditiveSceneAtClient());
    }

    public IEnumerator LoadAdditiveSceneAtClient() {
        Debug.Log("LoadAdditiveSceneAtClient");
        yield return …
Run Code Online (Sandbox Code Playgroud)

c# multiplayer unity-game-engine unity-networking unity3d-unet

13
推荐指数
1
解决办法
2043
查看次数

HTML5多人游戏安全解决方案

现在HTML5中有经典平台甚至3D fps游戏的几个整洁的画布演示,下一步可能是尝试开发多人HTML5游戏.HTML5套接字支持使这个相对简单,但是浏览器中的任何人都可以看到客户端源,HTML5前端多用户游戏的基本游戏安全功能有哪些解决方案 - 例如能够防止伪造高分提交

security html5 canvas multiplayer

12
推荐指数
1
解决办法
4992
查看次数

如何使用websockets进行实时游戏

我想制作一个使用websockets和node.js服务器的2人乒乓球游戏.socket.io在客户端和服务器上都使用.到目前为止,我唯一的经验是创建一个聊天应用程序.

这是我第一次尝试多人游戏,所以我对网络游戏并不熟悉.服务器应该跟踪:

  1. 球的每个位置以及经常或何时?
  2. 玩家移动,玩家向左或向右移动,如果我按住一段时间该怎么办?我应该发送像?pressHoldStartPositionpressHoldStopPosition?我想这很容易,如果我只允许按下而不是按住.

我的想法:

  1. 当球击中球员时,客户端计算速度,开始和结束位置,而另一个客户端应该从中执行正确的动画.
  2. 不知道.

multiplayer websocket

12
推荐指数
1
解决办法
9157
查看次数

"橡皮筋"会解决多人插值口吃问题吗?

我用UDP编写了多人Pong.我正在使用插值和外推,以便在客户端上创建平滑的效果.

有用.然而,球中有一些不断的口吃.每次收到新数据包时它会向前跳一小部分.它看起来有点滞后,但它是可玩的.

必须有一种方法让游戏看起来更顺畅.我读过有关橡皮筋的文章.离开这里最好的方法是什么?

我希望能够很好地回答我的问题的人会找到它.

更新

根据Ivan的要求,这是ping时间的图表.但是,我确实认为客户端平滑代码中存在问题.

在此输入图像描述

java networking interpolation physics multiplayer

12
推荐指数
1
解决办法
358
查看次数

是否有ajax的替代方案,如果没有服务器端修改则不需要轮询?

我正在尝试创建一个基于"ajax"的小型多人游戏.PHP"处理程序"给出了对象的坐标.通过使用ajax,每200MS轮询此handler.php文件.

由于没有必要在没有任何事情发生时进行轮询,我想知道,如果没有频繁的轮询,是否可以做同样的事情?例如.彗星,虽然我听说你需要为Comet配置服务器端应用程序.这是一个共享的网络服务器,所以我不能这样做.

如果不需要在客户端更改任何内容,可能会阻止handler.php文件甚至返回响应,这可能吗?然后,即使事情没有改变,你仍然会让客户无用地要求回复.基本上,如果需要向客户端告知某些内容,它应该只使用带宽和服务器资源,例如.对象坐标的变化.

ajax html5 comet multiplayer

11
推荐指数
4
解决办法
7122
查看次数

确定性浮点和.NET

我如何保证.NET应用程序中的浮点计算(比如在C#中)始终产生相同的位精确结果?特别是在使用不同版本的.NET并在不同平台上运行时(x86 vs x86_64).浮点运算的不准确无关紧要.

在Java中我会使用strictfp.在C/C++和其他低级语言中,这个问题基本上是通过访问FPU/SSE控制寄存器来解决的,但这在.NET中可能是不可能的.

即使控制了FPU控制寄存器,.NET的JIT也会在不同平台上生成不同的代码.在这种情况下,像HotSpot这样的东西会更糟糕......

我为什么需要它?我正在考虑编写一个实时策略(RTS)游戏,它在很大程度上依赖于快速浮点数学和锁定步进模拟.基本上我只会通过网络传输用户输入.这也适用于通过存储用户输入来实现重放的其他游戏.

不是一个选择:

  • 小数(太慢)
  • 固定点值(使用sqrt,sin,cos,tan,atan时太慢和麻烦......)
  • 像FPS一样在网络上更新状态:不能选择发送数百或几千个单位的位置信息

有任何想法吗?

floating-point deterministic multiplayer real-time-strategy

11
推荐指数
1
解决办法
564
查看次数

游戏中心GKMatch GKSendDataReliable数据包丢失

我在应用程序中成功使用GKMatch已经有一段时间了.我一直在追逐游戏并偶尔停止游戏,并将其跟踪到正在发送但未收到的数据包.这只是偶尔发生,但我似乎无法追查它为什么会发生.

所有消息都使用GKSendDataReliable发送.

记录显示数据包正在从一台设备成功发送,但从未在目标设备上接收.

//Code sample of sending method....
//self.model.match is a GKMatch instance    
-(BOOL) sendDataToAllPlayers:(NSData *)data error:(NSError **)error {
        [self.model.debugger addToLog:@"GKManager - sending data"];
        return [self.model.match sendDataToAllPlayers:data withDataMode:GKSendDataReliable error:error];
    }
Run Code Online (Sandbox Code Playgroud)

...

//Code sample of receiving method....
// The match received data sent from the player.
-(void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID {
    [self.model.debugger addToLog:@"GKManager - received data"];
    [super didReceiveData:data fromPlayer:playerID];
}
Run Code Online (Sandbox Code Playgroud)

我所看到的是周期性地(可能是100个消息中的1个)在没有错误的情况下从'sendDataToAllPlayers'方法发送,但是接收设备永远不会遇到'didReceiveData'方法.我的理解是,使用GKSendDataReliable应该发送消息,然后在收到确认之前不会发送另一个消息.未收到消息,但从同一设备发送新消息.

发送方法返回'YES'并且错误是nil,但didReceiveData永远不会被命中......!

有没有人见过这个?有没有人有任何想法这可能是什么?我不知道我还能做些什么来调试这个.

multiplayer gksession ios game-center

11
推荐指数
1
解决办法
931
查看次数