分類 Unity 下的文章

在製作地圖時為了資源的共用跟製作速度可以參考使用unity tilemap
14105-2spkdve06dd.png

首先在 Hierarchy 右鍵 / 2D Object / Tilemap / Rectangular 生成 tilemap 物件
63391-nlsbvstpftq.png

再來選擇Grid 將 Cell Size 修改成 32 x 32(如果遊戲中用到的 chunk 是 32 x32 )
10794-7n7t7xhcm0f.png

接著開啟 tilemap 資源管理器, Window / 2D / Tile Palette
04501-m66b5fapvc.png

把資源管理清單的 sprite 貼圖拖曳到 Tile Palette 中間區塊,
88419-vxqfes2twlj.png

資源更新如下
98381-i2d1cku3am.png

最上面的 tool 依序代表的是 "選擇"、"移動"、"畫筆"、"方形區域填充"、"取色"、"橡皮擦"、"填充"
26296-vbrslezmv9.png

首先在 tile palette 中選擇要使用的 tile,然後選擇"畫筆"工具,就可以直接在場景中繪製 tilemap 地塊
07789-lfef5b7b8x.png

另外,將 sprite 拖曳到 tile palette 中時發現圖素很小,繪製的 tilemap 也是顯示很小
這時候必須調整原圖的 Pixels Per Unit 為 1 ,因為原圖大小 32 x 32 需要顯示在 32 各 Unity unit 上
66725-0v34tddqzdpj.png

幀同步在服務端採用房間模式,玩家在對戰時創建對應房間並將玩家加入該房間進行對戰,對於在線遊戲玩家數超過單服務器負載上限時可以多開房間服,這樣可以有效分散帶寬壓,為了更好的遊戲體驗一般會對進行對戰遊戲匹配進入合適的房間。

幀同步保證所有客戶端在每一個frame執行後的結果是一致的,但考慮不同客戶端延遲不同使用嚴格模式必須等待所有客戶端消息收到才能廣播,一個客戶端卡會造成所有用戶都卡頓,在這我們使用樂觀鎖模式。

樂觀模式:
服務端每一個turn(frame)無須等待客戶端消息,直接將當前收集到的消息廣播給客戶端,因此卡的客戶端自己會顯示卡頓或是無效,但不會影響到其他用戶

90362-wjtypddppvg.png

我們務必保證客戶端上傳FrameData依據的關鍵幀Id是準確無誤的,也就是客戶端A在 FrameId = 233 跟客戶端B在 FrameId = 233,不能有時間差,所以保證了客戶端 Update 跟計算關鍵幀都是依據真實時間就能做到這點,這樣客戶端上傳FrameData就醫定是校時過的。

網路平滑化
當然服務端或客戶端收到對方消息可能是網路延遲過N各Frame才收到,這個就看服務端/客戶端的處理是設定平滑多少了,平滑設定間隔大了

服務端處理的是 Current FrameId - N FrameId 的消息,也因此客戶端收到消息必定也是延遲N Frame過後的數。這邊會牽涉到預判跟回滾,因為樂觀鎖不會因為消息沒收到就停止,所以客戶端必須預測目前Frame的玩家行為,但如果預測錯了就必須回滾回去。

邏輯計算要點
在邏輯運算中必須保證多端之間的運算結果是一致的,因此必須保證以下重點

  1. 使用隨機必須保證執行結果一致
    每一個房間分配一個隨機種子,根據種子計算的到結果一致
  2. 禁止使用float進行計算
    自行實現float class
  3. 客戶端刷新 entity 不可以有順序性問題,譬如判斷 entity.UserId == MyUserId 造成運算順序差異

在寫操作判斷時發現狀態的紀錄總是有問題, 有時候系統沒有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 狀態
57611-b9wk7sparxl.png

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

49914-tgmges6ea4f.png