【UE 网络】Gameplay框架在DS架构中的扮演的角色

目录

  • [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)
  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:UE虚幻引擎专栏
  • 💥 标题:【UE 网络】Gameplay框架在DS架构中的扮演的角色
  • ❣️ 寄语:书到用时方恨少,事非经过不知难!
  • 🎈 最后:文章作者技术和水平有限,如果文中出现错误,希望大家能指正,同时有问题的话,欢迎大家留言讨论。

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)网络框架中的关键部分创建过程,将详细解释一下每个步骤:

  1. DS服务器启动: Dedicated Server(DS)启动后,首先会初始化游戏世界并创建必要的管理对象。

  2. 创建GameMode对象:服务器上会创建一个GameMode对象。GameMode是服务器端的游戏规则管理器,负责处理游戏逻辑、规则和流程。注意,GameMode只存在于服务器上,客户端没有这个对象。

  3. 创建GameState对象:服务器上会创建一个GameState对象。GameState是一个可复制的对象,用于在服务器和所有客户端之间共享游戏状态信息。GameState会被复制到所有客户端,以确保每个客户端都能访问到一致的游戏状态。

  4. 等待客户端加入游戏会话:服务器初始化完成后,会等待客户端的连接请求。当客户端请求加入游戏会话时,服务器会处理该请求。

  5. 创建PlayerController:当客户端成功加入游戏会话后,服务器会为该客户端创建一个PlayerController对象。PlayerController负责处理玩家的输入和控制逻辑。服务器上的PlayerController会将必要的信息同步到客户端,客户端会创建一个对应的PlayerController实例。

  6. 创建PlayerState对象:服务器会为每个PlayerController创建一个PlayerState对象。PlayerState是一个可复制的对象,用于存储与玩家相关的状态信息(如分数、生命值等)。PlayerState会被复制到所有客户端,以确保每个客户端都能访问到一致的玩家状态。

  7. 创建PlayerPawn对象: 服务器会为每个PlayerController创建一个PlayerPawn对象。PlayerPawn是玩家在游戏世界中的表示,负责处理物理和视觉表现。PlayerController会控制PlayerPawn的行为。

  8. 同步信息到客户端:服务器会将PlayerController、PlayerState和PlayerPawn的相关信息同步到客户端。客户端会创建对应的实例,并根据服务器的指令更新这些对象的状态。

  9. 客户端与服务器的交互:客户端的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)的网络框架中,服务器和客户端上的数据确实是独立的,尽管通过网络复制机制保持一致性。这一点非常重要,因为它影响了如何正确地进行网络编程和数据同步。下面是一些关键的解释:

  1. 独立的数据副本:服务器和客户端各自维护独立的数据副本。通过网络复制(Replication)机制,服务器会将其数据状态同步到客户端,但本质上它们是两份独立的数据。

  2. 网络复制机制:网络复制是指服务器将其数据状态(如Actor的属性、位置等)复制到客户端,以确保客户端显示的状态与服务器一致。这种复制是单向的,即从服务器到客户端。

  3. Server RPC(Remote Procedure Call):Server RPC是客户端请求服务器执行某些操作的机制。客户端可以通过Server RPC向服务器发送请求,服务器接收到请求后执行相应的逻辑。

  4. 错误的操作示例:错误操作是指通过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元素通常只在客户端上存在,负责显示和处理本地玩家的交互。

作用:在客户端上提供用户界面,允许玩家与游戏进行交互,如选择菜单选项、查看状态信息等。

相关推荐
是Dream呀1 小时前
Python从0到100(七十八):神经网络--从0开始搭建全连接网络和CNN网络
网络·python·神经网络
kaixin_learn_qt_ing1 小时前
了解RPC
网络·网络协议·rpc
小蜗牛慢慢爬行2 小时前
Hibernate、JPA、Spring DATA JPA、Hibernate 代理和架构
java·架构·hibernate
安全小王子2 小时前
Kali操作系统简单介绍
网络·web安全
Smile灬凉城6663 小时前
反序列化为啥可以利用加号绕过php正则匹配
开发语言·php
Hacker_LaoYi3 小时前
【漏洞分析】DDOS攻防分析(四)——TCP篇
网络·tcp/ip·ddos
爱吃水果蝙蝠汤3 小时前
DATACOM-IP单播路由(BGP)-复习-实验
网络·网络协议·tcp/ip
思忖小下4 小时前
梳理你的思路(从OOP到架构设计)_简介设计模式
设计模式·架构·eit
Sun_12_24 小时前
SQL注入(SQL lnjection Base)21
网络·数据库
奥顺4 小时前
PHPUnit使用指南:编写高效的单元测试
大数据·mysql·开源·php