unity photon server 基礎設施

28
使使 Photon Server 使 使使使使使使 Unity 使使使使 DS HEP. I

Upload: -

Post on 16-Apr-2017

696 views

Category:

Education


3 download

TRANSCRIPT

Page 1: Unity Photon server 基礎設施

使用 Photon Server 來建立可以動的 Unity 連線程式DS HEP. I

Page 3: Unity Photon server 基礎設施

學習內容 建立純粹只是可以動的 Unity 連線程式 ( 以電腦桌面平台為主 )

學習指標: 內容: ★★★☆☆☆☆☆☆☆ 深度: ★★☆☆☆☆☆☆☆☆ 實用性: ★★★★★★★☆☆☆

Page 4: Unity Photon server 基礎設施

連線程式基本需求 有一個伺服器端 (Server) 接收來自外部的連線 伺服器端可以接收已連線客戶端 (Client) 的請求並回復 或是 主動傳送資料 有一個客戶端作為使用者操作介面 連接伺服器 兩個可以在同一台電腦上 如果要架設對外的伺服器 要確定伺服器的網路具有實體 IP

Page 5: Unity Photon server 基礎設施

為什麼不從頭開始造 Socket Server 如果只是為了通訊功能 從頭開始造 Socket Server 代價太高 除非有很多時間資源 自己的能力和知識也很充足 不然只是為了通訊功能只是自我毀滅 TCP 分頁 , UDP 可靠性 , 序列化 , 加密 , 安全性 , 附載平衡 , 伺服器對伺服器 , 多平台 可靠性 , 除錯 , 性能 , 分析 等等 有 10 年以上專業知識的公司已經幫你把產品做好了 100 個連線以下免費 除非你想鑽研通訊的部分 不然不建議把時間花在這部份上

Page 6: Unity Photon server 基礎設施

為什麼用 Photon Server 因為我自己學 Unity 線上遊戲看的書用這個 支援許多平台 資訊自己看: http://doc.photonengine.com/zh-tw/onpremise/current/getting-started/photon-server-intro

可以使用 C# 來寫伺服器程式

Page 7: Unity Photon server 基礎設施

準備工作 Photon Server 需要架設在 Windows 平台上 如果你不想用 Windows 可以去研究一下 Photon Server 的 Plugin 或是找找其他的 SDK

有 Unity 開發環境 最好有 Visual Studio 可以用 申請 Photon Engine 帳號 拿 100 連線免費授權 https://www.photonengine.com/zh-tw/account/signup

下載 Server SDK https://www.photonengine.com/zh-tw/OnPremise/Download

有基本的 C# 知識

Page 8: Unity Photon server 基礎設施

準備工作 把 license 丟到 Photon 的資夾 deploy\bin_Win64\ 下 開個 Visual Studio C# 類別庫專案 我把專案名取 PhotonServerExercise

好了之後把自動生成的 Class1 刪掉 給方案加入參考: ExitGames.Logging.Log4Net.dll

ExitGamesLibs.dll

log4net.dll

Photon.SocketServer.dll

PhotonHostRuntimeInterfaces.dll

這些 dll 在 Photon 資料夾 lib\ 下

Page 9: Unity Photon server 基礎設施

建立必要類別 建立 2 個 class 作為伺服器主體 Application 和 與客戶端連結的 Peer

這裡我使用 ExerciseApplication 和 ExercisePeer

首先建立 ExerciseApplication

要 using 以下命名空間 using ExitGames.Logging; using ExitGames.Logging.Log4Net; using log4net.Config; using Photon.SocketServer; using System.IO;

Page 10: Unity Photon server 基礎設施

ExerciseApplication 把類別設成 public 並繼承 public class ExerciseApplication : ApplicationBase 實作抽象類別 ( 可以用 VS 的自動完成 ) 會有 3 個方法 CreatePeer :新 Client 建立連線的時候會被呼叫 用來創建 Peer

Setup :伺服器程式啟動的時候會執行的部分 TearDown :伺服器程式關閉的時候會執行的部分 接下來換 ExercisePeer

Page 11: Unity Photon server 基礎設施

ExercisePeer 使用命名空間: using System; using Photon.SocketServer; using PhotonHostRuntimeInterfaces; 方法: public ExercisePeer(InitRequest initRequest) : base(initRequest) { } Constructor

protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail) Client斷線的時候要做的事

{ throw new NotImplementedException(); } protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters) Client發Operation過來的時候要做的事

{ throw new NotImplementedException(); }

Page 12: Unity Photon server 基礎設施

實作 ExerciseApplication 按照你自己的需求建造 CreatePeer 的地方 記得要回傳自己實作的 Peer

如果你怕之後找不到生出來的 Peer 的話,記得要先用一些集合把它存起來 這裡介紹用 Photon Server 的 Logger

給 ExerciseApplication 加入一個靜態欄位方便在 Peer 的地方也可以寫 Log

public static readonly ILogger Log = LogManager.GetCurrentClassLogger();

在 Setup() 的地方進行路徑設定 沒需要實作的地方記得要把 throw new NotImplementedException();

刪掉 才不會出錯

Page 13: Unity Photon server 基礎設施

Setup() protected void Setup () { log4net.GlobalContext.Properties["Photon:ApplicationLogPath"] = Path.Combine(this.ApplicationPath, "log");

FileInfo file = new FileInfo(Path.Combine(this.BinaryPath, "log4net.config"));

if (file.Exists) { LogManager.SetLoggerFactory(Log4NetLoggerFactory.Instance); XmlConfigurator.ConfigureAndWatch(file); } }

Page 14: Unity Photon server 基礎設施

寫 Log 你可以在 Setup() 最後加上 Server Setup Successiful....... 的 Log 來確認伺服器程式啟動後沒出錯 這樣寫 Log.Info("Server Setup Successiful.......");

Log 還有很多方法可以用 可以自己研究看看

Page 15: Unity Photon server 基礎設施

實作 ExercisePeer OnDisconnect() 有需要的話再寫就好 重點是 OnOperationRequest

operationRequest.OperationCode 這是 Client 端發送過來的 OperationCode 型態是 byte

根據這個值來處理不同的 operations

operationRequest.Parameters 這是 Client 端發送過來的 operation 參數 型態是 Dictionary<byte, object>

根據不同的 operation 來存取這個參數因為這個參數是你自己從 client 端送來的 所以你應該自己知道那些 key 對應什麼型態的什麼參數

Page 16: Unity Photon server 基礎設施

發送 Response 用 Peer 的 SendOperationResponse 方法來送 response

第一個參數是 response 主體 第二個是資料傳輸的設定 用 new SendParameters()就可以了 第一個參數型態是 OperationResponse

Constructor第一個參數是要傳回去 operationCode 你可以用和發來的同一個 第二個是型態是 Dictionary<byte, object> 的參數 看你要傳些什麼 C# 基本型態 Photon 有支援 可以查看官方文件 至於其他類型就需要比較進階的處理方法 Response 可以給 return code 來告訴 client 有沒有哪裡出錯了 整個 response差不多會長這樣 OperationResponse response = new OperationResponse(operationCode, parameter)

{

ReturnCode = (short)ErrorCode.NoError

};

如果沒有要回送參數 也可以不要參數 只有 operationCode就好

Page 17: Unity Photon server 基礎設施

發送 Event 除了發送 Response 之外 也可以發送 Event 這和 response 的差異是你可以在 client 端分開處理這兩種回應 作為 server 端主動送資料的行為 而不是 operation response 的被動行為 如果這兩種還不夠用的話 就需要自行對這部分加一層抽象化了 用 peer 的 SendEvent 方法來送 和送 response差不多 只是第一個參數換成 EventData

EventData 沒有 ReturnCode

Constructor 的參數可選 Code 是像 operationCode 的東西 Parameters則相同 這樣 Server 端的部分就差不多完成了 可以建立連線 接收 operation 並回應 ( 不一定要回應 )

發送 Event

Page 18: Unity Photon server 基礎設施

Server 部屬 程式寫好之後 建置專案 打開 Photon 資料夾 deploy\ 建一個放你伺服器的資料夾 在資料夾裡建立兩個資料夾 bin 和 log

把建置的檔案全部放到 bin當中 打開 deploy\bin_Win64\PhotonServer.config

把裡面有 MMoDemo 的地方都改寫掉

Page 19: Unity Photon server 基礎設施

改寫 Config 第一個 <MMoDemo 這個 MMoDemo改成你喜歡的名字 這裡記做 A 記得對稱的 </MMoDemo> 也要改成一樣的 DisplayName=“MMO Demo” 這個是在 Photon Server 程式列表顯示的名字 可以隨便取 有 3 個 OverrideApplication=“MMoDemo” 要改成 OverrideApplication=“A”

<Applications Default=“MMoDemo”> 改成 <Applications Default=“A">

< Application >< /Application >包起來的裡面如下頁

Page 20: Unity Photon server 基礎設施

Application Name=“MMoDemo”

=> Name=“A”

BaseDirectory=“MmoDemo”

=> 你放 bin log 的資料夾名稱 Assembly=“Photon.MmoDemo.Server”

=> 你自己建的 dll 名稱 像是 PhotonServerExercise.dll 沒有 .dll

Type=“Photon.MmoDemo.Server.PhotonApplication”

=> Type=“PhotonServerExercise. ExerciseApplication” application 類別全名 ( 命名空間 + 類別 )

其他不用改

Page 21: Unity Photon server 基礎設施

啟動 Server 好了之後啟動 bin_win64 的 PhotonControl.exe

他會像防毒軟體那樣自動加到隱藏工具列 開啟後 點隱藏工具列小圖示右鍵 你的應用程式 Start as application 就可以了 按 Open Logs 可以查看 Log 自己開啟應用程式下的 log 資料夾 打開 log

看看有沒有成功 setup

Page 22: Unity Photon server 基礎設施

Client 端 新建一個 Unity 專案 在 Asset 下建立資料夾 Plugins

放入在 lib\ 下的 Photon3Unity3D.dll

建立一個類別 使用命名空間 using ExitGames.Client.Photon;

繼承 IPhotonPeerListener

要有一個 element 類別是 PhotonPeer

我通常取名叫 peer

Page 23: Unity Photon server 基礎設施

實作 DebugReturn 是方便給你 Debug 用的 看你要怎麼寫 像是簡單的 Debug.Log(message); 等等 OnEvent 是給你處理 Server 送過來的 EventData 依照 eventData.Code 來做對應的操作 OnOperationResponse 也差不多 只是這是 response 的 OnStatusChanged 是連線狀態變更的時候會呼叫的 通常要這樣寫 switch (statusCode)

{

case StatusCode.Connect: 連線之後要建立加密 peer.EstablishEncryption();

break;

case StatusCode.Disconnect: 斷線的時候要做的事 ( 這裡什麼都不做 )

break;

case StatusCode.EncryptionEstablished: 加密建立完成 ( 通常這裡之後才算正式連線完成 )

break;

}

Page 24: Unity Photon server 基礎設施

Peer 操作 PhotonPeer 主要做 4件事情 Connect 和伺服器連線 Disconnect 中斷和伺服器的連線 Service 讓 peer運作 ( 需要在像 FixedUpdate/Update 的地方一直呼叫他 )

OpCustom 發送 Operation

Disconnect 和 Service沒有參數 直接呼叫就好

Page 25: Unity Photon server 基礎設施

Connect 我通常是要連線的時候才創建 peer 因為創建的時候要指定通訊方法 通常是用 udp 根據需求更換其他的 this 是個 IPhotonPeerListener 因為在類別內使用所以用 this

peer = new PhotonPeer(this, ConnectionProtocol.Udp);

peer.Connect(serverAddress + ":" + udpPort.ToString(), serverName)

Connect 有兩個參數第一個是要連線的 address:port 如 “ 127.0.0.1:5055” (udp預設5055port)

第二個是你在 PhotonServer.config <Appplication 的 Name >

回傳值是 bool表示有沒有連上這個 server address 之後會連動 OnStatusChanged

Page 26: Unity Photon server 基礎設施

OpCustom OpCustom 有很多個 constructor

簡單使用的是 bool OpCustom(byte customOpCode, Dictionary<byte, object> customOpParameters, bool sendReliable, byte channelId, bool encrypt);

customOpCode 就是送過去的 operationCode customOpParameters 就是送過去的 parameters sendReliable 設 true channelId 設 0 Encrypt 設 1 前兩個也可以組成 OperationRequest 再送出去 效果相同

Page 27: Unity Photon server 基礎設施

Client 端完成 創建 IPhotonPeerListener 的實作之後 寫個 script 不斷執行 .Service()

對 peer進行 Connect 連線 伺服器創建 Peer

peer 發送 operation Server 端 peer 收到 做出 response

peer 接收到 response 做對應的動作 Server peer 送 event client peer 收到 event 做對應的動作 peer斷線 server 收到斷線訊息 基本的網路通訊就是這樣 其他的部分就根據自己的需求建造

Page 28: Unity Photon server 基礎設施

總結 因為這裡只有教可以動的 Unity 連線程式 這就真的只是可以動而已 什麼都沒有 只有通訊功能 整個系統剩下的部分需要自己去開發 有出錯或是有問題可以問我 我的 GitHub 上有一些用過的範例 DSforGITHUB(舊 )

Resource-Emperor( 有點舊 )

IANT(比較新 )

DoorofSoul( 最新 )

也有自己造 Socket Server 的範例 MonopolyOnlineGame( 有點舊 )