unity3d & photon引擎初尝试

photon引擎 - photon引擎的概述

游戏引擎是指一些已编写好的可编辑游戏系统或者一些互交式实时图像应用程序的核心组件,是游戏软件的主程序,photon引擎比起我们叫熟悉的虚幻3、CryENGINE 3等游戏引擎,这款引擎相对较为陌生,这里为大家简单描述一下这款引擎的特点。 
  Photon英文原意是指光量子,在这里是指九城代理的服务端网络游戏引擎,比起其他服务器端引擎它能支持更多的 传输协议和 编程端口,如下图所示: 
  Photon包含两个部分。一部分是一个socket服务器,另一部分是其针对各个平台编写的sdk。这些平台包括了:android, Flash, iPhone, iPad, .NET., Unity 3D, Windows,甚至还有silverlight。这也意味着Photon的发布也包括两个部分,Client SDK Release和Server SDK Update。 目前Server SDK的版本是v2.4.5,而Client SDK的版本是v6.2.0。 
  什么是SDK?SDK就是指可以为第三方开发者提供特定的软件包、软件框架、硬件平台、操作系统等创建应用软件开发工具的集合,并且SDK还能简单的为某个 程序设计语言提供 应用程序接口API的一些文件。

 

photon引擎 - photon引擎的特性

Photon引擎是一款实时的Socket服务器和开发框架,快速、使用方便、容易扩展。 
  服务端架构在windows系统平台上,采用C#语言编写。 
   客户端SDK提供了多种平台的开发API,包括DotNet、 Unity3D、C/C++以及ObjC等。 
  Photon引擎的体系特性如下: 

 

  1、架构于Windows平台下原生态性能高度优化的系统 
  2、经过证明适用于众多的商业游戏 
  3、由Exit Games提供迅捷到位的支持 
  4、服务器端游戏逻辑采用C#语言实现 
  5、支持广泛的框架设计,能帮助您处理常见的工作内容 
  6、简单易扩展的远程方法调用 
  7、采用 纤程处理消息机制避免采用 线程导致的问题 
  8、提供基于room游戏的基本应用Lite,方便原型开发 
  9、部署简单,支持 云端服务 
  10、充分利用网络带宽 
  11、采用小尺寸的二进制协议,可根据需要使用有序可靠的UDP 
  12、直接支持常见的客户端平台,提供相同的工作流程 
  13、封装每个客户端平台的网络层模块 
  14、通信跨平台 
  15、使用hashtable发送数据,无需担心数据序列化反序列化

 

photon引擎 - photon引擎的相关术语

Ack内部使用的命令,主要功能是用于实现可靠UDP。 
  Actor进入房间的玩家叫“Actor”。Actor在房间内有个编号(ActorNumber),编号仅在当前房间有效。 
   ApplicationApplication指的是游戏逻辑应用,由C#语言书写同时由Photon引擎负责启动运行。所有的应用均从Application继承。 
  Binaries FolderBinariesFolder指的是针对不同平台编译出的Photon目录,以“bin_”为前缀命名目录,且放置在服务端SDK的“deploy”目录中。 
  Build script即MsBuild项目的 批处理文件,实现发布应用时候的 编译程序拷贝文件等功能。请关注VS生成菜单下的清理项目选项。 
  Business logic即游戏逻辑,运行在Photon引擎中,负责处理operation和 event。 
   Channel在Photon引擎中channel主要用于分割通信用,在同一channel中所有的operation和event都是顺序执行的。 
  CommandCommands主要用于在eNet协议层上实现数据传输、建立连接关闭连接等功能。当然您无需书写什么命令,在这里提出来,仅仅是为了加深您对Photon引擎的理解。 
  Connect在 客户端向photon引擎发送请求之前在客户端和服务器之间必须要建立连接才行。 
  Custom Operation任何非客户端API内的或新的服务器端的(不在Lite应用中)客户端操作。 
   DashboardDashboard主要负责收集计数器信息,同时在web站点上生成图标以便于监控。 
  Deploy Folder即发布目录,在服务端SDK中,deploy目录包含了Photon引擎运行的所有需要的文件:Photon核心文件和应用程序文件。 
   Device通常指的是 移动终端,或者其他可以运行客户端程序的设备。 
  Disconnect即服务器和客户端断开操作。通常发生在客户端断开连接或连接超时时候;服务器也可以根据需要断开和客户端之间的连接。 
  EventEvent是异步发送给客户端的事件消息。可以由操作(operations,如sideeffect)触发或引发(这是operation的主要目的)。事件由事件代码(Eventcode)标识,事件来源则是ActorNumber。 
  EvCode即EventCode简称,标识事件的类型以及事件所附带的信息。 
   Game根据上下文,可能是单机的也可能是多个玩家之间有轮次的比赛。Lite则是后者,玩家可以加入到房间内相互游戏。 
   Latency即请求回应时间,服务端和客户端可能有所不同。 
  Lite即Lite应用,您入门的基本游戏逻辑。 
  Lobby大厅,即“Lite大厅”或“游戏房间”。 
  Lobby Roomlobby room是大厅应用的一个特殊的房间。它不关注玩家进出游戏房等操作,而是列出游戏列表供玩家选择。 
  Log FilesPhoton作为服务程序运行,没有图形化界面(GUI),因此需要有日志记录。目前有两套日志:一套是应用的日志,日志文件存于deploy/log目录中;另外是Photon引擎自身的日志,记录到deploy/bin_*/log目录中。 
  Matchmaking负责查找游戏建立比赛。Lite应用无此功能,只能根据名称加入游戏房间。Lite Lobby则是列出了所有游戏房清单出来便于查找。 
  NNet即eNet RUDP之前的叫法,主要由“eNet”和“Neutron”两个单词混合而来。 
  Operation对在Photon服务器端上远程方法调用的另外一种叫法。客户端使用operation可以在服务器上做任何事情,甚至可以发送event给其他客户端。 
  OpCode“Operation Code”的简称。byte类型,用于触发服务器端操作,客户端获取操作返回结果,用opCodes判断返回动作类型。 
  Peer即连接到Photon引擎的客户端,另一方面Photon服务器端也是Peer,且只有一个。 
  Photon Core指的是Photon引擎的核心,由c++语言实现,负责处理连接以及eNet协议。 
  PhotonControlPhoton的管理工具,打开PhotonControl.exe文件即可开启一个托盘应用。 
  PhotonServer.configPhoton引擎的配置文件,主要用于IP、应用以及性能检测设置。以前叫PhotonSocketServer.xml,目前刚刚改为PhotonSocketServer.config。 
  Policy File即证书文件,由证书应用负责发送crossdomain.xml。像Unity Webplayer、Flash以及Silverlight等web游戏平台在连接服务器之前都需要得到授权才可以运行。 
  Reliable即可靠命令,要么到达目的地要么超时断开。可靠命令在信道中是顺序传输的,同时若有丢包情况,则会重复发送直到确认成功收到。 
  ReturnCode每个Operation返回的初步结果,用一个字节的值表示,可以通过ReturnCode检验操作成功与否:RC_OK == 0 表示操作成功,否则操作失败。 
  Room即一组玩家或客户端的集合,可以用于游戏、聊天大厅或者其他方面。Room是Lite框架中的一个类。 
  RUDP即可靠UDP:在UDP协议基础上实现的可靠数据传输协议。 
  Socket Server即Photon引擎的另外一种说法。 
   Timeout使用eNet方式,客户端和服务器端都监视对方消息是否可靠,如果检测到长时间没有回应,则会断开连接。 
  Unreliable不可靠的命令则不需要对方回应,它顺序发送数据,可能会有数据丢失,数据序列有“ 漏洞”。

photon引擎 - photon引擎5分钟快速入门

  选择最新版本的“ExitGames-Photon-Server-SDK”下载。

选择适当版本

  将Photon服务器SDK解压到任意位置,进入“deploy”目录选择适合您当前环境的版本: 
   1.bin_Win32:32位Windows Vista以上版本 
   2.bin_x64:64位Windows Vista以上版本 
   3.bin_Win32_xp:32位Windows XP或者2003 
   4.bin_Win64_xp:64位Windows XP或者2003 
  SDK的deploy目录里面包含了运行Photon需要所有文件,其他目录则是文档目录、类库目录以及源码的目录。

Photon控制台(Photon Control)

 

  运行Photon管理工具:PhotonControl.exe。这是一个托盘应用,程序启动后会创建一个托盘图标。 

 

  Photon Control上的“Run as application”菜单项 
  点击右下角的托盘图标,单击“Photon”下面的子菜单“Start as Application”即可开启Photon服务。 
  启动Photon服务大概会花几秒钟时间,这主要取决于配置的应用情况,部署的应用越多启动就会越慢。

运行Testclient测试客户端

 

   服务端的SDK提供了一个压力测试工具(TestClient),模拟多个客户端连接,可以点击“Photon”下的“Testclient”菜单开启。 
  Testclient是一个命令行工具,可以模拟25个游戏每个游戏4个玩家共100个玩家在线的测试。 

 

  Testclient正常开启的界面 
  另外,也可以下载.NET版本的Photon客户端SDK。里面有个“Realtime Demo”可执行程序,配置连接本地服务器,同时打开两个客户端,每个客户端都可以看到另外一端的显示状态变化。

 

第一个例子:http://www.u3dblog.com/?p=674  unity3d中使用photon服务器引擎一 – unity3d游戏开发

Photon是个好东西,但是网上的入门教程太少了,特别是中文版的。小弟就自己琢磨吧,下面一系列是对Photon的研究过程,如有哪个地方写的有误,望请前辈指教。

首先去PhotonServer SDK下载服务器端SDK,需要登录的,就先注册一个账号吧.

解压出来是四个文件
deploy:主要存放photon的服务器控制程序和服务端Demo
doc:顾名思义,文档
lib:Photon类库,开发服务端需要引用的
src-server:服务端Demo源代码
 

今天搞一个客户端连接服务器最简单的程序,也算是hello world吧

客户端以Unity3d 为基础,hello world包括配置服务器,客户端,客户端连接服务器,客户端状态改变。

第一步:配置服务器端

打开deploy文件夹,看到包含了不同平台编译出的Photon目录,以“bin_”为前缀命名目录,选择你的电脑对应的文件夹打开,看到PhotonControl.exe,运行后,可以在windows右下角看到一个图标,点击图标可以看到photon服务器控制菜单,这个以后再做详细介绍.

 

打开visual stadio,新建项目,选择c# 类库,应用程序名字叫做MyServer.

完成后,把我们的Class1.cs,改名为MyApplication.cs,作为服务器端主类.然后在当前项目添加引用,链接到刚才提到的lib文件夹目录下,添加以下引用:

ExitGamesLibs.dll,Photon.SocketServer.dll,PhotonHostRuntimeInterfaces.dll

然后新建一个类:MyPeer.cs,写法如下:

using System;
using System.Collections.Generic;
using Photon.SocketServer;
using PhotonHostRuntimeInterfaces;

namespace MyServer
{
    public class MyPeer : PeerBase
    {

        public  MyPeer(IRpcProtocol protocol,IPhotonPeer photonPeer)
            : base(protocol, photonPeer)
        { 
            
        }

        protected override void OnDisconnect(PhotonHostRuntimeInterfaces.DisconnectReason reasonCode, string reasonDetail)
        {
            
        }

        protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
        {
            
        }
    }
}

接上,MyApplication.cs类这样写:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Photon.SocketServer;

namespace MyServer
{
    public class MyApplication : ApplicationBase
    {

        protected override PeerBase CreatePeer(InitRequest initRequest)
        {
            return new MyPeer(initRequest.Protocol, initRequest.PhotonPeer);
        }

        protected override void Setup()
        {
            
        }

        protected override void TearDown()
        {
            
        }
    }
}

完成后,在解决方案资源管理器中选中当前项目,打开属性,选择生成选项卡,把输出路径改成bin\,然后就生成类库吧

复制当前项目下MyServer文件夹到deploy文件夹下,删除除了bin文件夹以外其他所有文件和文件夹,然后文本编辑器打开deploy\bin_Win64\PhotonServer.config配置文件(我的是win7 64位机器,就选择这个),添加以下配置:

<Application
                Name="MyServer"
                BaseDirectory="MyServer"
                Assembly="MyServer"
                Type="MyServer.MyApplication"
                ForceAutoRestart="true"
                WatchFiles="dll;config"
                ExcludeFiles="log4net.config">
</Application>    

BaseDirectory:根目录,deploy文件夹下为基础目录

Assembly :是在生成的类库中的bin目录下与我们项目名称相同的.dll文件的名字

Type:是主类的全称,在这里是:MyServer.MyApplication,一定要包括命名空间

EnableAutoRestart:是否是自动启动,表示当我们替换服务器文件时候,不用停止服务器,替换后photon会自动加载文件

WatchFiles和ExcludeFiles

这段代码放在<Default><Applications>放这里</Applications></Default>节点下面

完成后保存,运行托盘程序deploy\bin_Win64\PhotonControl.exe,运行它,如果托盘图标没有变灰,说明服务器运行成功。

 

下面开始编写客户端代码,首先从官网下载Unity SDK

打开Unity3d编辑器,首先把Photon-Unity3D_v3-0-1-14_SDK\libs\Release\Photon3Unity3D.dll导入到Unity中,新建脚本TestConnection.cs,脚本代码如下:

using UnityEngine;
using System.Collections;

using ExitGames.Client.Photon;

public class TestConnection : MonoBehaviour,IPhotonPeerListener {
    public PhotonPeer peer;
    // Use this for initialization
    void Start () {
        peer = new PhotonPeer(this,ConnectionProtocol.Udp);
    }
    
    // Update is called once per frame
    void Update () {
        peer.Service();
    }
    
    void OnGUI(){
        if(GUI.Button(new Rect(Screen.width/2,Screen.height/2,200,100),&quot;Connect&quot;)){
            peer.Connect(&quot;localhost:5055&quot;,&quot;MyServer&quot;);
        }
    }

    #region IPhotonPeerListener implementation
    public void DebugReturn (DebugLevel level, string message)
    {
        
    }

    public void OnOperationResponse (OperationResponse operationResponse)
    {
        
    }

    public void OnStatusChanged (StatusCode statusCode)
    {
        switch(statusCode){
        case StatusCode.Connect:
            Debug.Log(&quot;Connect Success!&quot;);
            break;
        case StatusCode.Disconnect:
            Debug.Log(&quot;Disconnect!&quot;);
            break;
        }
    }

    public void OnEvent (EventData eventData)
    {
        
    }
    #endregion
}

把脚本绑定到场景中物体上,运行后可以看到一个按钮,点击连接,如果连接成功会打印”Connect Success!”.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值