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