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 ...
随机推荐
- TOP命令各个参数代表意义详解
Top命令是Linux下常用的系统性能分析工具,能实时查看系统中各个进程资源占用情况. top - 16:24:25 up 284 days, 4:59, 1 user, load average: ...
- ant+findbugs 扫描代码生成报告
1. 下载安装ant.findbugs 下载ant.findbugs最新压缩包解压到本地磁盘合适位置,比如: D:\Program Files\apache-ant-1.9.7 D:\Program ...
- 虚拟机VMware与主机共享文件介绍
我们经常会在Windows平台安装虚拟机VMware,不管是出于实验测试还是工作需要,伴随而来的就是经常需要在Windows系统和虚拟机系统之间进行共享数据文件,例如,需要将Window主机上的Ora ...
- Provider:SSL Provider,error:0-等待的操作过时
今天一同事使用SSMS 2012 连接数据库时,遇到了"provider:SSL Provider,error:0-等待的操作过时",搜索了一下,遇到一哥 们也遇到这个问题:SQL ...
- C# 中的var关键字
var 是3.5新出的一个定义变量的类型 其实也就是弱化类型的定义 VAR可代替任何类型 编译器会根据上下文来判断你到底是想用什么类型的 至于什么情况下用到VAR 我想就是你无法确定自己将用的是什么类 ...
- DIV+CSS规范命名大全
网页制作中规范使用DIV+CSS命名规则,可以改善优化功效特别是团队合作时候可以提供合作制作效率,具体DIV CSS命名规则CSS命名大全内容篇. 常用DIV+CSS命名大全集合,即CSS命名规则 D ...
- WPF 自定义CheckBox
WPF中原始的CheckBox样式很简单,有时候不适用于WPF那种炫酷的界面. 本章节讲述如何设计一个匹配业务需要.好看的CheckBox(继上篇<WPF-自定义ListBox>中的Che ...
- redis 源码阅读 内部数据结构--字符串
redis的内部数据结构主要有:字符串,双端链表,字典,跳跃表. 这里主要记录redise字符串的设计.相关的源码位于:src/sds.h 和 src/sds.c. 一 字符串 sds的结构体 s ...
- 2016.10.30 NOIP模拟赛 day2 PM 整理
满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...
- Django 1.9 支持中文(转)
昨天Django1.9发布了,今天我才刚开始学习Django,然后有一个问题就卡住了——如何支持中文?上网上查了好多资料都不好使,最后我搜索Django文件夹才发现,在1.9版本里,简体中文代码是zh ...