官方文檔地址 https://doc.photonengine.com/en-us/pun/current/manuals-and-demos/rpcsandraiseevent
一, RPC Photon PUN RPC的使用
Photon中使用PUNRPC 需要PhotonView這個組件
在函數前加上 [PunRPC] 標簽就能使該函數在遠程客戶端(在同一個房間)中被調用。
[PunRPC] void ChatMessage(string a, string b) { Debug.Log(string.Format("ChatMessage {0} {1}", a, b)); }
要調用標記為RPC的函數,需要一個PhotonView
。示例調用:
PhotonView photonView = PhotonView.Get(this); photonView.RPC("ChatMessage", PhotonTargets.All, "jup", "and jup!");
Pro提示:如果你的腳本是Photon.MonoBehaviour或者Photon.PunBehaviour你可以使用:this.photonView.RPC()。
所以,不是直接調用目標方法,而是在PhotonView上調用RPC(),並提供調用方法的名稱。
注意:RPC函數必須掛在有PhotonView組件的GameObject上。
RPC 與 RaiseEvent 傳遞的參數只有基礎類型
type (C#) | size [bytes] (photon_sizeof) |
---|---|
byte | 2 |
bool (boolean) | 2 |
short | 3 |
int (integer) | 5 |
long | 9 |
float | 5 |
double | 9 |
String | 3 + sizeof( UTF8.GetBytes(string_value) ) |
Object[] (Object-array) | 3 + photon_sizeof(elements) |
byte[] (byte-array) | 5 + length |
array (array of type T, T[]) | 4 + photon_sizeof(elements) - length * type_info(T) |
Hashtable | 3 + photon_sizeof(keys) + photon_sizeof(values) |
Dictionary<Object,Object> | 5 + photon_sizeof(keys) + photon_sizeof(values) |
Dictionary<Object,V> | 5 + photon_sizeof(keys) + photon_sizeof(values) - count(keys) * type_info(V) |
Dictionary<K,Object> | 5 + photon_sizeof(keys) + photon_sizeof(values) - count(keys) * type_info(K) |
Dictionary<K,V> | 5 + photon_sizeof(keys) + photon_sizeof(values) - count(keys) * (type_info(K) + type_info(V)) |
以及 Unity類型
type (C#) | sizeof [bytes] | code | description |
---|---|---|---|
Vector2 | 12 | 23 (W) | 2 floats |
Vector3 | 16 | 22 (V) | 3 floats |
Quaternion | 20 | 17 (Q) | 4 floats |
PhotonPlayer | 8 | 16 (P) | integer PhotonPlayer.ID |
其他類型需要自行實現序列化以及反序列化 https://doc.photonengine.com/en-us/pun/current/reference/serialization-in-photon
二, RaiseEvent
RaiseEvent既是事件的發送與接收 , 不需要PhotonView組件.
① 發送事件
byte evCode = 0; // my event 0. could be used as "group units" byte[] content = new byte[] { 1, 2, 5, 10 }; // e.g. selected unity 1,2,5 and 10 bool reliable = true; PhotonNetwork.RaiseEvent(evCode, content, reliable, null);
evCode 自定義的EvenCode必須在 [0-200) 中, 200以上為Photon保留的事件碼.
Content也只能是 byte數組
reliable 是否可靠 如同UDP與TCP的差別
② 接收事件
需要在PhotonNetwork.OnEventCall中注冊.
// setup our OnEvent as callback: void Awake() { PhotonNetwork.OnEventCall += this.OnEvent; } // handle events: private void OnEvent(byte eventcode, object content, int senderid) { if (eventcode == 0) { PhotonPlayer sender = PhotonPlayer.Find(senderid); // who sent this? byte[] selected = (byte[])content; foreach (byte unitId in selected) { // do something } } }
RaiseEvent , Options和事件緩存
使用RaiseEventOptions參數,您可以定義哪些客戶端獲取事件。
最有趣的選項可能是事件緩存/緩沖。PUN使用它來實例化,當新(加入)玩家應該獲得甚至在房間之前發生的事件時,它可以是有效果的。
RaiseEventOptions.EventCaching有三個重要選項:AddToRoomCache,AddToRoomCacheGlobal和RemoveFromRoomCache。在事件發送Hashtable時,這些工作最好。
調用RaiseEvent EventCaching.AddToRoomCache,事件將被放入服務器的緩存中。這意味着,任何后來加入的玩家也將獲得此次活動。新玩家按照到達服務器的順序獲取緩存事件。
播放器離開時,緩存事件會自動從緩存中刪除。為了避免特定事件的發生,請調用RaiseEvent EventCaching.AddToRoomCacheGlobal。這將事件放入“房間的事件緩存”中。
如果您將大量事件放入緩存中,新玩家在進入房間時會收到大量消息。這可能需要一些時間來進行更多的事件,所以你應該清理不再相關的東西,這是完成的EventCaching.RemoveFromRoomCache。
使用RemoveFromRoomCache時,將使用RaiseEvent的EventCode作為過濾器。因此,您可以刪除其中的所有實例,而不是設置某些事件。 為了獲得更精細的控制,事件的內容可以用於過濾。
為此,您必須使用Hashtable作為內容類型。您可以設置一個鍵/值對來標識特定事件,並且當您使用RaiseEvent時RemoveFromRoomCache,您只在內容過濾器中具有該鍵/值對。
您可以通過這種方式識別個別事件,或屬於某些對象或轉彎或其他任何事件。