ue4c联网rpc框架开发吃鸡_第1页
ue4c联网rpc框架开发吃鸡_第2页
ue4c联网rpc框架开发吃鸡_第3页
ue4c联网rpc框架开发吃鸡_第4页
ue4c联网rpc框架开发吃鸡_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、UE4C+RPC 联网基础文档(持续更新)简介 :RPC , 全称 : Remote procedure calls相关文档 :过程调用官方基础官方蓝图案例1, Actor<1> bNetLoadOn= bool这个变量是给一开始就放置在场景中的对象使用的如果 bNetLoadOn象如果 bNetLoadOn象设置为 true, 当客户端连接上服务端时, 客户端也会这个对设置为 false, 当客户端连接上服务端时, 客户端这个对SetReplicates 无论是否为 true 都影响这个变量的作用<1> SetReplicates(bool)调用 SetReplica

2、tes(true) 设置 Actor 可以调用 SetReplicates(false) 设置 Actor 不可以当在服务端 Spawn 可当在客户端 Spawn 可的 Actor 时, 客户端会生成Actor 时, 客户端生成2, 状态(1) AActor 的 HasAuthority(), 返回 true 是说明 Actor 是该端创建的角色在关卡蓝图或者是 GameMode 以及默认放在场景中的 Actor 等对象使用这个函数可以用来判断是否是服务端, 因为关卡蓝图和 GameMode 与默认放在场景中的对象可以看做是由服务端生成的(2) Actor 的角色AActor 中都有个 ENe

3、tRole Role 变量是用来识别角色的 Actor 的几个值:ROLE_None:的。ENetRole 的ROLE_SimulatedProxy:这个 actor 是其他客户端在本机客户端的一个模拟ROLE_AutonomousProxy:这个 actor 是本机客户端的ROLE_Authority:这个 actor 是服务器上的 actor 示例代码 :void AMyNetCharacter:BeginPlay()Super:BeginPlay(); switch (Role)的角色case casecaseROLE_Authority: Flag = "ROLE_Autho

4、rity" break;ROLE_SimulatedProxy: Flag = "ROLE_SimulatedProxy" break;ROLE_AutonomousProxy: Flag = "ROLE_AutonomousProxy"break;default: Flag = "ROLE_None"(3) 是否是服务端, 不推荐使用 HasAuthority()来推荐使用 GetWorld()->IsServer()或者 GetNetMode()(4) 端的使用 GetNetMode()函数可以获取端的属性 ENe

5、tMode, NM_Standalone 单独端, 单机游戏如下NM_DedicatedServerNM_ListenServer服务器服务器NM_客户端NM_MAX 官方没有解释参考文档 :3, 联网变量联网变量只有在服务端修改才会更新到服务端和所有客户端, 在客户端修改只会更新所在客户端, 对服务端和其他客户端没有影响(1) 首先用 UPROPERTY(Replicated, .)定义变量, 如 :UPROPERTY(Replicated) FString Inventory;(2) 必须在 cpp 文件重写 GetLifetimeReplicatedProps, 如 :void ARPC

6、ProjectCharacter:GetLifetimeReplicatedProps(TArray<FLifetimeProperty > & OutLifetimeProps) constSuper:GetLifetimeReplicatedProps(OutLifetimeProps);.注意, 重写这个不需要在.h 文件进行(3) 添加头文件在上面的重写#include "UnrealNetwork.h"里用宏变量到联网系统DOREPLIFETIME(ARPCProjectCharacter, Inventory); / 所有端的对象都更新DOR

7、EPLIFETIME_CONDITION(ARPCProjectCharacter, 属性仅发送至 actor 的所有者DOREPLIFETIME_CONDITION(ARPCProjectCharacter, 属性将发送至除所有者之外的每个连接DOREPLIFETIME_CONDITION(ARPCProjectCharacter,Inventory,COND_OwnerOnly);/ 该Inventory,COND_SkipOwner);/ 该Inventory,COND_Custom); /该属性没有特定条件,但需要通过 SetCustomI条件参考官方文档 :iveOverride 得

8、到开启/关闭能力s/index.html(4) RepNotify 和 ReplicatedUsing参考文档 :功能是在可的 Actor 下定义某个值, 这个值绑定某个, 当在服务端这个值修改时, 需要再调用一次, 当绑定的会在客户端执行, 如果想要在服务端也执行绑定的在客户端修改这个值或者执行这个值绑定的时, 只会对所在的客户端有效果, 对服务端和其他客户端没有效果如 :.h 文件UPROPERTY(ReplicatedUsing = OnRep_变量名) bool 变量名;UFUNCTION()void OnRep_变量名();.cpp 文件/修改变量值, 修改变量名的话客户端会执行 O

9、nRep_变量名(), 但执行服务端的变量名 = true;/执行变量, 会在服务端执行 OnRep_变量名(), 但是在客户端执行OnRep_变量名();/所以如果要在服务端和客户端都执行, 必须两个语句一起写4, 联网参考文档(1) Reliable 和 UnreliableReliable 一定会执行Unreliable 在网络不时候可能会丢弃(2), Server, NetMulticast: 如果在服务器运行, 会在拥有该 Actor 的客户端上调用; 如果在客户端调用,只会在当前客户端上执行Server : 客户端调用时, 在服务器运行, 通常用于客户端给服务器传递数据, 服务端调

10、用只在服务端运行NetMulticast:在服务端调用, 会广播到所有客户端(3) WithValidation 进行安全检查, 如果是使用 Server 函数, 一定要在 UFUNCTION 内添加这个, 并且在.h 文件void名_Implementation(var) 与 bool名_Validate(var)并且在.cpp 文件实现, 而名本身的不同实现, 其中, 但是有些类型不能作_Implementation 实现逻辑, _Validate 内实现安全检验, 防止为参数, 比如 FString, 编译会报错案例 :示例 :.h 文件UFUNCTION(Server, Reliabl

11、e, WithValidation) void ServerMove(FVector Velocity, bool bSweep);virtual bool ServerMove_Validate(FVector Velocity, boolbSweep);virtual void ServerMove_Implementation(FVector Velocity, bool bSweep);.cpp 文件bool ASWeapon:ServerHandleFiring_Validate()return true;/默认返回为 truevoid ASWeapon:ServerHandleFi

12、ring_Implementation()/具体的函数逻辑服务器联网游戏流程5, UE(1) GameMode<1>GameMode 只在服务端, 可以用来管理服务端对象和客户端对象<2>创建项目时, 会自动生成 项目名 GameMode 类, 如果没有在编辑器的 WorldSetting 中指定 GameMode, 运行游戏后会自动使用这一个 GameMode 来作为游戏的 GameMode<3>GameMode 的 DefaultPawnClass 需要设置, 如果不设置的话会默认给设置为DefaultPawn 类, 如果要使用定义的角色类,需要把 De

13、faultPawnClass 设置为 NULL,然后在 PostLogin 以及 Logout 等函数进行角色的生成<4>重写 GameMode 下的 PostLogin 函数, 在每次有新的端链接上服务端时(服务端创建己也会调用), 会调用这个额函数并且传入对应端的器 PlayerController, 可以再这个里生成自定义的角色并且添加到对应器的 Process 让对应端进行, 这样子的话角色就都是在服务端进行生成的, 在服务端调用角色的 HasAuthority()会返回 true,在客户端调用角色的 HasAuthority()会返回 false. 如果不重写这个 Pos

14、tLogin, 而是在 WorldSetting 下设定 DefaultPawnClass 为自定义的角色类, 那么客户端的角色依然是由服务端端生成的, 那么客户端调用角色的 HasAuthority()会返回 false, 在服务端调用角色的 HasAuthority()会返回 true;(推荐重写 PostLogin 进行处理)<5>重写 GameMode 下的 Logout 函数, 可以处理客户端登出时的逻辑<6>GameMode 提供 RestartPlayer 函数寻找可用的 PlayerStart 点并且重新生成角色,其最主要的目的就是寻找生成点, 可以在

15、PostLogin 中通过 NewPlayer->GetPawn()是否存在, 如果的话, 可以销毁, 重写 RestartPlayer 函数, 销毁角色后调用RestartPlayer 函数, 把 NewPlayer(PlayerController)参数传入进行自定义的重新生成对象, 类似函数还有 RestartPlayerAtPlayerStart 以及 RestartPlayerAtTransform, 如果书写生成点逻辑的话可以不用调用这个函数(2) 使用 exe 后缀输入和 open IP 地址联网/这里只讨论 NM_Standalone, NM_ListenServer 以

16、及 NM_的情况<1> NM_Standalone -> 打包出 exe 后, GetNetMode()返回 NM_Standalone 类型,HasAuthority()都是 true, 如果在不创建快捷方式直接运行 exe, 执行在这个状态下打印 GetWorld()->IsServer()以及服务器的情况下, 运行命令行 open127.0.0.1 , 该单独端就会链接上服务器, 执行 GetNetMode()返回 NM_类型,打印 GetWorld()->IsServer()以及 HasAuthority()都是 false, 如果再次运行命令行open

17、127.0.0.1 , 该端会先断开服务器, 然后再链接一次<2> NM_ListenServer -> 打包出来的 exe 生成快捷方式, 并且在快捷方式的属性下在exe 结尾添加 ?listen , 如 : RPCProject.exe ?listen, 运行该快捷方式就会运行服务器端, 执行 GetNetMode()返回 NM_ListenServer 类型, 打印 GetWorld()->IsServer()以及 HasAuthority()都是 true, 如果运行命令行 open 127.0.0.1, 该变成单独端 NM_Standalone服务器端就会&l

18、t;3> NM_-> 打包出来的 exe 生成快捷方式, 并且在快捷方式的属性下在 exe 结尾添加 127.0.0.1 -game , 如 : RPCProject.exe 127.0.0.1 -game, 运行该快捷方式, 如果端, 就会链接上服务器, 成为客户端, 执行 GetNetMode()返回 NM_类型, 打印 GetWorld()->IsServer()以及 HasAuthority()都是 false(3) 创建寻找加入会话蓝图模式(这里只实现局域网)创建 UMG 添加两个按钮, 一个叫 LANHostButton, 给服务端创建会话并且加入场景,一个叫 L

19、ANButton,给客户端寻找以及加入会话,分别添加按键<1> 服务端点击 LANHostButton 后, 会执行 CreateSession, 创建一个会话, 填入的PlayerController 是本地的 PlayerController, Public Connections 必须不为 0, UseLAN为 true, 这样子填写客户端使用 FindSessions 时才能够寻找到 Session 并且 Session不为 0, 创建 Session后要进行场景转换, 调用 OpenLevel 函数, Absolute 设置为true, 必须在 Options 填入 listen 才能开启服务器服务器, 不添加的话客户端就没办法进入<2> 服务端点击 LANButton 后, 会先执行 FindSessions, 来寻找的会话,填入的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论