安裝 Mysql
選擇項目 Server.app 點右鍵選擇 "管理NuGet程序包"

選擇了 8.0.32 版本
安裝完後可以在依賴包裡面看到已安裝

urscos Tech.
選擇項目 Server.app 點右鍵選擇 "管理NuGet程序包"

選擇了 8.0.32 版本
安裝完後可以在依賴包裡面看到已安裝

開啟 Visual Studio 後點擊上方選單 "擴展" > "管理擴展",即可查看已安裝擴展

幀同步在服務端採用房間模式,玩家在對戰時創建對應房間並將玩家加入該房間進行對戰,對於在線遊戲玩家數超過單服務器負載上限時可以多開房間服,這樣可以有效分散帶寬壓,為了更好的遊戲體驗一般會對進行對戰遊戲匹配進入合適的房間。
幀同步保證所有客戶端在每一個frame執行後的結果是一致的,但考慮不同客戶端延遲不同使用嚴格模式必須等待所有客戶端消息收到才能廣播,一個客戶端卡會造成所有用戶都卡頓,在這我們使用樂觀鎖模式。
樂觀模式:
服務端每一個turn(frame)無須等待客戶端消息,直接將當前收集到的消息廣播給客戶端,因此卡的客戶端自己會顯示卡頓或是無效,但不會影響到其他用戶

我們務必保證客戶端上傳FrameData依據的關鍵幀Id是準確無誤的,也就是客戶端A在 FrameId = 233 跟客戶端B在 FrameId = 233,不能有時間差,所以保證了客戶端 Update 跟計算關鍵幀都是依據真實時間就能做到這點,這樣客戶端上傳FrameData就醫定是校時過的。
網路平滑化
當然服務端或客戶端收到對方消息可能是網路延遲過N各Frame才收到,這個就看服務端/客戶端的處理是設定平滑多少了,平滑設定間隔大了
服務端處理的是 Current FrameId - N FrameId 的消息,也因此客戶端收到消息必定也是延遲N Frame過後的數。這邊會牽涉到預判跟回滾,因為樂觀鎖不會因為消息沒收到就停止,所以客戶端必須預測目前Frame的玩家行為,但如果預測錯了就必須回滾回去。
邏輯計算要點
在邏輯運算中必須保證多端之間的運算結果是一致的,因此必須保證以下重點
在寫操作判斷時發現狀態的紀錄總是有問題, 有時候系統沒有keyUp事件造成了狀態殘留, 寫法如下
void FixedUpdate(){
if (Input.GetKeyDown(KeyCode.A)){
Log.Debug("KeyDown");
}
if (Input.GetKeyUp(KeyCode.A)){
Log.Debug("KeyUp");
}
}
後來發現 Input.GetKeyDown, Input.GetKeyUp 不能寫在 FixedUpdate 不然就會出現缺少的問題
當使用 TexturePacker 打包 Atlas 到 Unity 結果發現原本已經配置好的貼圖都變成了 missing 狀態

查了 Prefab 並沒有變動, 從資源 Atlas_XXX.png.meta 發現如果 nameFileIdTable 裡面對應的 fileId 為 0 則
圖集重新生成就會變成丟失, 要解決問題只能刪除 Atlas_XXX.png 重新生成 .meta , 圖集中刪除圖片沒有效果
