目录
- [0 引言](#0 引言)
- [1 核心内容](#1 核心内容)
-
- [1.1 Gameplay各部分创建的流程](#1.1 Gameplay各部分创建的流程)
- [1.2 Gameplay框架在DS和客户端的存在情况](#1.2 Gameplay框架在DS和客户端的存在情况)
- [1.3 数据是独立存在于DS和客户端的](#1.3 数据是独立存在于DS和客户端的)
- [2 Gameplay框架各自负责的功能](#2 Gameplay框架各自负责的功能)
-
- [2.1 GameMode](#2.1 GameMode)
- [2.2 GameState](#2.2 GameState)
- [2.3 PlayerController](#2.3 PlayerController)
- [2.4 PlayerState](#2.4 PlayerState)
- [2.5 Pawn](#2.5 Pawn)
- [2.6 AIController](#2.6 AIController)
- [2.7 Actor](#2.7 Actor)
- [2.8 HUD](#2.8 HUD)
- [2.9 UI](#2.9 UI)
0 引言
今天早上思考了一下UE的Gameplay框架。发现自己对Gameplay框架的理解从浅入深,最开始做的是数字孪生类型的项目,所以没有游戏的概念,只知道Actor,UObject,Component几个组合运用,对于其他的部分不太熟悉,不知道为什么要这样区分设计。
随着然后做了一个单机游戏之后发现不用部分分别管理不同的功能,例如GameMode是用于游戏规则的定义,PlayerController是用于玩家控制角色Pawn等。最后做了几个多人游戏项目,又对框架又有了更新的理解,不同部分在网络中扮演的角色也不一样,例如PlayerController是充当DS服务器和客户端通信的桥梁,GameMode仅存在于DS服务器,游戏规则中需要所有玩家都知道的信息则依赖GameState同步信息给客户端。
b站安宁Ken视频教程(非常好)
绿洲编辑器网络框架参考视频(讲的非常好)
1 核心内容
1.1 Gameplay各部分创建的流程
为了更清晰地理解 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会处理这些输入并更新游戏状态,然后将更新后的状态同步回客户端。
总结来说,整个过程确保了服务器端的权威性,同时通过网络复制机制将必要的信息同步到客户端,以确保客户端能够正确地响应玩家的输入并显示一致的游戏状态。
1.2 Gameplay框架在DS和客户端的存在情况
理解Gameplay框架各个关键部分在DS和客户端上存在的情况能极大的帮助网络游戏的开发。如下图所示:
下面这个图是 Listen Server 的图,在DS模式下,Server端是没有UI的,也没有PlayerController_Server。
在理解了各个部分的存在位置,我们就可以避免一些常见的错误逻辑,例如:
- 在某个客户端上获取所有的PlayerController
- 在服务器上获取HUD对象
- 在客户端上直接生成Actor
- 在客户端获取AIController,AIController只存在于服务器上
1.3 数据是独立存在于DS和客户端的
在服务器和客户端上各自的数据其实是独立的,只是通过复制的方式让数据保持一致。本质上还是两份数据,为什么要强调这一点呢,因为有些时候会有一些错误的操作,例如通过Server RPC,将一个Actor通过参数的形式传递给服务器,在服务器上对这个Actor进行一些操作,这样是不对的。
在Unreal Engine(UE)的网络框架中,服务器和客户端上的数据确实是独立的,尽管通过网络复制机制保持一致性。这一点非常重要,因为它影响了如何正确地进行网络编程和数据同步。下面是一些关键的解释:
-
独立的数据副本:服务器和客户端各自维护独立的数据副本。通过网络复制(Replication)机制,服务器会将其数据状态同步到客户端,但本质上它们是两份独立的数据。
-
网络复制机制:网络复制是指服务器将其数据状态(如Actor的属性、位置等)复制到客户端,以确保客户端显示的状态与服务器一致。这种复制是单向的,即从服务器到客户端。
-
Server RPC(Remote Procedure Call):Server RPC是客户端请求服务器执行某些操作的机制。客户端可以通过Server RPC向服务器发送请求,服务器接收到请求后执行相应的逻辑。
-
错误的操作示例:错误操作是指通过Server RPC将一个Actor作为参数传递给服务器,然后在服务器上对这个Actor进行操作。这是不正确的,因为客户端和服务器上的Actor实例是独立的,直接传递客户端的Actor实例到服务器是无效的。
2 Gameplay框架各自负责的功能
将游戏中不同的功能部分,划分给对应的框架模块,可以让整个工程逻辑清晰,管理方便。
2.1 GameMode
功能:
- 游戏规则:定义游戏的规则和逻辑,如胜利条件、回合机制等。
- 玩家生成:管理玩家的生成点和生成逻辑。
- 游戏流程:控制游戏的整体流程,如游戏开始、结束等。
仅在服务器上存在
:GameMode只在服务器上存在,负责管理服务器端的游戏逻辑。
作用:GameMode是服务器权威性的核心部分,确保游戏规则和流程在服务器上得到正确执行。
2.2 GameState
功能:
- 全局状态:存储游戏的全局状态信息,如当前游戏时间、回合数、比分等。所有玩家都需要知道的信息存储在这里
- 状态同步:通过网络复制(Replication)将状态同步到所有客户端。
在服务器和客户端上都存在
:GameState在服务器和所有客户端上都存在,确保所有客户端都能访问到一致的游戏状态。
作用:在服务器和客户端之间共享游戏状态,确保所有玩家看到一致的游戏信息。
2.3 PlayerController
功能:
- 玩家输入:处理玩家的输入并将其转换为游戏中的动作。
- 控制逻辑:管理玩家的控制逻辑,如移动、攻击等。
在服务器和对应的客户端上都存在
:PlayerController在服务器和对应的客户端上都存在,负责处理 本地玩家 的输入和控制。
作用:
- 输入处理 :在客户端上接收玩家输入,并通过
Server RPC
将其发送到服务器。 - 控制同步 :在服务器上处理输入并更新游戏状态,同时通过
Client RPC
将必要的信息同步到客户端。
2.4 PlayerState
功能:
- 玩家状态:存储与玩家相关的状态信息,如分数、生命值、攻击力、buff等。
- 状态同步:通过网络复制将状态同步到所有客户端。
在服务器和客户端上都存在
:PlayerState在服务器和所有客户端上都存在,确保所有客户端都能访问到一致的玩家状态。
作用: 在服务器和客户端之间共享玩家状态,确保所有玩家看到一致的玩家信息。
2.5 Pawn
功能:
- 玩家表示:表示玩家在游戏世界中的位置和状态。
- 物理和视觉表现:处理玩家的物理和视觉表现,如移动、动画等。
在服务器和客户端上都存在
:Pawn在服务器和所有客户端上都存在,负责同步玩家的状态。
作用:通过网络复制将Pawn的状态(如位置、旋转等)同步到所有客户端,确保所有玩家看到一致的游戏世界。
2.6 AIController
功能:
- AI逻辑:管理AI角色的行为和决策逻辑。
- 控制AI角色:控制AI角色的移动、攻击等行为。
在服务器上存在
:AIController通常只在服务器上存在
,负责管理服务器端的AI逻辑。
作用:在服务器上管理AI角色的行为和决策,确保AI角色在游戏中的表现符合预期。
2.7 Actor
功能:
- 游戏对象:表示游戏中的任何对象,如道具、环境物体等。
- 功能模块:可以包含各种组件(如渲染、物理、音频等)来实现特定功能。
在服务器和客户端上都存在
:Actor可以在服务器和客户端上都存在,也可以仅在服务器或客户端上存在,具体取决于Actor的类型和用途。
作用:在服务器和客户端之间管理和同步游戏对象,确保游戏世界的一致性。
2.8 HUD
功能:
- 用户界面:在屏幕上显示游戏信息,如健康条、分数等。
仅在客户端上存在
:HUD只在客户端上存在,负责显示本地玩家的游戏信息。
作用:在客户端上显示游戏信息,提供玩家与游戏的交互界面。
2.9 UI
功能:
- 用户界面:包括菜单、按钮、文本等,用于与玩家进行交互。
- 交互逻辑:处理用户输入并触发相应的游戏逻辑。
仅在客户端上存在
:UI元素通常只在客户端上存在,负责显示和处理本地玩家的交互。
作用:在客户端上提供用户界面,允许玩家与游戏进行交互,如选择菜单选项、查看状态信息等。