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 = ; // 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的更多相关文章
- Photon PUN 一 介绍
有句话说的好 , 官网永远是最好的学习地方 . 虽然国内的资料不多 , 但是官网的资料还是很充足 , 这就带着英汉词典就着作阅读理解的劲头去官网学习吧 https://doc.photonengine ...
- Unity - Photon PUN 本地与网络同步的逻辑分离 (一)
服务器大家可以使用Photon官网提供的,这样会变得很简单,直接搭建下就好.或者下载到本地开启本地端Photon服务器 (大家也可以使用和我一样方式有时间做了个winform 程序用来管理本地服务器开 ...
- Photon PUN 二 大厅 & 房间
一, 简介 玩过 LOL , dota2, 王者荣耀 等MOBA类的游戏,就很容易理解大厅和房间了. LOL中一个服务器就相当与一个大厅; 什么电一,电二 ,,, 联通一区等 每一个区就相当于一个大厅 ...
- Unity - Photon PUN 本地与网络同步的逻辑分离 (二)
上篇实现了事件系统的设计,这篇就来结合发送RPC消息 并且不用标记 [PunRPC] 先来看下上编的代码 GameEnvent.cs private static Dictionary<Comm ...
- 使用Photon引擎进行unity网络游戏开发(三)——网络游戏大厅及房间
使用Photon引擎进行unity网络游戏开发(三)--网络游戏大厅及房间 Photon PUN Unity 网络游戏开发 连接到Photon ConnectUsingSettings 设置你的客户端 ...
- 使用Photon引擎进行unity网络游戏开发(四)——Photon引擎实现网络游戏逻辑
使用Photon引擎进行unity网络游戏开发(四)--Photon引擎实现网络游戏逻辑 Photon PUN Unity 网络游戏开发 网络游戏逻辑处理与MasterClient 网络游戏逻辑处理: ...
- 使用Photon引擎进行unity网络游戏开发(二)——Photon常用类介绍
使用Photon引擎进行unity网络游戏开发(二)——Photon常用类介绍 Photon PUN Unity 网络游戏开发 Photon常用类介绍: IPunCallback PUNGIPunCa ...
- 使用Photon引擎进行unity网络游戏开发(一)——Photon引擎简介
使用Photon引擎进行unity网络游戏开发(一)--Photon引擎简介 Photon PUN Unity 网络游戏开发 Photon引擎简介: 1. 服务器引擎: 服 务 器 引 擎 介 绍 服 ...
- Unity3d客户端与Photon服务器数据通信
今天先介绍一下Photon服务器是什么,可以做什么,为什么要使用它? Photon:开发多人联网游戏最轻松的方案!可以迅速简单实现多人实时在线网络游戏(pvp). Photon:透过位于各地的Phot ...
随机推荐
- JDK8的Stream操作
原文:https://mp.weixin.qq.com/s/N2zor5RzuHHTHQLHWVBttg 作者:思海同学 好好学java 其他资料:https://mp.weixin.qq.com/ ...
- spring 命名空间
命名空间太多了,有必要学习了解一下 xmlns是XML Namespaces的缩写 使用语法: xmlns:namespace-prefix="namespaceURI" xsi全 ...
- Spring bean作用范围
1,singleton Spring ioc 容器中仅有一个 Bean 实例,Bean 以单例的方式存在:2,prototype 每次从容器中调用 Bean 时,都返回一个新的实例:3,request ...
- Python使用pyexecjs代码案例解析
针对现在大部分的网站都是使用js加密,js加载的,并不能直接抓取出来,这时候就不得不适用一些三方类库来执行js语句 execjs,一个比较好用且容易上手的类库(支持py2,与py3),支持 JS ru ...
- JDBC工具类—如何封装JDBC
“获得数据库连接”操作,将在以后的增删改查所有功能中都存在,可以封装工具类JDBCUtils.提供获取连接对象的方法,从而达到代码的重复利用. 该工具类提供方法:public static Conne ...
- JS学习第三天
运算符: 赋值运算符 “=” ,将“=”右边的值赋值给左边 比较运算符 “> < >= <= == != ===”, ==比较两边内容是否一致 ...
- Spring Boot 应用程序启动流程分析
SpringBoot 有两个关键元素: @SpringBootApplicationSpringApplication 以及 run() 方法 SpringApplication 这个类应该算是 Sp ...
- leetcode 877. Stone Game 详解 -——动态规划
原博客地址 https://blog.csdn.net/androidchanhao/article/details/81271077 题目链接 https://leetcode.com/proble ...
- 设计模式实战系列之@Builder和建造者模式
前言 备受争议的Lombok,有的人喜欢它让代码更整洁,有的人不喜欢它,巴拉巴拉一堆原因.在我看来Lombok唯一的缺点可能就是需要安装插件了,但是对于业务开发的项目来说,它的优点远远超过缺点. 我们 ...
- 如何解决Mybatis 日期查询时后面带.0
关于如何解决Mybatis 日期查询时后面带.0 MySQL数据库: 直接在MySQL查询语句中解决: SELECT T.ID, T.USERNAME, DATE_FORMAT(t.birthda ...