官方文档地址 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. Tomcat访问图片

    Tomcat访问图片 配置server.xml 在 节点中添加 <Context docBase="D:/Tomcat/tomcat-8083/imgs" path=&quo ...

  2. IDEA-Translation最优秀的翻译插件

    IDEA最优秀的翻译插件 效果 特性 多翻译引擎 Google翻译 有道翻译 百度翻译 多语言互译 文档翻译 语音朗读 自动选词 自动单词拆分 单词本 使用 申请有道智云翻译服务(可选): 注册有道智 ...

  3. python实现单张图像拼接与批量图片拼接

    本文实例为大家分享了python实现图像拼接的具体代码,供大家参考,具体内容如下 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经 ...

  4. NIO(三):Selector选择器

    一.堵塞式与非堵塞式 在传统IO中,将数据由当前线程从客户端传入服务端,由服务端的内核进行判断传过来的数据是否合法,内核中是否存在数据. 如果不存在数据 ,并且数据并不合法,当前线程将会堵塞等待.当前 ...

  5. 从零搭建Spring Boot脚手架(4):手写Mybatis通用Mapper

    1. 前言 今天继续搭建我们的kono Spring Boot脚手架,上一文把国内最流行的ORM框架Mybatis也集成了进去.但是很多时候我们希望有一些开箱即用的通用Mapper来简化我们的开发.我 ...

  6. 卷积神经网络 part2

    [任务一]代码练习 在谷歌 Colab 上完成代码练习,关键步骤截图,并附一些自己的想法和解读.  ● MobileNetV1 网络:简要阅读谷歌2017年的论文<MobileNets: Eff ...

  7. .NET 跨平台框架Avalonia UI: 填坑指北(一):熟悉UI操作

    Avalonia 是一个跨平台的 .NET UI 框架,支持 Windows.Linux.Mac OSX... (以及Android  IOS soon..) 本篇主要介绍Avalonia开发过程和L ...

  8. JVM简记

    1.JVM概述 JVM(Java virtual Machine)指以软件的方式模拟具有完整硬件系统功能.运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现. JVM是一种规范,实现产品常 ...

  9. Vue管理系统前端系列四组件拆分封装

    目录 组件封装 首页布局拆分后结构 拆分后代码 状态管理中添加 app 模块 组件封装 在上一篇记录中,首页中有太多的代码,为了避免代码的臃肿,需要对主要的功能模块拆分,来让代码看起来更简洁,且能进行 ...

  10. 设置Anaconda启动jupyter的默认目录

    要解决的问题:安装好Anaconda后打开jupyter总是会自动跳到c:下的用户目录,通过以下方法可以修改其默认打开的目录 吐槽:竟然没有设置默认打开目录的选项,只能通过修改配置文件完成,让人不爽. ...