文章目录
服务器授权网络模式
CCG Kit 是围绕服务器授权网络模式构建的。这意味着服务器负责以授权的方式管理游戏状态,以防止被修改(“被黑”)的客户端恶意更改所述状态。在这方面,客户只不过是“哑”终端,它们:
- 将他们的输入发送到服务器。
- 从服务器接收状态,并相应地更新客户端的视觉表示。
不过,“愚蠢”这个词对客户端来说有点不公平,考虑到他们也运行与服务器完全相同的逻辑,但在本地运行,以便向玩家呈现无延迟的视觉效果。这究竟意味着什么?让我们考虑一下打牌的用例(在大多数 CCG 中是很常见的动作)在不同的服务器场景中是如何流动的。
非授权服务器模式
- 客户端将其想要播放的牌的信息发送到服务器。
- 服务器接受客户端发送的信息,并相应地更新游戏状态。
这种方法的主要问题是服务器不对客户端发送给它的信息执行任何类型的验证。这开启了一种可能性,即操纵客户端实现打牌的能力,而无需花费适当的法力值,或者甚至修改要玩的卡的统计数据以使其更强大(例如,具有能力的 10/10 而不是原版 2/3)。
服务器授权模式
- 客户端将其想要播放的牌的信息发送到服务器。
- 服务器验证客户端发送的信息,并在(且仅当)它被认为是有效的时,相应地更新游戏的状态。
这种方法通过验证客户的信息来防止恶意客户改变游戏状态(在我们的示例中,确保客户有足够的法力值用于他想要玩的牌,并且该牌实际上是他的手牌之一)。但它有一个完全不同的问题:客户端只有在收到服务器的响应后才会更新其游戏的视觉表示。由于在线游戏总是有一定程度的滞后,这种滞后也会转化为游戏的视觉表现,导致用户体验不尽如人意(在我们的示例中,卡片不会立即从手牌移动到棋盘,而只有在收到服务器的响应后才会移动)。
具有客户端逻辑的服务器授权模式
- 客户端将其想要播放的牌的信息发送到服务器。
- 客户端更新其游戏的本地状态(在服务器会发现它有效的前提下)。
- 服务器验证客户端发送的信息,并在(且仅当)它被认为是有效的时,相应地更新游戏的状态。
这种方法是对前一种方法的增强。它仍然是服务器权威的(因此可以防止黑客攻击),但它也提供了流畅、无延迟的视觉效果,因为客户端在本地执行与服务器相同的游戏逻辑。这是 CCG Kit 中使用的网络模型。
当然,使用这种方法,您仍然可能有一个恶意客户端执行无效操作(或者更准确地说,尝试执行无效操作)。不同的是,现在这只会反映在他的游戏状态的本地副本上,根本不会影响服务器或任何其他玩家的状态。在下一个服务器到客户端同步步骤(通常是轮次的开始)时,恶意客户端的情况将恢复正常。
核心类
CCG Kit 中的所有核心类都位于 Core/Scripts 文件夹中,并位于 CCGKit 命名空间下。
Server类
Server 类是 CCG Kit 的大脑。在编辑器端,它是一个名为 Server 的仅服务器的对象,位于 Game 场景中。它管理游戏的整个状态以及连接到游戏的玩家。服务器和客户端(连接的播放器)之间的通信仅通过网络消息进行。更高级别的构造(如命令、客户端 RPC 或 SyncVars)不用于简化、提高效率和提高控制程度。
NetworkProtocol类
NetworkProtocol 类包含在工具包中使用的所有唯一网络消息标识符。有时,网络消息会从服务器发送到玩家(例如,StartTurn 消息)。在其他时候,它们从玩家发送到服务器(例如,PlayCard 消息)。该套件的整个架构是围绕网络消息构建的。
GameState类
GameState 类包含游戏的完整状态,包括玩家的状态以及他们拥有的每张卡片。玩家存储游戏状态的本地副本,这些副本会定期与服务器同步(通常在回合开始时)。
EffectSolver类
EffectSolver 类负责应用游戏的卡片效果。服务器和客户端都有这种类型的对象,以便能够相应地更新其游戏状态的副本。
Card类
Card 类是游戏中卡牌的原型。例如,一个 2/2 的哥布林。
RuntimeCard类
RuntimeCard 类表示卡的特定运行时实例/副本,该实例/副本在游戏过程中可以(并且通常会)更改。按照我们之前的示例,我们可以有一个已损坏的哥布林卡的副本,该卡的值为 2/1。