• 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]codedescription
    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,您只在内容过滤器中具有该键/值对。

    您可以通过这种方式识别个别事件,或属于某些对象或转弯或其他任何事件。

  • 相关阅读:
    回调函数实现类似QT中信号机制
    Qt Creator下载和安装(详细教程)
    对象池实现分析
    MongoDB Redis
    双重加锁
    开源项目
    进程创建
    WebAPI性能优化
    StatusCodePagesMiddleware中间件如何针对响应码呈现错误页面
    NET Core + Angular 2
  • 原文地址:https://www.cnblogs.com/laddc/p/6674421.html
Copyright © 2020-2023  润新知