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!”.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM