- ♂️ 作者:海码007
- 专栏:UE虚幻引擎专栏
- 标题:【UE 网络】Gameplay框架在DS架构中的扮演的角色
- ❣️ 寄语:书到用时方恨少,事非经过不知难!
- 最后:文章作者技术和水平有限,如果文中出现错误,希望大家能指正,同时有问题的话,欢迎大家留言讨论。
今天早上思考了一下UE的Gameplay框架。发现自己对Gameplay框架的理解从浅入深,最开始做的是数字孪生类型的项目,所以没有游戏的概念,只知道Actor,UObject,Component几个组合运用,对于其他的部分不太熟悉,不知道为什么要这样区分设计。
随着然后做了一个单机游戏之后发现不用部分分别管理不同的功能,例如GameMode是用于游戏规则的定义,PlayerController是用于玩家控制角色Pawn等。最后做了几个多人游戏项目,又对框架又有了更新的理解,不同部分在网络中扮演的角色也不一样,例如PlayerController是充当DS服务器和客户端通信的桥梁,GameMode仅存在于DS服务器,游戏规则中需要所有玩家都知道的信息则依赖GameState同步信息给客户端。
b站安宁Ken视频教程(非常好)
绿洲编辑器网络框架参考视频(讲的非常好)
为了更清晰地理解 UE4 在Dedicated Server(DS)网络框架中的关键部分创建过程,将详细解释一下每个步骤:
DS服务器启动: Dedicated Server(DS)启动后,首先会初始化游戏世界并创建必要的管理对象。
创建GameMode对象:服务器上会创建一个GameMode对象。GameMode是服务器端的游戏规则管理器,负责处理游戏逻辑、规则和流程。注意,GameMode只存在于服务器上,客户端没有这个对象。
创建GameState对象:服务器上会创建一个GameState对象。GameState是一个可复制的对象,用于在服务器和所有客户端之间共享游戏状态信息。GameState会被复制到所有客户端,以确保每个客户端都能访问到一致的游戏状态。
等待客户端加入游戏会话:服务器初始化完成后,会等待客户端的连接请求。当客户端请求加入游戏会话时,服务器会处理该请求。
创建PlayerController:当客户端成功加入游戏会话后,服务器会为该客户端创建一个PlayerController对象。PlayerController负责处理玩家的输入和控制逻辑。服务器上的PlayerController会将必要的信息同步到客户端,客户端会创建一个对应的PlayerController实例。
创建PlayerState对象:服务器会为每个PlayerController创建一个PlayerState对象。PlayerState是一个可复制的对象,用于存储与玩家相关的状态信息(如分数、生命值等)。PlayerState会被复制到所有客户端,以确保每个客户端都能访问到一致的玩家状态。
创建PlayerPawn对象: 服务器会为每个PlayerController创建一个PlayerPawn对象。PlayerPawn是玩家在游戏世界中的表示,负责处理物理和视觉表现。PlayerController会控制PlayerPawn的行为。
同步信息到客户端:服务器会将PlayerController、PlayerState和PlayerPawn的相关信息同步到客户端。客户端会创建对应的实例,并根据服务器的指令更新这些对象的状态。
客户端与服务器的交互:客户端的PlayerController会将玩家的输入(如移动、射击等)发送到服务器上的PlayerController。服务器上的PlayerController会处理这些输入并更新游戏状态,然后将更新后的状态同步回客户端。
总结来说,整个过程确保了服务器端的权威性,同时通过网络复制机制将必要的信息同步到客户端,以确保客户端能够正确地响应玩家的输入并显示一致的游戏状态。
理解Gameplay框架各个关键部分在DS和客户端上存在的情况能极大的帮助网络游戏的开发。如下图所示:
下面这个图是 Listen Server 的图,在DS模式下,Server端是没有UI的,也没有PlayerController_Server。
在理解了各个部分的存在位置,我们就可以避免一些常见的错误逻辑,例如:
在服务器和客户端上各自的数据其实是独立的,只是通过复制的方式让数据保持一致。本质上还是两份数据,为什么要强调这一点呢,因为有些时候会有一些错误的操作,例如通过Server RPC,将一个Actor通过参数的形式传递给服务器,在服务器上对这个Actor进行一些操作,这样是不对的。
在Unreal Engine(UE)的网络框架中,服务器和客户端上的数据确实是独立的,尽管通过网络复制机制保持一致性。这一点非常重要,因为它影响了如何正确地进行网络编程和数据同步。下面是一些关键的解释:
独立的数据副本:服务器和客户端各自维护独立的数据副本。通过网络复制(Replication)机制,服务器会将其数据状态同步到客户端,但本质上它们是两份独立的数据。
网络复制机制:网络复制是指服务器将其数据状态(如Actor的属性、位置等)复制到客户端,以确保客户端显示的状态与服务器一致。这种复制是单向的,即从服务器到客户端。
Server RPC(Remote Procedure Call):Server RPC是客户端请求服务器执行某些操作的机制。客户端可以通过Server RPC向服务器发送请求,服务器接收到请求后执行相应的逻辑。
错误的操作示例:错误操作是指通过Server RPC将一个Actor作为参数传递给服务器,然后在服务器上对这个Actor进行操作。这是不正确的,因为客户端和服务器上的Actor实例是独立的,直接传递客户端的Actor实例到服务器是无效的。
将游戏中不同的功能部分,划分给对应的框架模块,可以让整个工程逻辑清晰,管理方便。
功能:
仅在服务器上存在
:GameMode只在服务器上存在,负责管理服务器端的游戏逻辑。作用:GameMode是服务器权威性的核心部分,确保游戏规则和流程在服务器上得到正确执行。
功能:
在服务器和客户端上都存在
:GameState在服务器和所有客户端上都存在,确保所有客户端都能访问到一致的游戏状态。作用:在服务器和客户端之间共享游戏状态,确保所有玩家看到一致的游戏信息。
功能:
在服务器和对应的客户端上都存在
:PlayerController在服务器和对应的客户端上都存在,负责处理 本地玩家 的输入和控制。作用:
Server RPC
将其发送到服务器。Client RPC
将必要的信息同步到客户端。功能:
在服务器和客户端上都存在
:PlayerState在服务器和所有客户端上都存在,确保所有客户端都能访问到一致的玩家状态。作用: 在服务器和客户端之间共享玩家状态,确保所有玩家看到一致的玩家信息。
功能:
在服务器和客户端上都存在
:Pawn在服务器和所有客户端上都存在,负责同步玩家的状态。作用:通过网络复制将Pawn的状态(如位置、旋转等)同步到所有客户端,确保所有玩家看到一致的游戏世界。
功能:
在服务器上存在
:AIController通常 只在服务器上存在
,负责管理服务器端的AI逻辑。作用:在服务器上管理AI角色的行为和决策,确保AI角色在游戏中的表现符合预期。
功能:
在服务器和客户端上都存在
:Actor可以在服务器和客户端上都存在,也可以仅在服务器或客户端上存在,具体取决于Actor的类型和用途。作用:在服务器和客户端之间管理和同步游戏对象,确保游戏世界的一致性。
功能:
仅在客户端上存在
:HUD只在客户端上存在,负责显示本地玩家的游戏信息。作用:在客户端上显示游戏信息,提供玩家与游戏的交互界面。
功能:
仅在客户端上存在
:UI元素通常只在客户端上存在,负责显示和处理本地玩家的交互。作用:在客户端上提供用户界面,允许玩家与游戏进行交互,如选择菜单选项、查看状态信息等。