每个人,
我的项目即将离开原型阶段,我正在尝试为我的游戏定义一个牢固的架构。它的概念与类似于背包大战、超级自动宠物或集市:玩家异步地对抗“鬼魂”的其他玩家。如果玩家还想加上大厅系统让朋友们可以彼此战斗,那可能会使用对等网络(还未确定)。
游戏像纸牌游戏一样:一切都是完全有序的,每个玩家都有自己的地图。没有真正实时的玩家之间的交互,没有碰撞检测,也没有在回合之间的动作进行实时同步。
为了满足我对确定性和开发的需求,我目前将项目组织如下:
项目根目录
├─ Client (Unity项目)
├─ Shared (纯C#类,无Unity或服务器特定依赖项)
└─ Server (ASP.NET)
共享文件夹包含所有的游戏逻辑,包括ActionExecutionChains来验证客户端不โก�。客户端和服务器独立地评估玩家行为,这些评估是无状态和确定性的。如果出现不一致,服务器会覆盖客户端的结果来维持公平性。已经“导入”了共享文件夹到Unity项目中,到目前为止效果很好。
经过了大量的研究这里是技术需求的简短列表:
- 所有数据结构都必须是纯C#,并且在JSON中完全可序列化— 也不要Unity特定的类型,无
[Serializable]属性。 - 共享文件是单一的真理源:
ActionExecutionChain、GameEntityDatabase、ModifierDatabase等。 - 服务器是权威的: 它认证了
ActionExecutionChain、强制规则和执行UI逻辑。 - 客户端负责UI和模拟;它为服务器验证生成
ActionExecutionChain。 - 修饰符和游戏逻辑在共享文件存在纯粹的数据; 运行时逻辑(工具提示、计算)是客户端只的。
- 所有计算必须在服务器和客户端都可以无Unity依赖进行重现。
- 不重叠: 所有的游戏规则、实体和修饰符都只定义一次在共享级别。
- 所有的实体和游戏逻辑必须在 两者 上都可供保存和执行:服务器和Unity客户端。
我的问题:
- 这个架构对是一个有序的、确定性的自动战斗对应吗?是否存在其他已有的项目、模式或例子我可以学习? 你会在我的具体场景下做些什么不同吗?
- 我是否正确认为我无法使用
[Serializable]来共享类? 我需要避免动态类型,确定字典使用以及Unity特定的类型来维持Unity和服务器之间可共享的状态吗?
我想补充一点:我是一个老练的web开发人员,但从来没有在 ASP.NET 或 C# 服务器上工作过。 我问其他人,因为我想 doublecheck 我关于共享游戏数据和确定性逻辑在服务器上处理的假设。
此外,服务器最终需要包含所有玩家数据的数据库,包括:
- ELO等级
- 战斗历史
- 战斗数据本身(重构并展示"ghost"对手)
服务器必须能够 **向客户端提供有效的战斗数据 ** 使得战斗可重现并且是权威的。
评论 (0)