官方文档地址 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 = ;    // my event 0. could be used as "group units"
byte[] content = new byte[] { , , , }; // 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 == )
{
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,您只在内容过滤器中具有该键/值对。

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

Photon PUN 三 RPCs & RaiseEvent的更多相关文章

  1. Photon PUN 一 介绍

    有句话说的好 , 官网永远是最好的学习地方 . 虽然国内的资料不多 , 但是官网的资料还是很充足 , 这就带着英汉词典就着作阅读理解的劲头去官网学习吧 https://doc.photonengine ...

  2. Unity - Photon PUN 本地与网络同步的逻辑分离 (一)

    服务器大家可以使用Photon官网提供的,这样会变得很简单,直接搭建下就好.或者下载到本地开启本地端Photon服务器 (大家也可以使用和我一样方式有时间做了个winform 程序用来管理本地服务器开 ...

  3. Photon PUN 二 大厅 & 房间

    一, 简介 玩过 LOL , dota2, 王者荣耀 等MOBA类的游戏,就很容易理解大厅和房间了. LOL中一个服务器就相当与一个大厅; 什么电一,电二 ,,, 联通一区等 每一个区就相当于一个大厅 ...

  4. Unity - Photon PUN 本地与网络同步的逻辑分离 (二)

    上篇实现了事件系统的设计,这篇就来结合发送RPC消息 并且不用标记 [PunRPC] 先来看下上编的代码 GameEnvent.cs private static Dictionary<Comm ...

  5. 使用Photon引擎进行unity网络游戏开发(三)——网络游戏大厅及房间

    使用Photon引擎进行unity网络游戏开发(三)--网络游戏大厅及房间 Photon PUN Unity 网络游戏开发 连接到Photon ConnectUsingSettings 设置你的客户端 ...

  6. 使用Photon引擎进行unity网络游戏开发(四)——Photon引擎实现网络游戏逻辑

    使用Photon引擎进行unity网络游戏开发(四)--Photon引擎实现网络游戏逻辑 Photon PUN Unity 网络游戏开发 网络游戏逻辑处理与MasterClient 网络游戏逻辑处理: ...

  7. 使用Photon引擎进行unity网络游戏开发(二)——Photon常用类介绍

    使用Photon引擎进行unity网络游戏开发(二)——Photon常用类介绍 Photon PUN Unity 网络游戏开发 Photon常用类介绍: IPunCallback PUNGIPunCa ...

  8. 使用Photon引擎进行unity网络游戏开发(一)——Photon引擎简介

    使用Photon引擎进行unity网络游戏开发(一)--Photon引擎简介 Photon PUN Unity 网络游戏开发 Photon引擎简介: 1. 服务器引擎: 服 务 器 引 擎 介 绍 服 ...

  9. Unity3d客户端与Photon服务器数据通信

    今天先介绍一下Photon服务器是什么,可以做什么,为什么要使用它? Photon:开发多人联网游戏最轻松的方案!可以迅速简单实现多人实时在线网络游戏(pvp). Photon:透过位于各地的Phot ...

随机推荐

  1. 云小课 | IPv4枯了,IPv6来了

    摘要:本篇主要分享IPv4与IPv6的区别和IPv6的应用场景,助您快速理解华为云IPv6双栈及IPv6 EIP. IPv6的由来 上节课我们讲了公网IP与私网IP,了解了IP地址的一些知识. 我们一 ...

  2. 当asp.net core偶遇docker一(模型验证和Rabbitmq 三)

    继续上一篇 上一篇,从core方式实现了一个Rabbitmq发送队列消息的接口,我们现在需要在模型验证里面加入验证失败就发送消息的部分 [AttributeUsage(AttributeTargets ...

  3. Python嫌多(线程/进程)太慢? 嫌Scrapy太麻烦?没事,异步高调走起!——瓜子二手车

    基本概念了解: 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我 ...

  4. 【译】10 款国外实用、有趣的 GitHub 简介 README

    本文翻译自 dev.to 文章<10 Standout GitHub Profile READMEs> 原文链接见:https://dev.to/github/10-standout-gi ...

  5. SpringBoot介绍,快速入门小例子,目录结构,不同的启动方式,SpringBoot常用注解

    SpringBoot介绍 引言 为了使用ssm框架去开发,准备ssm框架的模板配置 为了Spring整合第三方框架,单独的去编写xml文件 导致ssm项目后期xml文件特别多,维护xml文件的成本也是 ...

  6. 拓展欧几里得求 ax + by = c的通解(a >=0, b >= 0)

    #include <iostream> #include <cstdio> #include <algorithm> #include <vector> ...

  7. 冷饭新炒:理解Snowflake算法的实现原理

    前提 Snowflake(雪花)是Twitter开源的高性能ID生成算法(服务). 上图是Snowflake的Github仓库,master分支中的REAEMDE文件中提示:初始版本于2010年发布, ...

  8. 刚体验完RabbitMQ?一文带你SpringBoot+RabbitMQ方式收发消息

    人生终将是场单人旅途,孤独之前是迷茫,孤独过后是成长. 楔子 这篇是消息队列RabbitMQ的第二弹. 上一篇的结尾我也预告了本篇的内容:利用RabbitTemplate和注解进行收发消息,还有一个我 ...

  9. 源代码管理工具 ——Git的介绍与简要教程

    一.Github与Git (一)简介 GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名GitHub. GitHub于2008年4月10日正式上线 ...

  10. Web前端性能优化,应该怎么做?

    摘要:本文将分享一些前端性能优化的常用手段,包括减少请求次数.减小资源大小.各种缓存.预处理和长连接机制,以及代码方面的性能优化等方面. base64:尤其是在移动端,小图标可以base64(webp ...