UE Gameplay网络复制基础

Gameplay网络基础

基于会话的实时游戏:查找(找到别人的服务器),链接(加入到别人的服务器),同步(同一时间发生的事情都能接收)。

游戏是由输入和状态组成的,玩家输入按键对应技能移动,状态对应死亡,奔跑,攻击,被攻击等等。

点对点 p2p(peer two peer)

UE并没有使用点对点模型,原因1扩展性差2网络连接速度不确定3不公平易作弊。优点:方便只有两个人的时候用点对点模型最佳!

UE使用的是客户端服务器模型(Client-Server)

解决了点对点模型的缺点,由服务器判断客户端的内容真实。总结服务器永远是最权威的,客户端的消息不能相信。

Gamepaly

是指游戏规则、玩家输出与控制、相机和用户界面等核心系统。

AActor->UObject。可以相互嵌套,拥有tick,网络通信通道(指网络同步),组件的容器(其它组件可以挂在上面),可生成的不是所有的actor都是可见的。WorldSetting和关卡蓝图都是actor。

Compoent分ScenceComponent和ActorComponent,ScenceCom可以嵌套拥有世界坐标继承与ActorCom,而ActorCom不可以也没有坐标设置。

Com代表一种能力,可以给Actor提供能力与代码逻辑无关只要使用UE引擎都能使用。

APawn包括ACharacter(人物人性类型的类)和AdefaultPawn(自定义的类,小灰球)->ASpectatorPawn(观众视角的,观看比赛)

可被控制,采用MVC设计,相当于容器。而controller相当于灵魂用来控制pawn,这两个是要连起来一起看。用来写攻击方式比如用枪用手等等。

Controller包括APlayerController(控制玩家即主角)和AAIController(控制怪物)移动攻击相关,但攻击类型方式则是在pawn里面。注:PlayerIndex是给分屏游戏用的,如魂斗罗这种双人游戏。

APlayerState

继承于AInfo,记录pawn和controller的状态。

AGameMode

游戏规则世界规则,一般规定游戏怎么玩,如何胜利。最权威只存在于服务器。继承AInfo->AGameModeBase->AGameMode

AGameState

世界的状态,可以通过网络通知到客户端。继承AInfo->AGameStateBase->AGameState

UGameInstance

游戏的全局实例,可以跨关卡保存数据,不进行网络复制。

继承 UGameEngine->UGameInstance->FWorldContext->UWorld。

USaveGame

游戏存档,数据保存到本地。一般存档保存继承与该类,不继承网络复制。

USubsystem

业务逻辑的组件,自动实例化对象,托管的生命周期。有五类生命周期

  1. UEngineSubsystem-UEngine*Gengine
  2. UEditorSubsystem-UEditorEngine*GEditor
  3. UGameInstanceSubsystem-UGameInstance*GameInstance
  4. UWorldSubsystem-UWorld*World
  5. ULocalPlayerSubsystem-ULocalPlayer*LocalPlayer

多人联机中的GamePlay划分

ServerOnly:仅存在服务器(GameMode)。Server Clients:存在服务器和所有客户端(AGameState,APlayerState,APawn)。Server Owning Client:存在服务器与拥有的客户端(APlayerController)。Owning Client Only:仅存在拥有的客户端(UMG,AHUD)。

专用服务器和监听服务器

专用服务器:不需要客户端的独立服务器,与游戏客户端分开运行,没有可视部分,在游戏中也没有代表他们的角色。

监听服务器:是服务器的同时也是客户端,始终至少连接一个客户端,如果断开连接,服务器将关闭。拥有可视部分。

总结:监听服务器类似于开房创建的玩家,如游戏DOTA,饥荒。专用服务器不是玩家创建的。

Replication

标记为复制的AActor在服务端生成的同时也会在客户端生成,但在客户端生成时仅存在于客户端。

需要设置物体复制SetReplicates(true)和移动复制SetReplicateMovement(true)。

变量属性也可以进行复制,找到Replication有两种模式一种为replicated这个只是单纯的复制,另一个RepNotify这个不仅复制还会提供一个函数,每次数值改变会进行调用。

Role和RemoteRole

ROLE_SimulatedProxyt-----模拟的,由服务器同步过来的,不能控制。

ROLE_AutonomousProxyt-----自制的,自己控制由服务器监管

ROLE_Authorit------权威的,就在服务器上

物体的主控权,如果在服务器看客户端的物体则是权威的,如果是客户端看客户端自己的则是自制的,反之客户端看服务器是权威,看自己不变。

一般判断是否在服务器使用isServer和HasAuthority。

RPC - Remote Procedure Calls——远程过程调用

用于调用在另一个实例上的函数,RPC无返回值,有以下特定规则:Run on Server:将在Actor的服务器实例上执行。Run on owning Client:将在此Actor的所有者上执行。Multicast:在此Actor的所有实例上执行。

RPC注意事项

必须从复制AActor调用。如果从服务器调用RPC以便在客户端上执行,只有实际拥有该Actor的Client才能执行该功能。如果要从Client调用RPC在Server上执行,则Client必须拥有要调用RPC的Actor。

Multicast RPC(多播委托)

如果从服务器调用它们,则服务器将在本地执行它们,并在所有当前连接的客户端上执行它们。

如果从客户端调用它们,它们将仅在本地执行,而不会在服务器上执行。

将RPC标记为Reliable(可靠):确保将执行99.99%的RPC,不要标记所有PRC为可靠,因为会消耗带宽。

RPC可以带Validation(验证):仅支持C++,拥有一个验证函数如,RPC的验证函数检测到任何参数错误,它可以通知系统断开发起RPC调用的客户端/服务器的连接。

(蓝图中使用RPC是需要Event事件,在graph里有replicates属性选择,以及选择是否可靠reliable)

在服务器创建的物体不复制,客户端观看不到但会有作用,如透明墙原理。同样不复制在客户端生成同样会出现透明墙但可以穿过只是会抽搐。如果选择可复制在客户端运行情况和上面一样,但是在服务端生成则全部能看到。

### UE5 Gameplay 开发教程与资料 #### 多样化的学习资源 对于希望深入理解UE5 Gameplay系统的开发者而言,存在多种优质的学习途径。例如,《玩转UE4/UE5动画系统》这一专栏提供了图文并茂以及视频相结合的教学模式[^1]。该专栏由一位经验丰富的游戏程序员维护,在知乎和优快云平台上均能获取相关内容。 #### 特定功能详解 针对Gameplay Ability System (GAS),有专门的文章进行了阐述,指出`GameplayTags`作为一种分层标签机制被集成到了Unreal Engine内部而非仅仅属于GAS的一部分。这种特性允许设计师更加灵活高效地标记物体的状态或行为,从而超越传统布尔值或枚举类型的局限性[^3]。 #### 实践案例分享 另外还有专注于实际应用的经验交流文章,如一篇有关攀爬系统的系列教程不仅概述了整个项目的实现过程还包含了作者个人的心得体会。这为那些想要了解具体技术细节的人士提供了一个很好的起点[^2]。 #### 命名约定指导 为了帮助团队更好地协作开发大规模项目,官方文档也给出了详细的资产命名指南。遵循这些最佳实践可以帮助减少错误发生率,并提高工作效率。特别是当涉及到多人合作时,统一而清晰的命名规则显得尤为重要[^4]。 #### 关键概念解析 最后值得一提的是关于Level的概念解释,它作为场景内所有Actor实例化后的载体起到了至关重要的作用。尽管LevelScriptActor可用于执行某些特定于当前地图的任务,但从长远来看保持业务逻辑独立于任何单一level之外通常是更好的做法[^5]。 ```cpp // 示例:创建一个新的GameMode类来管理全局游戏设置而不是依赖LevelScriptActor class AMyCustomGameMode : public AGameModeBase { public: void BeginPlay() override; }; ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值