【UE 网络】Gameplay框架在DS架构中的扮演的角色
目录
- 0 引言
- 1 核心内容
- 1.1 Gameplay各部分创建的流程
- 1.2 Gameplay框架在DS和客户端的存在情况
- 1.3 数据是独立存在于DS和客户端的
- 2 Gameplay框架各自负责的功能
- 2.1 GameMode
- 2.2 GameState
- 2.3 PlayerController
- 2.4 PlayerState
- 2.5 Pawn
- 2.6 AIController
- 2.7 Actor
- 2.8 HUD
- 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)网络框架中的关键部分创建过程,将详细解释一下每个步骤:
-
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元素通常只在客户端上存在,负责显示和处理本地玩家的交互。
作用:在客户端上提供用户界面,允许玩家与游戏进行交互,如选择菜单选项、查看状态信息等。
相关文章:
【UE 网络】Gameplay框架在DS架构中的扮演的角色
目录 0 引言1 核心内容1.1 Gameplay各部分创建的流程1.2 Gameplay框架在DS和客户端的存在情况1.3 数据是独立存在于DS和客户端的 2 Gameplay框架各自负责的功能2.1 GameMode2.2 GameState2.3 PlayerController2.4 PlayerState2.5 Pawn2.6 AIController2.7 Actor2.8 HUD2.9 UI &…...
【云原生】StatefulSet控制器详解
StatefulSet 文章目录 StatefulSet一、介绍与特点1.1、介绍1.2、特点1.3、组成部分1.4、为什么需要无头服务1.5、为什么需要volumeClaimTemplate 二、教程2.1、创建StatefulSet2.2、查看部署资源 三、StatefulSet中的Pod3.1、检查Pod的顺序索引3.2、使用稳定的网络身份标识3.3、…...
使用 Python 制作一个属于自己的 AI 搜索引擎
1. 使用到技术 OpenAI KEYSerper KEYBing Search 2. 原理解析 使用Google和Bing的搜搜结果交由OpenAI处理并给出回答。 3. 代码实现 import requests from lxml import etree import os from openai import OpenAI# 从环境变量中加载 API 密钥 os.environ["OPENAI_AP…...
rust读取csv文件,匹配搜索字符
1.代码 use std::fs::File; use std::io::{BufRead, BufReader}; use regex::{Regex};fn main() {let f File::open("F:\\0-X-RUST\\1-systematic\\ch2-fileRead\\data\\test.csv").unwrap();let mut reader BufReader::new(f);let re Regex::new("45asd&qu…...
隐藏采购订单类型
文章目录 1 Introduction2 code 1 Introduction The passage is that how to hiden purchase type . 2 code DATA: ls_shlp_selopt TYPE ddshselopt. IF ( sy-tcode ME21N OR sy-tcode ME22N OR sy-tcode ME23N or sy-tcode ME51N OR sy-tcode ME52N OR sy-tcode ME5…...
ESP32人脸识别开发- 基础介绍(一)
一、ESP32人脸识别的方案介绍 目前ESP32和ESP32S3都是支持的,官方推的开发板有两种,一种 ESP-EYE ,没有LCD 另一种是ESP32S3-EYE,有带LCD屏 二、ESP32人脸识别选用ESP32的优势 ESP32S3带AI 加速功能,在人脸识别的速度是比ESP32快了不少 | S…...
编程学习指南:语言选择、资源推荐与高效学习策略
目录 一、编程语言选择 1. Java:广泛应用的基石 2. C/C:深入底层的钥匙 3. Python:AI与大数据的宠儿 4. Web前端技术:构建交互界面的艺术 二、学习资源推荐 1. 国内外在线课程平台 2. 官方文档与教程 3. 书籍与电子书 4…...
AWS开发人工智能:如何基于云进行开发人工智能AI
随着人工智能技术的飞速发展,企业对高效、易用的AI服务需求日益增长。Amazon Bedrock是AWS推出的一项创新服务,旨在为企业提供一个简单、安全的平台,以访问和集成先进的基础模型。本文中九河云将详细介绍Amazon Bedrock的功能特点以及其收费方…...
CentOS 8 的 YUM 源替换为国内的镜像源
CentOS 8 的 YUM 源替换为国内的镜像源 1.修改 DNS 为 114.114.114.1141.编辑 /etc/resolv.conf 文件:2.在文件中添加或修改如下内容:3.保存并退出编辑器。 2.修改 YUM 源为国内镜像1.备份原有的 YUM 源配置:2.下载新的 YUM 源配置3.清理缓存…...
网络安全入门教程(非常详细)从零基础入门到精通_网路安全 教程
前言 1.入行网络安全这是一条坚持的道路,三分钟的热情可以放弃往下看了。2.多练多想,不要离开了教程什么都不会了,最好看完教程自己独立完成技术方面的开发。3.有时多百度,我们往往都遇不到好心的大神,谁会无聊天天给…...
浅学爬虫-爬虫维护与优化
在实际项目中,爬虫的稳定性和效率至关重要。通过错误处理与重试机制、定时任务以及性能优化,可以确保爬虫的高效稳定运行。下面我们详细介绍这些方面的技巧和方法。 错误处理与重试机制 在爬虫运行过程中,网络不稳定、目标网站变化等因素可…...
STM32G070系列芯片擦除、写入Flash错误解决
在用G070KBT6芯片调用HAL_FLASHEx_Erase(&EraseInitStruct, &PageError)时,调试发现该函数返回HAL_ERROR,最后定位到FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE)函数出现错误,pFlash.ErrorCode为0xA0,即FLASH错误标…...
08.02_111期_Linux_NAT技术
NAT(network address translation)技术说明 IP报文在转发的时候需要考虑 源IP地址 和 目的IP地址, IP报文每到达一个节点,就会更改一次IP地址和目的IP地址,其中节点是指主机、服务器、路由器 那么这个更改是如何进行的呢? 除了…...
【2024蓝桥杯/C++/B组/小球反弹】
题目 分析 Sx 2 * k1 * x; Sy 2 * k2 * y; (其中k1, k2为整数) Vx * t Sx; Vy * t Sy; k1 / k2 (15 * y) / (17 * x); 目标1:根据k1与k2的关系,找出一组最小整数组(k1, k2)ÿ…...
PHP中如何实现函数的可变参数列表
在PHP中,实现函数的可变参数列表主要有两种方式:使用func_get_args()函数和使用可变数量的参数(通过...操作符,自PHP 5.6.0起引入)。 1. 使用func_get_args()函数 func_get_args()函数用于获取传递给函数的参数列表&…...
串---链串实现
链串详解 本文档将详细介绍链串的基本概念、实现原理及其在 C 语言中的具体应用。通过本指南,读者将了解如何使用链串进行各种字符串操作。 1. 什么是链串? 链串是一种用于存储字符串的数据结构,它使用一组动态分配的节点来保存字符串中的…...
科技赋能生活——便携气象站
传统气象站往往庞大而复杂,需要专业人员维护,它小巧玲珑,设计精致,可以轻松放入背包或口袋,随身携带,不占空间。无论是城市白领穿梭于高楼大厦间,还是户外爱好者深入山林湖海,都能随…...
Golang——GC原理
1.垃圾回收的目的 将未被引用到的对象销毁,回收其所占的内存空间。 2.根对象是什么 全局变量:在编译器就能确定的存在于程序整个生命周期的变量。 执行栈:每个goroutine都包含自己的执行栈,这些执行栈上包含栈上的变量及指向分配…...
OpenStack概述
一、初识OpenStack OpenStack Docs: 概况 一)OpenStack架构简述 1、理解OpenStack OpenStack既是一个社区,也是一个项目和一个开源软件,提供开放源码软件,建立公共和私有云,它提供了一个部署云的操作平台或工具集&…...
机器学习练手(三):基于决策树的iris 多分类和波士顿房价预测
总结:本文为和鲸python 可视化探索训练营资料整理而来,加入了自己的理解(by GPT4o) 原活动链接 原作者:vgbhfive,多年风控引擎研发及金融模型开发经验,现任某公司风控研发工程师,对…...
PS 2024 百种常用插件下载安装教程【免费使用,先到先得】
文章目录 软件介绍软件下载安装步骤 专栏推荐: 超多精品软件(持续更新中…) 软件推荐: PS 2024 PR 2024 软件介绍 PS常用插件 此软件整合了市面近百款ps处理插件,可实现:一键制作背景,一键抠图…...
逻辑推理之lora微调
逻辑推理微调 比赛介绍准备内容lora微调lora微调介绍lora优势代码内容 start_vllm相关介绍调用 运行主函数提交结果总结相应连接 比赛介绍 本比赛旨在测试参与者的逻辑推理和问题解决能力。参与者将面对一系列复杂的逻辑谜题,涵盖多个领域的推理挑战。 比赛的连接:…...
前端-防抖代码
//防抖debounce(fn, time 1000) {let timer null;return function (...args) {if (timer) clearTimeout(timer);timer setTimeout(() > {fn.apply(this, args);}, time);};},// 输入变化处理函数async inputChange(value) {if (!this.debouncedInputChange) {this.deboun…...
langchain 入门指南 - 让 LLM 自动选择不同的 Prompt
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 让 LLM 自动选择不同的 Prompt 在上一篇文章中,我们学会了如何让 langchain 来自动选择不同的 LLM Chain,以便回…...
web浏览器播放rtsp视频流,海康监控API
概述 这里记录一下如何让前端播放rtsp协议的视频流 项目中调用海康API,生成的视频流(hls、ws、rtmp等)通过PotPlayer播放器都无法播放,说明视频流有问题,唯独rtsp视频流可以播放。 但是浏览器本身是无法播放rtsp视频的,即使…...
操作系统原理:程序、进程、线程的概念
文章目录 程序、进程、线程的概念程序(Program)进程(Process)线程(Thread)关系总结 在日常对操作系统的使用中,大家肯定对程序、进程和线程多少有所耳闻。作为操作系统的重要一部分,…...
Golang是如何实现动态数组功能的?Slice切片原理解析
Hi 亲爱的朋友们,我是 k 哥。今天,咱们聊一聊Golang 切片。 当我们需要使用数组,但是又不能提前定义数组大小时,可以使用golang的动态数组结构,slice切片。在 Go 语言的众多特性里,slice 是我们经常用到的数…...
SQL注入 报错注入+附加拓展知识,一篇文章带你轻松入门
第5关--------------------------------------------> 前端直接不会显示账号密码的打印;但是在接收前端的数据的那部分后端那里,会看前端传递过来的值是否正确,如果不正确,后端接收值那里就会当MySQL语句执行错误,…...
springboot项目里的包spring-boot-dependencies依赖介绍
springboot项目里的包’spring-boot-dependencies‘依赖 我们一般是在项目的pom dependencyManagement标签里引入spring-boot-dependencies,或者根spring-boot-starter-parent里也是继承了它,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本…...
C# 下的限定符运算详解(全部,任意,包含)与示例
文章目录 1.限定符概述2. 全部限定符运算(All)3. 任意限定符运算(Any)4. 包含限定符运算(Contains)总结 当我们在C#编程中需要进行条件判断或集合操作时,限定符(qualifiersÿ…...
网站开发与设计论文/专业北京seo公司
本文给大家介绍在excel中利用函数求百分比的实例。下面是IT部落窝网站各栏目发布文章数量,求相关栏目发布文章占所有文章的百分之多少。A B C1 栏目名称 发布数量 占百分比2 办公软件 21 9%3 网页制作 39 …...
网站开发it项目规划书/西安seo优化顾问
在本系列的文章中,我将介绍如何在Spring Boot Application中使用CKEditor编辑器。介绍的内容包括基本环境的搭建,文件上传,SpringData JPA数据持久化,CKEditor5的安装,CKEditor图片上传,CKEditor插入视频&a…...
广东一站式网站建设推荐/上海搜索引擎优化公司排名
打开U盘,依次菜单栏“工具-文件夹选项-查看-隐藏文件和文件夹”,勾选“显示所有文件和文件夹”,确定(2)上面那行里面我把 隐藏受保护的文件 和 隐藏已知扩展名去掉 然后在 显示所有文件夹 (3)注册表中 HKEY…...
暴风seo论坛/seo收费标准多少
第一种:return false, 缺点:直接返回了函数,函数后面的语句没法执行了; $(.btn).on(click,function(event){do something ...return false }) 第二种: event.stopPropagation(); 阻止事件冒泡这里以cli…...
做网站的大骗子/微信代运营
橙光古风虐恋情深游戏:风敲竹是橙光的一款古风虐恋情深的文字游戏,在游戏中玩家将会可以体验到各种精彩的剧情,多条人物线索相互穿插,到底会发生什么样的故事,快来看一看!橙光古风虐恋情深游戏简介:“风敲竹,是什么意思…...
杭州做网站比较好的公司/游戏推广员好做吗
python2中的range返回的是一个列表 python3中的range返回的是一个迭代值 for i in range(1,10)在python2和python3中都可以使用,但是要生成1-10的列表,就需要用list(range(1,10)) 在Python核心编程中要输出abcde的子序列,如果用(p…...