發表文章

目前顯示的是有「Unity Photon Server」標籤的文章
Related Posts Plugin for WordPress, Blogger...

6-27 Synchronizing Other Player Position

圖片
本章接下來要繼續製作『同步其他玩家位置』的功能啦!上一章已經做到當玩家登入遊戲後,會由伺服端發送Event通知其他玩家,並在其他玩家的設備上產生遊戲角色。所以,本章要讓這些遊戲角色動起來。 首先,要先解決上一章遇到的小Bug,玩家操作角色的時候會讓其他玩家的角色也動起來,這是因為我用的是同一個Player物件。 我的作法是在PlayerMovement中加一個bool參數,名為dontRegisterMouseOnWalkable,判斷這個Player是否要回應點擊事件。 再另外創造一個名為OnlinePlayer的Prefab。 其中的PlayerMovement的dontRegisterMouseOnWalkable參數,設為True即可。 然後記得將OnlinePlayer放置在SyncPosition的參數中。 上述Bug解決以後,接著在PhotonServer端這邊建立一個Thread,該Thread會定時發送Event給在線上的玩家,給予每位玩家的即時位置資訊,讓Client端進行位置同步。 以下是針對SyncPositionThread內主要實作的內容,取得目前在線的MyClientPeerList後,將內部的Account, x, y, z等資訊存進自定義的類別PlayerSyncData,並組合成一個陣列。 接著使用SendEvent方法,將PlayerSyncData陣列傳送給每一個ClientPeer。特別要注意的是,前面我們都只傳送C#的value-type變數,如果要像這邊一樣傳送自定義類別,必須要有一些方法。 可以參考官方的說明文件: https://doc.photonengine.com/en-us/onpremise/current/reference/serialization-in-photon 做法不難,如下圖,於PlayerSyncData內定義兩個static方法,Deserialize方法與Serialize方法。這邊我用了自己寫的XmlDataSerializer,將PlayerSyncData轉換為Xml格式後,再轉換成byte陣列。 我自己寫的XmlDataSerializer.cs程式碼如下: using Syst...

6-26 Sending Event To Instantiate Player GameObject When Player Login

圖片
上一章已經介紹如何上傳玩家位置的方法了,接下來,當其他玩家登錄遊戲的時候,也應該要在遊戲場景中實例化新的玩家物件。首先,介紹要實作的流程會讓大家感到比較清楚: 1. 當玩家登錄時,發送Request,要求取得其他玩家的資訊。 2. Server發送Response,將目前線上玩家的所有資訊回傳。 3. 玩家接收到Response後,依照線上玩家的資訊列表,產生玩家的GameObject物件。 4. Server發送Event給其他線上玩家,告知有新的玩家上線。 5. 其他線上玩家接收到Event,於場景中產生一個新的玩家的GameObject。 上述便是此次要實作的流程。 首先,在PhotonServer端的MyClientPeer,新增變數,用來記錄Account與x, y, z位置資訊。當玩家與PhotonServer連線時,便會產生一個ClientPeer物件,所以直接將該名玩家的資訊記錄在ClientPeer物件中。 接著,在SyncPositionHandler.cs中的OnOperationRequest,把來自Client端的位置資訊儲存到ClientPeer的變數中。 同時,也要在LoginHandler中把來自Client端的Account,儲存到ClientPeer的變數。 接著我們回到Unity端來實作SyncOtherPlayerRequest.cs,這個類別的作用是初始化場景時,負責發送Request,要求取得其他玩家的資訊。 所以在OnOperationResponse中,會從Server端取得string陣列,裡面儲存已登入玩家的帳號。這邊,我呼叫了SyncPosition類別的AddNewPlayer方法,待會會告訴大家如何撰寫。 另外提醒,PhotonServer預設支援可自動序列化的類型,或者如何實作自定義類別的序列化,請參考下列網址: https://doc.photonengine.com/en-us/onpremise/current/reference/serialization-in-photon 現在來到SyncPosition.cs,我新增了一個Dictionary管理登入的線上玩家(不包含自己)。 大家可以看到AddNewPlayer中,先從o...

6-25 Synchronizing Player Position To Server

圖片
前幾章稍微離題了,都在講效能優化的內容。本章開始要回到網路相關的內容啦,如果有人看到這篇文章卻不懂範例中使用的架構的話,請先將第6章的文章再複習一遍唷! 6-5 Sending Request And Response https://3dactionrpg.blogspot.com/2018/05/6-5-sending-request-and-response.html 6-7 Sending Request And Response And Event With Parameters https://3dactionrpg.blogspot.com/2018/05/6-7-sending-request-and-response-and.html 6-14 Using Dictionary To Manage All Request  https://3dactionrpg.blogspot.com/2018/05/6-14-using-dictionary-to-manage-all.html 6-15 Using Handler To Respond Requisition In Photon Server https://3dactionrpg.blogspot.com/2018/05/6-15-using-handler-to-respond.html 6-16 Finishing Sign Up Mechanism https://3dactionrpg.blogspot.com/2018/05/6-16-finishing-sign-up-mechanism.html 接著繼續實作位置同步的功能,首先,我們先說明本次功能需要添加的OperationCode與ParameterCode。如下圖,OperationCode新增SyncPosition。 ParameterCode新增x, y, z。 接著,新增一個Script,名為SyncPositionRequest,繼承我們自定義的Request。覆寫抽象方法OnDefaultRequest後,建立Dictionary物件來儲存position資料,最後使用PhotonEngine的OpCustom...