Photon PUN 三 RPCs & RaiseEvent


 官方文檔地址 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,您只在內容過濾器中具有該鍵/值對。

您可以通過這種方式識別個別事件,或屬於某些對象或轉彎或其他任何事件。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM