每个人,

我的项目即将离开原型阶段,我正在尝试为我的游戏定义一个牢固的架构。它的概念与类似于背包大战超级自动宠物集市:玩家异步地对抗“鬼魂”的其他玩家。如果玩家还想加上大厅系统让朋友们可以彼此战斗,那可能会使用对等网络(还未确定)。

游戏像纸牌游戏一样:一切都是完全有序的,每个玩家都有自己的地图。没有真正实时的玩家之间的交互,没有碰撞检测,也没有在回合之间的动作进行实时同步。

为了满足我对确定性和开发的需求,我目前将项目组织如下:

项目根目录
├─ Client (Unity项目)
├─ Shared (纯C#类,无Unity或服务器特定依赖项)
└─ Server (ASP.NET)

共享文件夹包含所有的游戏逻辑,包括ActionExecutionChains来验证客户端不โก�。客户端和服务器独立地评估玩家行为,这些评估是无状态和确定性的。如果出现不一致,服务器会覆盖客户端的结果来维持公平性。已经“导入”了共享文件夹到Unity项目中,到目前为止效果很好。

经过了大量的研究这里是技术需求的简短列表:

  1. 所有数据结构都必须是纯C#,并且在JSON中完全可序列化— 也不要Unity特定的类型,无 [Serializable] 属性。
  2. 共享文件是单一的真理源:ActionExecutionChainGameEntityDatabaseModifierDatabase等。
  3. 服务器是权威的: 它认证了ActionExecutionChain、强制规则和执行UI逻辑。
  4. 客户端负责UI和模拟;它为服务器验证生成ActionExecutionChain
  5. 修饰符和游戏逻辑在共享文件存在纯粹的数据; 运行时逻辑(工具提示、计算)是客户端只的。
  6. 所有计算必须在服务器和客户端都可以无Unity依赖进行重现。
  7. 不重叠: 所有的游戏规则、实体和修饰符都只定义一次在共享级别。
  8. 所有的实体和游戏逻辑必须在 两者 上都可供保存和执行:服务器和Unity客户端。

我的问题:

  1. 这个架构对是一个有序的、确定性的自动战斗对应吗?是否存在其他已有的项目、模式或例子我可以学习? 你会在我的具体场景下做些什么不同吗?
  2. 我是否正确认为我无法使用 [Serializable] 来共享类? 我需要避免动态类型,确定字典使用以及Unity特定的类型来维持Unity和服务器之间可共享的状态吗?

我想补充一点:我是一个老练的web开发人员,但从来没有在 ASP.NET 或 C# 服务器上工作过。 我问其他人,因为我想 doublecheck 我关于共享游戏数据和确定性逻辑在服务器上处理的假设。

此外,服务器最终需要包含所有玩家数据的数据库,包括:

  • ELO等级
  • 战斗历史
  • 战斗数据本身(重构并展示"ghost"对手)

服务器必须能够 **向客户端提供有效的战斗数据 ** 使得战斗可重现并且是权威的。