因为游戏还处在开发阶段,所以使用的是免费版的Photon(100人),有人数上限限制,然后问题来了,我该如何监测玩家的在线人数呢?下面系统分享以下Photon使用经验。


Photon服务器引擎

  • 一、在线玩家人数监测方法
  • 二、Photon服务器搭建
  • 1、简介
  • 2、配置Photon服务器
  • 3、Photon客户端开发
  • 三、Photon服务器常见问题

一、在线玩家人数监测方法

了解Photon的基本原理可以知道,Photon是通过IPhotonListener.OnStatusChanged()方法告知连接状态的改变,这个方法的参数是枚举类型 StatusCode。

在线用户 redis 在线用户数量限制_网络


这个枚举有以下类型:

在线用户 redis 在线用户数量限制_在线用户 redis_02

没错,就是它!

在线用户 redis 在线用户数量限制_unity_03


当photon监听到用户人数达到并发用户限制,会断开服务器连接。

所以,我们可以用如下方式实现在线玩家人数上限实时监测。

在线用户 redis 在线用户数量限制_数据库_04

public void OnStatusChanged(StatusCode statusCode)
        {
            switch (statusCode)
            {
                case StatusCode.Disconnect:
                    DebugReturn(DebugLevel.INFO, "@@@@@@Disconnect");
                    PlayerController.instance.CancelInvoke();
                    PlayerController.instance.StopAllCoroutines();
                    photonPeer.Connect(ServerAddress, ServerAppName);
                    break;

                case StatusCode.TimeoutDisconnect:
                    DebugReturn(DebugLevel.INFO, "@@@@TimeoutDisconnect");

                    break;
                case StatusCode.DisconnectByServer:
                    DebugReturn(DebugLevel.INFO, "@@@@DisconnectByServer");

                    break;
                case StatusCode.Connect:
                    DebugReturn(DebugLevel.INFO, "@@@@Connected");
                    connected = true;
                    break;
                case StatusCode.Exception:
                    DebugReturn(DebugLevel.INFO, "@@@@Exception");
                    photonPeer.Connect(ServerAddress, ServerAppName);
                    break;
                case StatusCode.ExceptionOnConnect:
                    DebugReturn(DebugLevel.INFO, "@@@@ExceptionOnConnect");

                    break;
                case StatusCode.ExceptionOnReceive:
                    DebugReturn(DebugLevel.INFO, "@@@@ExceptionOnReceive");

                    break;
                case StatusCode.DisconnectByServerUserLimit:
                    Debug.Log("玩家人数超载!");
                    DebugReturn(DebugLevel.INFO, "@@@@DisconnectByServerUserLimit");
                    GameObject.Find("UserOverLoadPanel").SetActive(true);
                    break;

                default:
                    DebugReturn(DebugLevel.ERROR, statusCode.ToString());
                    break;
            }
        }

二、Photon服务器搭建

1、简介

Photon的特点是长连接,是集产品、服务于一体的网络引擎,也是最快、最灵活、最容易上手的网络引擎,可在PC、Mac、浏览器、移动终端、控制台等多个平台上建立可扩展的MMOG、FPS及任何多人在线网络游戏和应用。

Photon地址:https://www.photonengine.com/en/server

Photon引擎收费方式
Photon证书分为个人版与企业版,目前价格如下表所示:
个人版:
无人数限制,价格为4800元
企业版:
500人同时在线 8900元
1000人同时在线 12500元
无人数限制 19600元
备注:个人版、企业版100人同时在线的证书永久免费。

Photon服务器和Unity 3D客户端的通信机制

  1. 发送请求到Photon服务器
  2. 处理Photon服务器返回的响应
  3. 完成游戏房间的操作
  4. 实现自定义事件

详情可参考此博客:Unity 3D Photon服务器

2、配置Photon服务器

Photon地址:https://www.photonengine.com/en/server1.安装Photon SDK
前往Photon官网下载v3.1版本的SDK。下载完毕后解压可得到deploy、doc、lib和src-server共4个文件目录。deploy是各个平台下的photon服务器可执行文件。doc是帮助文件。lib是已经编译好的dll文件,部署服务器时使用。src-server里面是游戏demo源码。

2.运行PhotonControl.exe文件
运行PhotonControl.exe,在工具栏中找到photon服务器的图标,右键选择Default->Start as application(不同版本Photon可能不一样,有的是Default)运行Photon服务器。成功后photon服务器图标是蓝色的,否则就是运行异常。

3.设置Photon配置文件
我们可以通过deploy中不同平台目录下的PhotonServer.config配置文件来修改Photon服务器的配置。在配置文件中,default节点里可以设置传输的最大消息尺寸、最大/最小超时时限。在UDPListener和TCPListener节点中可以设置监听UDP和TCP连接的ip地址和通信端口。在Websocket节点中可以进行Websocket通信的一些设置。Application节点比较重要,每个Application的name在通讯接口方法调用时要用到。

4.检查Windows系统里的端口和防火墙设置
启动Default->Run TestClient ,运行客户端测试程序,如果在运行过程中弹出Windows防火墙提示,就需要在Windows防火墙里开放了Photon配置文件中设定的协议端口。如果没有弹出提示,必要时需要在Windows防火墙高级设置中手动创建入站规则。因为在这种情况下有可能防火墙是针对Photon服务器程序创建的入站规则,不限制使用端口。而我们可以手动创建针对UDP和TCP通信的特定端口的入站规则。

5.Photon异常排查
当我们启动PhotonControl.exe后,点击图标中的Default->Start as application,运行一段时间服务器停止,图标变为灰色,说明Photon服务器运行异常。我们需要先检查一下Photon服务器的端口设置。如果排除了端口和防火墙设置的影响,我们可以通过日志文件Photon-Default查看是否是启动Photon服务器过程中发生了异常。如果排除了Photon服务器启动异常,就需要打开各个游戏服务端程序的日志文件查看是哪个游戏服务器程序异常。

3、Photon客户端开发

1.Unity 3D连接Photon服务器

导入Photon3Unity3D.dll到U3D工程的Assets/Plugins目录下。编写客户端脚本文件与Photon服务器通信,继承IPhotonPeerListener接口并实现OnStatusChanged接口方法。在Update方法中调用PhotonPeer对象的Service方法就可以与Photon服务器通信了。只有调用Service方法,我们才能正常与服务器进行连接和通信。

在线用户 redis 在线用户数量限制_unity3d_05

在线用户 redis 在线用户数量限制_在线用户 redis_06

2.向Photon服务器发送请求

首先需要编写一个SendMessage函数,从客户端向服务器发送请求,使用PhotonPeer对象的OpCustom方法来发送请求。同时需要实现OnOperationResponse和OnEvent接口方法来处理服务器返回的结果。

在线用户 redis 在线用户数量限制_数据库_07

3.处理Photon服务器返回的响应

实现OnOperationResponse函数;

可以通过OperationCode分析服务器返回响应的类型。;

编写函数处理Photon服务器返回的消息;

在线用户 redis 在线用户数量限制_网络_08

4.自定义事件

实现OnEvent函数;

设定游戏操作枚举;

传输自定义数据参数;

在线用户 redis 在线用户数量限制_在线用户 redis_09

三、Photon服务器常见问题

1、Photon引擎是一定要部署在windows平台上的吗?
Photon应用主要基于.net环境,而不限于具体的操作系统平台,但考虑到目前对于linux下.net虚拟机支持不是太完善,因此建议最好使用windows平台作为生产环境。

2、Photon引擎是否提供对数据库的支持?
Photon引擎本身是不提供对数据库操作接口的,开发者可以自行选择使用目前的诸如:Oracle、MS Sql Server、MySql、DB2等主流的关系型数据库以及NHibernate的ORM技术甚至NoSQL技术等。

3、Photon引擎和Unity自带的网络功能比,优点有那些呢?
Photon不能简单的理解为网络库,除了性能强健的服务器端引擎外Photon支持大部分客户端平台,可开发各种平台上的应用,其中就包含了Unity平台。

4、Photon引擎底层网络用什么模型?
Photon引擎的网络核心主要基于Windows平台下最高效的完成端口(IOCP)异步网络模型。

5、Photon引擎的服务器能用C++、VB或者其他开发语言吗?
目前Photon提供的API是C#语言,我们建议使用C#作为应用层面的开发语言;如果使用C++、VB的话也可以,但需要自行做很多额外的工作。

6、Phonton引擎提供基于非托管代码的接口么?
Photon应用主要由Photon内核加载运行,且基于.NET运行环境,因此不提供非托管代码接口。

7、Photon引擎需要自己写网络同步算法吗?
对于同一个网络连接上Photon是能够保证其顺序,无需同步;但在业务层面的同步还需要开发者自行实现。

8、Photon引擎详细收费方式?
Photon证书分为个人版与企业版,目前价格如下表所示:
个人版:
无人数限制,价格为4800元
企业版:
500人同时在线 8900元
1000人同时在线 12500元
无人数限制 19600元
备注:个人版、企业版100人同时在线的证书永久免费

9、Photon个人版证书与企业版证书的区别?
使用个人版证书的开发者会有两方面的限制 :
1、被许可人每月收入低于6万人民币
2、被许可人的产品突出显示Photon的LOGO

10、运行PhotonControl的app 会出现几秒钟内自动停止,这是什么原因?
可能的原因有3种:
1、证书校验没有通过:证书过期或者没有连上浮动证书服务器
2、端口被占用:如酷狗占了848端口或者9090端口被占用;
3、某个应用的程序有问题,也会导致Photon引擎启动不了,一般需要检查应用入口类的构造方法以及setup等方法。

11、为什么使用迅雷等下载工具获取证书不能正常使用?
由于证书生成服务器做了安全校验的缘故,如果使用迅雷等下载工具下载证书文件,则文件内容不正确,从而导致无法正常使用;因此,建议使用另存为方式获取证书文件。

12、Photon支持哪些客户端平台?
目前Photon主要支持:Unity、iOS、Flash、Windows、.NET、Android、Silverlight等。

13、Photon和Unity之间有什么联系?Photon包含了Unity还是Unity包含了Photon?
Photon和Unity是两个较为独立的产品,所专注的技术领域不同,Photon主要提供服务器端引擎功能的支持,同时对各个客户端平台(包括iOS、Android、WinForm、Cocos2D、Flash、SilverLight以及Unity等)提供相关支持,具有执行效率高、开发效率高、开发部署简单以及配置灵活等特点;而Unity则是客户端图形引擎领域的产品。目前Photon和Unity是一种战略合作关系,前者专注于网络和服务器功能,后者专注于客户端图形方面。
Photon客户端SDK提供了对Unity平台以及其他平台的支持,而不是Unity的组成部分。同时Photon可以和任意主流客户端平台进行有效结合。

14、Photon的高版本在功能和使用层面是否能够兼容低版本?
Photon高版本功能以及在使用方面是向低版本兼容的,但是有部分功能需要稍作调整。