Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

Unity Photon server 基礎設施

1 867 vues

Publié le

只是可以動的基礎設施

Publié dans : Formation
  • Soyez le premier à commenter

Unity Photon server 基礎設施

  1. 1. 使用Photon Server來 建立可以動的Unity連線程式 DS HEP. I
  2. 2. 較好的教學內容 我之後有重新編寫Photon Server的教材,並修正了一些錯誤 建議可以直接轉去看新的教材 Photon Server基礎與部署 https://lightofhexagram.wordpress.com/2016/09/13/photon-server基礎與部署/ Photon Server/Unity Client基礎通訊實例 https://lightofhexagram.wordpress.com/2016/09/14/photon-serverunity-client基礎通訊實例/
  3. 3. 學習內容 建立純粹只是可以動的Unity連線程式(以電腦桌面平台為主) 學習指標: 內容: ★★★☆☆☆☆☆☆☆ 深度: ★★☆☆☆☆☆☆☆☆ 實用性: ★★★★★★★☆☆☆
  4. 4. 連線程式基本需求 有一個伺服器端(Server) 接收來自外部的連線 伺服器端可以接收已連線客戶端(Client)的請求並回復 或是 主動傳送資料 有一個客戶端作為使用者操作介面 連接伺服器 兩個可以在同一台電腦上 如果要架設對外的伺服器 要確定伺服器的網路具有實體IP
  5. 5. 為什麼不從頭開始造Socket Server 如果只是為了通訊功能 從頭開始造Socket Server代價太高 除非有很多時間資源 自己的能力和知識也很充足 不然只是為了通訊功能只是自我毀滅 TCP分頁, UDP可靠性, 序列化, 加密, 安全性, 附載平衡, 伺服器對伺服器, 多平台 可靠性, 除錯, 性能, 分析 等等 有10年以上專業知識的公司已經幫你把產品做好了 100個連線以下免費 除非你想鑽研通訊的部分 不然不建議把時間花在這部份上
  6. 6. 為什麼用Photon Server 因為我自己學Unity線上遊戲看的書用這個 支援許多平台 資訊自己看:http://doc.photonengine.com/zh-tw/onpremise/current/getting-started/photon- server-intro 可以使用C#來寫伺服器程式
  7. 7. 準備工作 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#知識
  8. 8. 準備工作 把license丟到Photon的資夾 deploybin_Win64 下 開個Visual Studio C# 類別庫專案 我把專案名取PhotonServerExercise 好了之後把自動生成的Class1刪掉 給方案加入參考: ExitGames.Logging.Log4Net.dll ExitGamesLibs.dll log4net.dll Photon.SocketServer.dll PhotonHostRuntimeInterfaces.dll 這些dll在Photon資料夾lib下
  9. 9. 建立必要類別 建立2個class 作為伺服器主體 Application 和 與客戶端連結的Peer 這裡我使用ExerciseApplication 和 ExercisePeer 首先建立ExerciseApplication 要using以下命名空間 using ExitGames.Logging; using ExitGames.Logging.Log4Net; using log4net.Config; using Photon.SocketServer; using System.IO;
  10. 10. ExerciseApplication 把類別設成public 並繼承 public class ExerciseApplication : ApplicationBase 實作抽象類別(可以用VS的自動完成) 會有3個方法 CreatePeer:新Client建立連線的時候會被呼叫 用來創建Peer Setup:伺服器程式啟動的時候會執行的部分 TearDown:伺服器程式關閉的時候會執行的部分 接下來換ExercisePeer
  11. 11. 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(); }
  12. 12. 實作ExerciseApplication 按照你自己的需求建造 CreatePeer的地方 記得要回傳自己實作的Peer 如果你怕之後找不到生出來的Peer的話,記得要先用一些集合把它存起來 這裡介紹用Photon Server的Logger 給ExerciseApplication加入一個靜態欄位方便在Peer的地方也可以寫Log public static readonly ILogger Log = LogManager.GetCurrentClassLogger(); 在Setup()的地方進行路徑設定 沒需要實作的地方記得要把throw new NotImplementedException(); 刪掉 才不會出錯
  13. 13. 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); } }
  14. 14. 寫Log 你可以在Setup()最後加上 Server Setup Successiful.......的Log 來確認伺服器程式啟動後沒出錯 這樣寫 Log.Info("Server Setup Successiful......."); Log還有很多方法可以用 可以自己研究看看
  15. 15. 實作ExercisePeer OnDisconnect()有需要的話再寫就好 重點是OnOperationRequest operationRequest.OperationCode 這是Client端發送過來的OperationCode 型態是byte 根據這個值來處理不同的operations operationRequest.Parameters這是Client端發送過來的operation參數 型態是Dictionary<byte, object> 根據不同的operation來存取這個參數 因為這個參數是你自己從client端送來的 所以你應該自己知道那些key對應什麼型態的什麼 參數
  16. 16. 發送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就好
  17. 17. 發送Event 除了發送Response之外 也可以發送Event 這和response的差異是你可以在client端分開處理 這兩種回應 作為server端主動送資料的行為 而不是operation response的被動行為 如果這兩種還不夠用的話 就需要自行對這部分加一層抽象化了 用peer的SendEvent方法來送 和送response差不多 只是第一個參數換成EventData EventData 沒有ReturnCode Constructor 的參數可選 Code是像operationCode的東西 Parameters則相同 這樣Server端的部分就差不多完成了 可以建立連線 接收operation並回應(不一定要回應) 發送Event
  18. 18. Server部屬 程式寫好之後 建置專案 打開Photon資料夾 deploy 建一個放你伺服器的資料夾 在資料夾裡建立兩個資料夾 bin 和 log 把建置的檔案全部放到bin當中 打開deploybin_Win64PhotonServer.config 把裡面有MMoDemo的地方都改寫掉
  19. 19. 改寫Config 第一個 <MMoDemo 這個MMoDemo改成你喜歡的名字 這裡記做A 記得對稱的 </MMoDemo> 也要改成一樣的 DisplayName=“MMO Demo” 這個是在Photon Server 程式列表顯示的名字 可以隨便取 有3個OverrideApplication=“MMoDemo” 要改成OverrideApplication=“A” <Applications Default=“MMoDemo”> 改成 <Applications Default=“A"> < Application >< /Application >包起來的裡面如下頁
  20. 20. 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類別全名(命名空間+類別) 其他不用改
  21. 21. 啟動Server 好了之後啟動bin_win64的PhotonControl.exe 他會像防毒軟體那樣自動加到隱藏工具列 開啟後 點隱藏工具列小圖示右鍵 你的應用程式 Start as application 就可以了 按Open Logs可以查看Log 自己開啟應用程式下的log資料夾 打開log 看看有沒有成功setup
  22. 22. Client端 新建一個Unity專案 在Asset下建立資料夾Plugins 放入在lib下的 Photon3Unity3D.dll 建立一個類別 使用命名空間 using ExitGames.Client.Photon; 繼承IPhotonPeerListener 要有一個element 類別是PhotonPeer 我通常取名叫peer
  23. 23. 實作 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; }
  24. 24. Peer操作 PhotonPeer主要做4件事情 Connect 和伺服器連線 Disconnect 中斷和伺服器的連線 Service 讓peer運作(需要在像FixedUpdate/Update的地方一直呼叫他) OpCustom 發送Operation Disconnect和Service沒有參數 直接呼叫就好
  25. 25. 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
  26. 26. 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再送出去 效果相同
  27. 27. Client端完成 創建IPhotonPeerListener的實作之後 寫個script不斷執行.Service() 對peer進行Connect 連線 伺服器創建Peer peer發送operation Server端peer收到 做出response peer接收到response 做對應的動作 Server peer送event client peer 收到event做對應的動作 peer斷線 server收到斷線訊息 基本的網路通訊就是這樣 其他的部分就根據自己的需求建造
  28. 28. 總結 因為這裡只有教可以動的Unity連線程式 這就真的只是可以動而已 什麼都沒有 只有通訊功能 整個系統剩下的部分需要自己去開發 有出錯或是有問題可以問我 我的GitHub上有一些用過的範例 DSforGITHUB(舊) Resource-Emperor(有點舊) IANT(比較新) DoorofSoul(最新) 也有自己造Socket Server的範例 MonopolyOnlineGame(有點舊)

×