如何为多人游戏创建客户端权威玩家

0

【以下的问题经过翻译处理】 我想使用Gamelift创建一个基本的多人游戏,但我遇到了一些问题,比如创建一个像“玩家”一样的东西,任何连接到Gamelift会话的人都可以进行控制。

我不确定如何实现这个目标。开始我想只需将“Netbinding-Component”添加到我的玩家预制体中即可,但这并不起作用。

然后我对一些多人游戏示例进行了逆向工程,并且现在我知道了它们是如何使用客户端主控数据和RPC调用来实现的。

但是实现这样的东西需要我花费大量时间。难道没有更简单的方法来创建像“玩家”一样的东西,它可以在每个连接的网络中进行复制吗?

我真的需要写自己的C++服务器?

除此之外,我还有一些关于多人游戏示例的问题:

1.)我无法弄清楚游戏服务器如何终止游戏会话。当我尝试时,我可以使用大厅创建一个会话,但没有真正的方法来删除会话吗?

2.)创建的玩家会话也不会断开,这意味着随着每个客户端与游戏会话新连接的创建,活动玩家会话的数量都增加了一个,但即使我终止了客户端程序,也没有减少。

profile picture
专家
已提问 5 个月前5 查看次数
1 回答
0

【以下的回答经过翻译处理】 你走在正确的道路上!添加一个网络绑定组件是必须的,以便将实体“绑定”到网络上,从而使其数据得到复制。我之前已经发布了一个简单的示例程序,演示了一个网络化的玩家控制器:https://forums.awsgametech.com/t/networked-player-controller-example/2277/1

这个示例程序有一些需要更新的lua代码,使其能够与1.9一起工作,但如果你认为这对你的游戏有用,我很乐意为你更新它。

它是客户端主导的,每个加入服务器的玩家都有自己控制的角色。

关于你的问题

0.)你是否必须编写自己的C++服务器?

Lumberyard默认附带一个既拿既用的专用服务器,因此,如果你只想使用Lua,就不需要编写任何C++代码。尽管如此,大多数多人游戏都会添加/修改其专用服务器的C++代码,以优化性能并获得更好的安全性。如果你正在制作一个的简单游戏(例如原型),那么你不需要编写任何C++服务器代码。

1.)我没有搞清楚游戏服务器如何终止游戏会话。当我尝试这样做时,你可以使用大厅创建一个会话,但真的没有办法删除一个会话吗?

有C++命令可以从服务器终止GameLift游戏会话,不过在这个多人游戏示例中,专用服务器在关闭之前等待GameLift收到终止消息。因此,在示例中,这意味着客户端发起了会话创建,但是GameLift用来处理会话终止。如果你想让服务器终止GameLift会话,你可以调用AWS::GameLift::Server::TerminateGameSession() (http://docs.aws.amazon.com/gamelift/latest/developerguide/integration-server-sdk-cpp-ref-actions.html#integration-server-sdk-cpp-ref-terminategamesession)

2.)创建的玩家会话也不会断开,这意味着随着每个客户端与游戏会话新连接的创建,活动玩家会话的数量都增加了一个,但即使我终止了客户端程序,也没有减少。

这似乎是玩家错误地被断开而且服务器禁用了断开检测功能。当用户和服务器断开连接时应该调用Aws::GameLift::Server::RemovePlayerSession (line 247 of GameLiftServerSession.cpp in OnReplicaDeactivate).

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则