RPC
一、Remote Procedure Call:遠程程序調用
二、一個進程調用另外一個進程上的函數
由於“Server-shoot”方法被標記為“在服務器上運行”,所以盡管是在第二個窗口(客戶端)開火,輸出的信息是:Server:准備射擊,表明這是在服務器上運行。
在服務器上“Server-shoot”方法又調用調用了“MutiCast-Shoot”方法,“MutiCast-Shoot”(被標記為“多路傳送”),所以服務器會通知所有客戶端都去執行這個方法。
結果就顯示:Server:全體射擊和Client 1:全體射擊。
因為沒有勾選“運行專用服務器”,因此第一個窗口同時是服務器和客戶端,“多路傳送”的時候也把消息傳送給也身兼客戶端的自己,因此就會顯示“Server:全體射擊”
二、遠程調用Actor擁有權。
- 如果通過Get All Actors Of Class函數獲得到客戶端A控制的角色實例賦值給標記為“在服務器端運行”的方法“Server-shoot”(目標默認是self),在客戶端B上運行(把客戶端B實例賦值給“Server-shoot”的目標參數),服務器上並不會去執行這個操作,被舍棄了,當然也不會被傳播到其他客戶端。
- 但如果是在服務器上調用標記為“在服務器端運行”的方法“Server-shoot”,不管“Server-shoot”的目標參數賦值給誰,都會被執行,也會被傳播到其他客戶端。
玩家A通過執行標識為Run On Server的開槍事件來通知服務器玩家A開槍了,服務器接收到玩家A的開槍通知,通過標識為“多路傳播”的方法“開火動作”,來告訴所有客戶端的玩家A鏡像執行“開火動作”
下面的表格根據執行調用的 actor 的所有權(最左邊的一列),總結了特定類型的 RPC 將在哪里執行。
從服務器調用的 RPC
Actor 所有權 |
未復制 |
|
|
|
---|---|---|---|---|
Client-owned actor (客戶端擁有Actor所有權) |
在服務器上運行 |
在服務器和所有客戶端上運行 |
在服務器上運行 |
在 actor 的所屬客戶端上運行 |
Server-owned actor (服務器端擁有Actor所有權) |
在服務器上運行 |
在服務器和所有客戶端上運行 |
在服務器上運行 |
在服務器上運行 |
Unowned actor (沒有擁有者的Actor) |
在服務器上運行 |
在服務器和所有客戶端上運行 |
在服務器上運行 |
在服務器上運行 |
從客戶端調用的 RPC
Actor 所有權 |
未復制 |
|
|
|
---|---|---|---|---|
Owned by invoking client (Actor被所調用的客戶端擁有所有權) |
在執行調用的客戶端上運行 |
在執行調用的客戶端上運行 |
在服務器上運行 |
在執行調用的客戶端上運行 |
Owned by a different client (Actor被其他客戶端擁有所有權) |
在執行調用的客戶端上運行 |
在執行調用的客戶端上運行 |
丟棄 |
在執行調用的客戶端上運行 |
Server-owned actor (Actor被服務器端擁有所有權) |
在執行調用的客戶端上運行 |
在執行調用的客戶端上運行 |
丟棄 |
在執行調用的客戶端上運行 |
Unowned actor (沒有擁有者的Actor) |
在執行調用的客戶端上運行 |
在執行調用的客戶端上運行 |
丟棄 |
在執行調用的客戶端上運行 |
關於RPC遠程調用更多信息查看官方文檔:http://api.unrealengine.com/CHN/Gameplay/Networking/Actors/RPCs/index.html