继续上个文章说~

接收其他人发过来的广播,在OnEvent中进行响应

比如说接收过来加入的消息

  1. public void OnEvent(EventData eventData)
  2. {
  3. Debug.Log("触发了事件:" + eventData.ToStringFull());
  4. //处理服务器转发回来的事件
  5. switch (eventData.Code)
  6. {
  7. case LiteEventCode.Join:
  8. int actorNr = (int)eventData.Parameters[LiteEventKey.ActorNr];
  9. Debug.Log("玩家的编号为:" + actorNr);
  10. break;
  11. }
  12. }

这个消息是系统给的所以能用在LiteEventKey中的Code,而我们要传自定义的数据要怎么弄呢

  1. case (byte)OpCodeEnum.getTag:
  2. Hashtable Message = (Hashtable)eventData.Parameters[LiteEventKey.Data];
  3. int tag = (int)Message[(byte)OpKeyEnum.tag];
  4. break;

OpCodeEnum和OpKeyEnum都是我自定义的枚举,而我们自定义的数据就存在LiteEventKey.Data中,这还没玩,这只是我们传输的哈希表,而真正的数据放在这个哈希表里。

而OnOperationResponse中的数据处理,和以前的还是一样的。这里就不进行讲解了。

说一下一个比较困扰的问题吧,对于指定群发。这回我们不用Lite方式,自己写一个指定群发。

博主这里有两种方法供参考,如有更牛逼的方法请多多指教。同时也是第二种Peer的进阶使用

先说第一种比较容易理解的。

当一个玩家连入服务器的时候就会在Application中新建一个Peer,这样看来,Application是掌管全局的。这样我们就可以用一个字典将每个Peer记录,来进行简单的群发操作。代码如下加在Application中

  1. public Dictionary<int, MyPeer> Peer = new Dictionary<int, MyPeer>();
  2.  
  3. protected override PeerBase CreatePeer(InitRequest initRequest)
  4. {
  5. //建立连线并回传给Photon Server
  6.  
  7. MyPeer mypeer = new MyPeer(initRequest.Protocol, initRequest.PhotonPeer);
  8. Peer.Add(mypeer.ConnectionId, mypeer);
  9. return mypeer;
  10. }
  11.  
  12. public void radioEvent()
  13. {
  14. OperationResponse or = new OperationResponse();
  15. foreach (MyPeer mypeer in Peer.Values)
  16. {
  17. or.ReturnCode = ;
  18. or.DebugMessage = ""; //返回消息
  19. or.OperationCode = (byte)OpCodeEnum.Login; //编码
  20. mypeer.SendOperationResponse(or, new SendParameters());
  21. }
  22. }

现在我们来看看第二种方法,在用第一种方法的时候会发现一个问题,我们怎么向Lite一样,分房间。指定广播(如果有人能解决这个问题谢谢分享),还有怎客户端发送消息给服务器的时候是在Peer端进行处理的,然而怎么调用Application端的群发也是个问题。

我用下面的方法来解决:

  1. namespace Chat
  2. {
  3. public class ChatPeer : PeerBase
  4. {
  5. private static readonly object syncRoot = new object();
  6.  
  7. public ChatPeer(IRpcProtocol protocol,IPhotonPeer unmanagedPeer) : base(protocol, unmanagedPeer)
  8. {
  9. lock (syncRoot)
  10. {
  11. BroadcastMessage += this.OnBroadcastMessage;
  12. }
  13. }
  14.  
  15. private static event Action<ChatPeer, EventData, SendParameters> BroadcastMessage;
  16.  
  17. protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
  18. {
  19. lock (syncRoot)
  20. {
  21. BroadcastMessage -= this.OnBroadcastMessage;
  22. }
  23. }
  24.  
  25. protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
  26. {
  27. var @event = new EventData() { Parameters = operationRequest.Parameters };
  28. lock (syncRoot)
  29. {
  30. BroadcastMessage(this, @event, sendParameters);
  31. }
  32.  
  33. var response = new OperationResponse(operationRequest.OperationCode);
  34. this.SendOperationResponse(response, sendParameters);
  35.  
  36. }
  37.  
  38. private void OnBroadcastMessage(ChatPeer peer, EventData @event, SendParameters sendParameters)
  39. {
  40. if (peer != this)
  41. {
  42. this.SendEvent(@event, sendParameters);
  43. }
  44. }
  45.  
  46. }
  47. }

首先是一个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服务器进阶&一个新游戏的出产(二)的更多相关文章

  1. Photon服务器进阶&一个新游戏的出产(一)

    许久没写了,今日闲来无事随性一些,总结一下最近的游戏经历(写游戏) Photon服务器的进阶~ 距离上一篇估计也过去一个多月了,对于Photon真是又爱又恨. 爱着它的书写方便. 恨着它的教程稀少总走 ...

  2. Photon服务器进阶&一个新游戏的出产(三)

    下面或许该介绍介绍我用Photon写的一个4人联机麻将了~ 上图

  3. unity3d + photon + grpc + nodejs + postgis/postgresql 游戏服务器设计

    unity3d + photon + grpc + nodejs + postgis/postgresql 游戏服务器设计 最近做玩票性质的游戏项目,客户端技术是 unity3d 和 android. ...

  4. 本人第一个android游戏《新连连看》上架

    经过艰苦奋战了几天,本人的第一个android游戏<新连连看>最终完毕了第一个版本号,比較简陋.另一部分功能保留没有开放.等第二个版本号再上.用的libgdx框架.可能不是非常出名,可是本 ...

  5. [Xcode 实际操作]九、实用进阶-(28)在iTunes Connect(苹果商店的管理后台)中创建一个新的新的APP

    目录:[Swift]Xcode实际操作 本文将演示如何在iTunes Connect(苹果商店的管理后台)中创建一个新的新的APP. 首先要做的是打开浏览器,并进入[iTunesConnect网站], ...

  6. 微软.NET年芳15:我在Azure上搭建Photon服务器(C#.NET)

    网上火热的“微软.NET年芳15”文章,我也得写点什么嘛,毕竟我还是现任的微软MVP. 摘录网上的“.NET 15周年”信息如下: 微软的 .NET 框架本周迎来了 15 岁生日..NET 的第一个版 ...

  7. 使用Phaser开发你的第一个H5游戏(一)

    本文来自网易云社区 作者:王鸽 不知你是否还记得当年风靡一时的2048这个游戏,一个简单而又不简单的游戏,总会让你在空闲时间玩上一会儿. 在这篇文章里,我们将使用开源的H5框架--Phaser来重现这 ...

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

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

  9. Step by Step 创建一个新的Dynamics CRM Organization

    原创地址:http://www.cnblogs.com/jfzhu/p/4012833.html 转载请注明出处 前面演示过如何安装Dynamics CRM 2013,参见<Step by st ...

随机推荐

  1. js实现动态操作table

     本章案例为通过js,动态操作table,实现在单页面进行增删改查的操作. 简要案例如下: <%@ page language="java" contentType=&quo ...

  2. [转]CTO、技术总监、首席架构师的区别

    经常有创业公司老板来拜访我,常常会拜托给我一句话:帮我找一个CTO. 我解释的多了,所以想把这个写下来,看看你到底需要的应该是啥. 一.高级程序员 如果你是一个刚刚创业的公司,公司没有专职产品经理和项 ...

  3. SQL Server修改数据库对象所有者(Owner)浅析

    在SQL Server数据库中如何修改数据库对象(表.视图.存储过程..)的所有者(Owner)呢?一般我们可以使用系统提供的系统存储过程sp_changeobjectowner来修改. 我们先看看s ...

  4. C语言调用curl库抓取网页图片

    思路是先用curl抓取网页源码,然后以关键字寻找出图片网址.   #include <stdio.h> #include <stdlib.h> #include <str ...

  5. 权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现2

    权重轮询调度算法(WeightedRound-RobinScheduling)-Java实现 ----参考Nginx中负载均衡算法实现 与上一遍博客 http://www.cnblogs.com/hu ...

  6. Python实用环境pyenv搭建教程

    实验系统:kubuntu-15.10-desktop-amd64 关于pyenv的介绍:一般在操作系统中我们会安装多个Python版本,在*nix系统中一般默认就自带了Python2与Python3两 ...

  7. 基于Fast Bilateral Filtering 算法的 High-Dynamic Range(HDR) 图像显示技术。

    一.引言 本人初次接触HDR方面的知识,有描述不正确的地方烦请见谅. 为方便文章描述,引用部分百度中的文章对HDR图像进行简单的描述. 高动态范围图像(High-Dynamic Range,简称HDR ...

  8. 【Windows】用信号量实现生产者-消费者模型

    线程并发的生产者-消费者模型: 1.两个进程对同一个内存资源进行操作,一个是生产者,一个是消费者. 2.生产者往共享内存资源填充数据,如果区域满,则等待消费者消费数据. 3.消费者从共享内存资源取数据 ...

  9. BZOJ1055: [HAOI2008]玩具取名[区间DP]

    1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1588  Solved: 925[Submit][Statu ...

  10. java程序设计之完数

    题目:一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3.编程 找出1000以内的所有完数. 解题过程也很简单: public class wanshu { ...