Photon服务器进阶&一个新游戏的出产(二)
继续上个文章说~
接收其他人发过来的广播,在OnEvent中进行响应
比如说接收过来加入的消息
public void OnEvent(EventData eventData)
{
Debug.Log("触发了事件:" + eventData.ToStringFull());
//处理服务器转发回来的事件
switch (eventData.Code)
{
case LiteEventCode.Join:
int actorNr = (int)eventData.Parameters[LiteEventKey.ActorNr];
Debug.Log("玩家的编号为:" + actorNr);
break;
}
}
这个消息是系统给的所以能用在LiteEventKey中的Code,而我们要传自定义的数据要怎么弄呢
case (byte)OpCodeEnum.getTag:
Hashtable Message = (Hashtable)eventData.Parameters[LiteEventKey.Data];
int tag = (int)Message[(byte)OpKeyEnum.tag];
break;
OpCodeEnum和OpKeyEnum都是我自定义的枚举,而我们自定义的数据就存在LiteEventKey.Data中,这还没玩,这只是我们传输的哈希表,而真正的数据放在这个哈希表里。
而OnOperationResponse中的数据处理,和以前的还是一样的。这里就不进行讲解了。
说一下一个比较困扰的问题吧,对于指定群发。这回我们不用Lite方式,自己写一个指定群发。
博主这里有两种方法供参考,如有更牛逼的方法请多多指教。同时也是第二种Peer的进阶使用
先说第一种比较容易理解的。
当一个玩家连入服务器的时候就会在Application中新建一个Peer,这样看来,Application是掌管全局的。这样我们就可以用一个字典将每个Peer记录,来进行简单的群发操作。代码如下加在Application中
public Dictionary<int, MyPeer> Peer = new Dictionary<int, MyPeer>();
protected override PeerBase CreatePeer(InitRequest initRequest)
{
//建立连线并回传给Photon Server
MyPeer mypeer = new MyPeer(initRequest.Protocol, initRequest.PhotonPeer);
Peer.Add(mypeer.ConnectionId, mypeer);
return mypeer;
}
public void radioEvent()
{
OperationResponse or = new OperationResponse();
foreach (MyPeer mypeer in Peer.Values)
{
or.ReturnCode = ;
or.DebugMessage = ""; //返回消息
or.OperationCode = (byte)OpCodeEnum.Login; //编码
mypeer.SendOperationResponse(or, new SendParameters());
}
}
现在我们来看看第二种方法,在用第一种方法的时候会发现一个问题,我们怎么向Lite一样,分房间。指定广播(如果有人能解决这个问题谢谢分享),还有怎客户端发送消息给服务器的时候是在Peer端进行处理的,然而怎么调用Application端的群发也是个问题。
我用下面的方法来解决:
namespace Chat
{
public class ChatPeer : PeerBase
{
private static readonly object syncRoot = new object(); public ChatPeer(IRpcProtocol protocol,IPhotonPeer unmanagedPeer) : base(protocol, unmanagedPeer)
{
lock (syncRoot)
{
BroadcastMessage += this.OnBroadcastMessage;
}
} private static event Action<ChatPeer, EventData, SendParameters> BroadcastMessage; protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
{
lock (syncRoot)
{
BroadcastMessage -= this.OnBroadcastMessage;
}
} protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
{
var @event = new EventData() { Parameters = operationRequest.Parameters };
lock (syncRoot)
{
BroadcastMessage(this, @event, sendParameters);
} var response = new OperationResponse(operationRequest.OperationCode);
this.SendOperationResponse(response, sendParameters); } private void OnBroadcastMessage(ChatPeer peer, EventData @event, SendParameters sendParameters)
{
if (peer != this)
{
this.SendEvent(@event, sendParameters);
}
} }
}
首先是一个Action委托(不知道委托是什么意思的可以百度一下)
private static event Action<ChatPeer, EventData, SendParameters> BroadcastMessage; // 静态让他常驻内存
Peer被创建的同时将一个OnBriadcastMessage的委托给BrioadcastMessage
当服务器收到客户端发来的群发消息时,启用委托
BroadcastMessage(this, @event, sendParameters);
将在BroadcastMessage中的委托都执行一遍,通过
if (peer != this) { this.SendEvent(@event, sendParameters); }
来控制给谁群发。很强大的方法。貌似是官方的Demo。
Photon服务器进阶&一个新游戏的出产(二)的更多相关文章
- Photon服务器进阶&一个新游戏的出产(一)
许久没写了,今日闲来无事随性一些,总结一下最近的游戏经历(写游戏) Photon服务器的进阶~ 距离上一篇估计也过去一个多月了,对于Photon真是又爱又恨. 爱着它的书写方便. 恨着它的教程稀少总走 ...
- Photon服务器进阶&一个新游戏的出产(三)
下面或许该介绍介绍我用Photon写的一个4人联机麻将了~ 上图
- unity3d + photon + grpc + nodejs + postgis/postgresql 游戏服务器设计
unity3d + photon + grpc + nodejs + postgis/postgresql 游戏服务器设计 最近做玩票性质的游戏项目,客户端技术是 unity3d 和 android. ...
- 本人第一个android游戏《新连连看》上架
经过艰苦奋战了几天,本人的第一个android游戏<新连连看>最终完毕了第一个版本号,比較简陋.另一部分功能保留没有开放.等第二个版本号再上.用的libgdx框架.可能不是非常出名,可是本 ...
- [Xcode 实际操作]九、实用进阶-(28)在iTunes Connect(苹果商店的管理后台)中创建一个新的新的APP
目录:[Swift]Xcode实际操作 本文将演示如何在iTunes Connect(苹果商店的管理后台)中创建一个新的新的APP. 首先要做的是打开浏览器,并进入[iTunesConnect网站], ...
- 微软.NET年芳15:我在Azure上搭建Photon服务器(C#.NET)
网上火热的“微软.NET年芳15”文章,我也得写点什么嘛,毕竟我还是现任的微软MVP. 摘录网上的“.NET 15周年”信息如下: 微软的 .NET 框架本周迎来了 15 岁生日..NET 的第一个版 ...
- 使用Phaser开发你的第一个H5游戏(一)
本文来自网易云社区 作者:王鸽 不知你是否还记得当年风靡一时的2048这个游戏,一个简单而又不简单的游戏,总会让你在空闲时间玩上一会儿. 在这篇文章里,我们将使用开源的H5框架--Phaser来重现这 ...
- Unity3d客户端与Photon服务器数据通信
今天先介绍一下Photon服务器是什么,可以做什么,为什么要使用它? Photon:开发多人联网游戏最轻松的方案!可以迅速简单实现多人实时在线网络游戏(pvp). Photon:透过位于各地的Phot ...
- Step by Step 创建一个新的Dynamics CRM Organization
原创地址:http://www.cnblogs.com/jfzhu/p/4012833.html 转载请注明出处 前面演示过如何安装Dynamics CRM 2013,参见<Step by st ...
随机推荐
- Petya勒索木马
同事小学妹神好奇心,在陌生群里下载了个软件,接下来就是自动重启无法开机. 找我一看,凭我专业帮妹纸装系统多年的经验,起初也不觉得有啥困难,兼容模式下重启,接下来出现这个: 按下any key后: 试了 ...
- Linux平台卸载MySQL总结
如何在Linux下卸载MySQL数据库呢? 下面总结.整理了一下Linux平台下卸载MySQL的方法. MySQL的安装主要有三种方式:二进制包安装(Using Generic Binaries).R ...
- 【转载】latch: cache buffers chains
本文转自惜分飞的博客,博客原文地址:www.xifenfei.com/1109.html,支持原创,分享知识! 当一个数据块读入sga区,相应的buffer header会被放置到hash列表上,我们 ...
- Shell : debug
调试shell脚本的方法: 使用命令:sh -x yourShell.sh
- javascript-装饰者模式
装饰者模式笔记 在不改变原对象的基础上, 通过对其进行包装拓展(添加属性或方法)使原有对象可以满足用户的更复杂要求. 需求不是一成不变的,需求会不断改进,以增强用户体验 demo实例:对输入框添加fo ...
- 浅谈iptables防SYN Flood攻击和CC攻击
------------------------本文为自己实践所总结,概念性的东西不全,这里粗劣提下而已,网上很多,本文主要说下目前较流行的syn洪水攻击和cc攻击------------------ ...
- LVM 类型的 Storage Pool - 每天5分钟玩转 OpenStack(8)
LVM 类型的 Storage Pool 不仅一个文件可以分配给客户机作为虚拟磁盘,宿主机上 VG 中的 LV 也可以作为虚拟磁盘分配给虚拟机使用. 不过,LV 由于没有磁盘的 MBR 引导记录,不能 ...
- Nova 组件详解 - 每天5分钟玩转 OpenStack(26)
本节开始,我们将详细讲解 Nova 的各个子服务. 前面架构概览一节知道 Nova 有若干 nova-* 的子服务,下面我们将依次学习最重要的几个.今天先讨论 nova-api 和 nova-cond ...
- Xstream学习资料
java中有关xml操作的,我们项目中首推Xstream.至于原因不说了.跟着大众的脚步走应该没错的.有关Xstream的文档如下. 官方文档 XStream完美转换XML.JSON XStream实 ...
- 树莓派搭建ActiveMQ
树莓派上安装ActiveMQ和在其它Linux发行版基本相同,只是在开防火墙端口时有区别. 硬件信息: 树莓派3B型,Raspbian系统 安装 //下载ActiveMQ安装包 http:// ...