虚幻引擎网络系统(二)——RPC同步
远端调用Romote Procedure Call
允许客户端或服务端通过网络连接相互发送消息。行为同步,主要作用是将调用和执行进行了拆分。
RPC是借助事件来完成的
RPC执行三种形式
服务端执行(Server) | 在持有当前Actor客户端调用,在服务端执行 |
---|---|
在持有对象的客户端执行(Client) | 在服务端调用,在持有对象的客户端执行 |
所有终端执行(Multicast) | 在服务端调用,在所有终端执行 |
这样没法做到客户端与服务器的颜色一样
第二个需求:按下F改对方颜色
在客户端中,当前终端的PlayerController,Pawn,PlayerState的所有权均属于当前终端。
——————————————————
按下F改方块颜色
让盒子变颜色的诉求是从角色发出,现想让他从cube发出:
自定义函数,改成纯函数
Q:在客户端是否所有对象都可以执行RPC?
不是,cube不属于当前客户端,属于服务器,所以不具备借助当前终端的Connection向服务器带消息。
- 执行RPC的前提是此Actor需要在网络上被复制(Replicates)
- 服务端,权威,RPC三种通讯方式均可
- 客户端,只有当Actor属于当前终端时,才可以在Actor身上执行Server调用。
在客户端中,当前终端的PlayerController,Pawn,PlayerState的所有权均属于当前终端。
修改所有权
Actor的所有权是可以修改的
修改动作必须发生在服务器,调用Actor成员函数SetOwner即可
例如:玩家拾取地上的枪械时,没有拾取时,枪械没有归属关系,当拾取后,枪械所有权要修改给拾取玩家所在终端的PlayerController。
随机数种子
在服务端上调用RPC
Actor所有权 | 未复制 | NetMulticast | Server | Client |
---|---|---|---|---|
Client-Owned Actor | 在服务器上运行 | 在服务器和客户端上运行 | 在服务器上运行 | 在Actor的所属客户端上运行 |
Server-owned actor | 在服务器上运行 | 在服务器和客户端上运行 | 在服务器上运行 | 在服务器上运行 |
unowned actor | 在服务器上运行 | 在服务器和客户端上运行 | 在服务器上运行 | 在服务器上运行 |
在客户端上调用RPC
Actor所有权 | 未复制 | NetMulticast | Server | Client |
---|---|---|---|---|
Owned by invoking client(当前终端所有权) | 在执行调用的客户端上运行 | 在执行调用的客户端上运行 | 在服务器上运行 | 在执行调用的客户端上运行 |
Owned by a different client(当前终端所有权) | 在执行调用的客户端上运行 | 在执行调用的客户端上运行 | 丢弃 | 在执行调用的客户端上运行 |
Server-owned actor | 在执行调用的客户端上运行 | 在执行调用的客户端上运行 | 丢弃 | 在执行调用的客户端上运行 |
unowned actor | 在执行调用的客户端上运行 | 在执行调用的客户端上运行 | 丢弃 | 在执行调用的客户端上运行 |
总结
- RPC必须从Actor上调用
- RPC在蓝图中是通过”事件“来完成的
- 只有当Actor对象在网络中开启了Replicates,才可以完成RPC动作
- 一般来说Client,Multicast在服务器调用,Server在客户端调用
- 区分当前对象所在终端的方法是通过网络身份判定,网络身份只有当对象开启了网络同步才可以获得。
- 修改对象所有权需要在服务器完成,并且所有者设置到终端的PlayerController上
- PlayerContoller负责网络的链接工作,当设置Actor的Owner后,该Actor在PlayController终端上可以执行Server动作