【UE 网络】多人游戏开发时应该如何区分客户端逻辑和服务端逻辑 入门篇

目录

  • 0 引言
  • 1 服务器和客户端逻辑
    • 1.1 服务器职责
    • 1.2 客户端职责
  • 2 函数会在客户端执行还是服务端?
    • 2.1 只在客户端执行的函数
      • RepNotify
      • Client RPC
      • Multicast RPC
    • 2.2 只在服务端执行的函数
      • GameMode
      • Server RPC
    • 2.3 在两端都可以执行的函数
      • GetNetMode() 和 HasAuthority()
    • 总结

请添加图片描述

  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:UE虚幻引擎专栏
  • 💥 标题:【UE 网络】多人游戏开发时应该如何区分客户端逻辑和服务端逻辑 入门篇
  • ❣️ 寄语:书到用时方恨少,事非经过不知难!
  • 🎈 最后:文章作者技术和水平有限,如果文中出现错误,希望大家能指正,同时有问题的话,欢迎大家留言讨论。

0 引言

单机游戏的开发和网络游戏的开发差别还是很大的,那么在进行网络开发时,需要时刻注意什么呢?

1 服务器和客户端逻辑

在多人游戏网络开发时,一定要清晰的区分好服务端和客户端的职责。这样思路才能更加清晰。

1.1 服务器职责

① 游戏逻辑的权威性:

  • 服务器是游戏逻辑的权威,负责处理所有关键的游戏逻辑和状态更新。
  • 例如,角色的移动、攻击、物品拾取等操作都应该在服务器上进行验证和处理。

② 状态同步:

  • 服务器负责将游戏状态同步到所有客户端。
  • 例如,角色的位置、生命值、物品状态等需要通过网络复制(Replication)机制同步到客户端。

③ 安全性和反作弊:

  • 服务器需要确保游戏的安全性,防止作弊行为。
  • 例如,服务器需要验证客户端发送的所有请求,防止非法操作。

④ AI控制:

  • 服务器通常负责AI的控制和行为逻辑。
  • 例如,AI角色的路径规划、攻击逻辑等都应该在服务器上执行。

1.2 客户端职责

① 用户输入处理:

  • 客户端负责处理玩家的输入,并将输入请求发送到服务器。
  • 例如,玩家的移动、攻击指令等需要发送到服务器进行验证和处理。

② 渲染和表现:

  • 客户端负责渲染游戏画面和音效,提供给玩家视觉和听觉反馈。
  • 例如,角色的动画、特效、UI等都在客户端进行处理。

③ 本地预测和插值:

  • 为了提供流畅的游戏体验,客户端可以进行本地预测和插值。
  • 例如,角色移动的本地预测可以减少网络延迟带来的影响。

④ UI和HUD:

  • 客户端负责显示用户界面(UI)和头部显示器(HUD)。
  • 例如,生命值条、得分、物品栏等都在客户端进行处理。

2 函数会在客户端执行还是服务端?

  • 其实有些函数既可以在客户端执行也可以在服务端执行
  • 有些函数只能在服务端执行
  • 有些函数只能在客户端执行

2.1 只在客户端执行的函数

RepNotify

  • RepNotify是指带有ReplicatedUsing属性的变量,当这些变量在服务器上发生变化时,客户端会收到通知并调用指定的回调函数。
  • 这些回调函数只会在客户端执行,用于处理客户端的状态更新。
UCLASS()
class AYourActor : public AActor
{GENERATED_BODY()public:UPROPERTY(ReplicatedUsing = OnRep_Health)float Health;UFUNCTION()void OnRep_Health();
};void AYourActor::OnRep_Health()
{// 只在客户端执行的逻辑UE_LOG(LogTemp, Warning, TEXT("Health updated to: %f"), Health);
}

Client RPC

  • Client RPC(Remote Procedure Call)是从服务器调用并在特定客户端上执行的函数。
  • 这些函数使用Client关键字标记,并且只会在客户端执行。
UFUNCTION(Client, Reliable)
void ClientShowMessage(const FString& Message);void AYourActor::ClientShowMessage_Implementation(const FString& Message)
{// 只在客户端执行的逻辑UE_LOG(LogTemp, Warning, TEXT("Message from server: %s"), *Message);
}

Multicast RPC

  • Multicast RPC是从服务器调用并在所有客户端上执行的函数。
  • 这些函数使用NetMulticast关键字标记,并且会在所有客户端执行。
UFUNCTION(NetMulticast, Reliable)
void MulticastPlaySound();void AYourActor::MulticastPlaySound_Implementation()
{// 在所有客户端执行的逻辑UGameplayStatics::PlaySoundAtLocation(this, SoundToPlay, GetActorLocation());
}

2.2 只在服务端执行的函数

GameMode

  • GameMode类中的函数只会在服务器上执行。GameMode是服务器专用的类,客户端不会拥有GameMode的实例。
void AYourGameMode::StartMatch()
{// 只在服务器执行的逻辑Super::StartMatch();UE_LOG(LogTemp, Warning, TEXT("Match started!"));
}

Server RPC

  • Server RPC是从客户端调用并在服务器上执行的函数。
  • 这些函数使用Server关键字标记,并且只会在服务器执行。
UFUNCTION(Server, Reliable, WithValidation)
void ServerPerformAction();void AYourActor::ServerPerformAction_Implementation()
{// 只在服务器执行的逻辑UE_LOG(LogTemp, Warning, TEXT("Action performed on server"));
}bool AYourActor::ServerPerformAction_Validate()
{// 验证逻辑return true;
}

2.3 在两端都可以执行的函数

GetNetMode() 和 HasAuthority()

  • GetNetMode():返回当前网络模式,可以是NM_Standalone(单机)、NM_Client(客户端)、NM_ListenServer(监听服务器)或NM_DedicatedServer(专用服务器)。
  • HasAuthority():返回当前实例是否拥有权威(通常是服务器)。
  • RoleRemote Role也可以判断。
void AYourActor::SomeFunction()
{if (GetNetMode() == NM_Client){// 只在客户端执行的逻辑UE_LOG(LogTemp, Warning, TEXT("Executing on client"));}else if (GetNetMode() == NM_DedicatedServer){// 只在专用服务器执行的逻辑UE_LOG(LogTemp, Warning, TEXT("Executing on dedicated server"));}if (HasAuthority()){// 只在服务器执行的逻辑UE_LOG(LogTemp, Warning, TEXT("Executing on server with authority"));}else{// 只在客户端执行的逻辑UE_LOG(LogTemp, Warning, TEXT("Executing on client without authority"));}
}

总结

  • 只在客户端执行的函数:RepNotify、Client RPC、Multicast RPC。这些函数主要用于处理客户端的状态更新和客户端特定的逻辑。
  • 只在服务端执行的函数:GameMode中的函数、Server RPC。这些函数主要用于处理服务器的游戏逻辑和验证客户端请求。
  • 在两端都可以执行的函数:通过GetNetMode()HasAuthority()来区分执行环境。这些函数可以根据当前的网络模式或权威性来执行不同的逻辑。

通过合理地使用这些函数和机制,可以确保游戏逻辑在客户端和服务器之间正确分工,保证游戏的正确性和性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/39207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用C#的MediaDevices程序集打开MTP设备(用usb线连接的手机)的文件夹

一、任务描述 1、可以访问MTP设备的桌面程序。 MTP设备:支持媒体传输协议(MTP)的设备,MTP简单来说就是一种PC与其他设备相连的一种协议,智能手机、平板电脑、数码相机等可以通过 USB 连接到电脑,并通过 MTP 协议传输媒体文件。点…

PLC_博图系列☞F_TRIG:检测信号下降沿

PLC_博图系列☞F_TRIG:检测信号下降沿 文章目录 PLC_博图系列☞F_TRIG:检测信号下降沿背景介绍F_TRIG: 检测信号下降沿说明参数示例 关键字: PLC、 西门子、 博图、 Siemens 、 F_TRIG 背景介绍 这是一篇关于PLC编程的文章&a…

Swift中的二分查找:全面指南

Swift中的二分查找:全面指南 简介 二分查找是计算机科学中的经典算法,被广泛用于在已排序的数组中高效地搜索目标值。与线性查找逐个检查每个元素不同,二分查找不断将搜索区间减半,因此在处理大数据集时要快得多。 在这篇博客中…

从零到百万用户的扩展之路

写在前面: 此博客内容已经同步到我的博客网站,如需要获得更优的阅读体验请前往https://mainjaylai.github.io/Blog/blog/system/design-system 设计一个支持数百万用户的系统是极具挑战性的,它是一段需要持续优化和不断改进的旅程。在这篇博客中,我们将构建一个支持单个用…

NC13611 树(dfs序+区间dp)

链接 思路&#xff1a; 容易知道对于同一种颜色的子图一定是仅由该颜色的点连通的。设我们要划分的个数为x&#xff08;x<k&#xff09;&#xff0c;也就是说我们要选出x-1条边&#xff0c;这里有种情况。那么我们需要选出x种颜色&#xff0c;这里有种情况。然后我们需要将…

双端队列广搜——AcWing 175. 电路维修

双端队列广搜 定义 双端队列广搜&#xff08;Breadth-First Search with a Deque&#xff09;是一种图或树的遍历算法变体&#xff0c;它利用了双端队列&#xff08;Deque&#xff0c;全称Double Ended Queue&#xff0c;允许在其两端进行插入和删除操作&#xff09;作为数据…

1996-2023年各省财政收支数据(无缺失)(地方财政一般预算收入、地方财政一般预算支出)

1996-2023年各省财政收支数据&#xff08;无缺失&#xff09;&#xff08;地方财政一般预算收入、地方财政一般预算支出&#xff09; 1、时间&#xff1a;1996-2023年 2、来源&#xff1a;国家统计局、统计年鉴、 3、指标&#xff1a;地方财政一般预算收入、地方财政一般预算…

跨境业务经验推荐:三大优秀的IP代理服务商

作为一名多年从事跨境业务的老手&#xff0c;今天我要给大家介绍几款绝对靠谱的IP代理服务商&#xff0c;保证让你的全球业务更加顺畅&#xff01; 1. 711Proxy 711Proxy以其优秀的性能和覆盖范围广而著称。对于跨境电商和国际业务来说&#xff0c;快速稳定的网络连接至关重要…

d3dx9_43.dll丢失怎么解决?d3dx9_43.dll怎么安装详细教程

在使用计算机中&#xff0c;如果遇到d3dx9_43.dll丢失或许找不到d3dx9_43.dll无法运行打开软件怎么办&#xff1f;这个是非常常见问题&#xff0c;下面我详细介绍一下d3dx9_43.dll是什么文件与d3dx9_43.dll的各种问题以及d3dx9_43.dll丢失的多个解决方法&#xff01; 一、d3dx9…

Zynq—按键控制LED灯闪烁

一、GPIO简介 ZYNQ 的 IO包括对外连接的 GPIO 和内部 PS 与 PL 通信的 AXIO。其中对外的 GPIO 又分为 两种&#xff1a; MIO 和 EMIO。 MIO 和 EMIO 只是 GPIO 信号的两种接口&#xff0c; MIO 直连到PS(数量有限)&#xff0c; EMIO 则是 PS 扩展到 PL&#xff0c;从 PL 接出的…

UTONMOS:探索未来区块链与元宇宙的游戏奇妙融合

在科技的飞速发展浪潮中&#xff0c;区块链技术正以前所未有的力量重塑着各个领域&#xff0c;而游戏行业也迎来了一场前所未有的变革——元宇宙游戏的崛起。 元宇宙&#xff0c;这个充满无限想象的虚拟世界&#xff0c;让玩家能够沉浸其中&#xff0c;体验超越现实的奇幻之旅。…

springboot评选投票系统-计算机毕业设计源码15837

摘 要 本文介绍的是基于Spring Boot开发的评选投票系统小程序。该系统旨在为用户提供一个便捷、高效的平台&#xff0c;以实现评选活动的投票功能。随着社交媒体和互联网的普及&#xff0c;评选活动已成为各行业中常见的形式&#xff0c;如最佳歌曲、最佳演员等。然而&#xf…

探索PcapPlusPlus开源库:网络数据包处理与性能优化

文章目录 0. 本文概要1. PcapPlusPlus介绍1.1 概述1.2主要特性和功能1.3 PcapPlusPlus 主要模块关系和依赖1.4 网络协议层处理过程 2. 实例2.1 基于 PcapPlusPlus 的应用程序设计和封装流程&#xff1a;2.2 多线程示例代码2.3 代码说明&#xff1a; 3. 程序性能进一步优化3.1 避…

指哪打哪,重绘神器!我已出手…

最近AI界又爆出了一个大新闻&#xff0c;阿里巴巴、香港大学和蚂蚁集团的研究人员联合推出了一款超厉害的AI工具——MimicBrush&#xff0c;它的问世&#xff0c;无疑给图像编辑领域带来了一场革命&#xff0c;它就像魔法师手中的魔杖&#xff0c;轻轻一挥&#xff0c;就能让图…

隐私计算实训营第二期第七课:XGB算法与SGB算法开发实践

隐私计算实训营第二期-第七课 第七课&#xff1a;XGB算法与SGB算法开发实践1 决策树模型1.1 决策树的训练和预测过程1.2 决策树的发展过程 2 GBDT模型2.1 Boosting核心思想2.2 GBDT原理 3 XGB模型3.1 XGB核心思想3.2 XGB优点 3 隐语纵向树模型3.1 数据纵向分割3.2 隐私保护的树…

和小红书一起参会! 了解大模型与大数据融合的技术趋势

在过去的两年中&#xff0c;“大模型”无疑成为互联网行业的焦点话题&#xff0c;曾经炙手可热的大数据架构似乎淡出公众视野。然而&#xff0c;大数据领域并未停滞不前&#xff0c;反而快速演进&#xff0c;传统依赖众多开源组件的大数据平台正逐步过渡到以融合与简化为核心特…

SQL语句的案例分析

根据提供的图片内容&#xff0c;这段文字看起来像是一个SQL查询的一部分&#xff0c;特别是一个用于删除数据的语句。以下是对这段SQL的核心内容整理&#xff1a; ### 核心内容整理&#xff1a; 1. **删除操作**&#xff1a; - 使用DELETE语句来删除数据。 2. **子查询**…

Java 并发集合:CopyOnWrite 写时复制集合介绍

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 016 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

如何查看xpf文件

xpf文件是什么 XPF文件是“XML Paper Specification File”的缩写&#xff0c;它是一种文件保存格式&#xff0c;具有以下特点和相关信息&#xff1a; 一、定义与用途 定义&#xff1a;XPF文件用于保留文档的固定布局&#xff0c;包括文本、图片以及其他文档元素的确切位置。…

mysql-sql-第十三周

学习目标&#xff1a; sql 学习内容&#xff1a; 37.查询各科成绩最高分、最低分和平均分&#xff1a; 以如下形式显示&#xff1a;课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 及格为>60,中等为&#xff1a;70-80,优良为&#xff1a;80-90,优秀…