1.网络构架
2.Replication
信息从服务端同步到客服端(单向),Actor及其派生类才有Replication的能力
类型
- Actor Replication(类)
- Property Replication(属性)
- Compoenent Replication(组件)
Actor Replication的两层意义
1.服务端生成,客户端也跟着生成(在服务端生成一个replication对象)
2.当前Actor的所有属性复制,组件复制,RPC的总开关
开启Actor Replication
蓝图:勾选“Replication”
C++:bReplication = true;
cpp文件中的构造函数中
实例演示
Switch Has Authority(Authority:相当于服务端,Remote:相当于客户端)
测试联网状态下的设置
没勾选
勾选后
Property Replication(属性复制的设置方法)
蓝图:属性的Replication设置为Replicated
在服务端设置,如果服务端Replication不设置为Replicated,客户端看不见属性
未设置前
设置后
C++:
- 属性前加UPROPERTY(Replication)
- .cpp文件中,在GetLifetimeReplicatedProps函数中添加:DOREPLIFETIME(类名称,变量名) 不需要声明 该函数
添加属性
VisibleAnywhere:蓝图中也能看见
添加头文件
RepNotift(复制通知)
如果一个变量设置为Rep_Notify,当该变量发生复制时,服务端和收到该值的客户端都可以调用一个自定义的函数
C++仅在客户端调用函数
蓝图:属性的Replication设置为RepNotify即自动生成
当属性的Replication设置为RepNotify,会自动生成一个ONRep的函数
设置后set变量将发生改变
在蓝图中服务端和客户端都可以调用
c++:UPROPERTY(ReolicatedUsing=xxx)
让变量可以复制
3.Ownership
有几个玩家加入就有几个Connection
Ownership的作用
- RPC需要确定哪个客户端将执行运行于客户端的RPC
- Actor复制与连接相关性
- 在涉及所有者时的Actor属性复制条件
设置 /改变/获取Ownership
- SpawnActor(SpawnParanmeters中有Owner)
- SetOwner
- Possess(OnPossess->PosssesssedBy->SetOwner),UnPossess
4.Actor Role
Authority:有控制权
Simulated Proxy:模拟代理权
Autonomous Proxy:自主代理权
Server:服务端,Client:客户端。大笑脸代表自己
5.RPC
类似于函数调用,不过不一定是本地执行
可以实现:
- 客户端调用服务端执行
- 服务端调用客户端执行
不可以有返回值,默认是“不可靠的”(可以设置为可靠的:Reliable)
RPC设置
蓝图:
CustomEvent自定义事件的Replicates选项设置为
- Run On Server(服务端执行)
- Run On Owning Client(客户端执行)
- Net MultiCast(所有端点执行)
C++
要将一个函数声明为RPC,只需将
- Server
- Client
- NetMulticast
关键字添加到UFUNCTION声明
实例
首先要勾选Replication,使其可复制
具体蓝图
详细蓝图
Authorrity:代表服务端,Remote:代表客户端
Is Locally Controlled:是否是本地控制器,及是否是大笑脸
Get Local Role:得到本地角色,及笑脸(判断是否是大笑脸)
客户端调用事件在服务端生成,
仅服务端实现(服务器生成一个,客户端复制一个)
仅客户端实现(两个客户端通过服务器生成,自身复制)
都实现
测试 Multicast
仅在服务端按鼠标右键才打印,服务端和客户端都打印
测试 Server
只有服务端打印
测试 Client
先创建一个GameMode(因为GameMode只在服务端存在)
GameMode里的蓝图
Event onPostLogin:当有玩家连接时调用
Get Remote Role:获取远端角色
Get Local Role:获取本地角色
Has Authority:是否为Authority(相当于是否为服务端)
最终蓝图
GameMode
调用Test Client
调用Test Multicast
Test Server