分類 Unity 下的文章

SoftMaskForUGUI插件地址
https://github.com/mob-sakai/SoftMaskForUGUI/tree/main

在 manifest.json 配置如下:

"com.coffee.softmask-for-ugui": "https://github.com/mob-sakai/SoftMaskForUGUI.git#1.0.0"

結果出現了下面的錯誤

An error occurred while resolving packages:
  Project has invalid dependencies:
    com.coffee.softmask-for-ugui: Error when executing git command. fatal: unable to connect to github.com:
    github.com[0: 20.205.243.166]: errno=No error
unity package manager 無法連到github

21256-zrtfvigjycd.png

unity package manager 不使用IE代理配置, 必須要設定 http_proxy

開啟vpn自動配置系統代理, 從 vpn 可以看到 http 監聽端口為 socket port + 1
58881-ilxtcqkzoxq.png

開啟後去代理設定裡面查看, 果然是 10809(10808+1)
26739-ml5o2uu25r.png

接著參考 unity 說明添加系統配置

http_proxy : http://127.0.0.1:10809
https_proxy : http://127.0.0.1:10809

https://docs.unity3d.com/cn/2019.3/Manual/upm-network.html
51004-mk0vox3mtl.png

接著把 unity 關閉後並且重啟 unity hub 開啟專案
發現還是錯的回頭去看 manifest.json, 把 https 改成 http, https 必須要有證書, 所以改成 http 試試看
86105-snwqvat5zp.png

package manager 重刷後發現成功了, 從 vpn log 也察看到對應的請求
http://github.com/mob-sakai/SoftMaskForUGUI.git/info/refs?service=git-upload-pack [http -> proxy]
94666-qvy3fpqxkz.png

接著就是把 demo 給匯入
08444-xc30u86zbla.png

測試使用 QR CodeBarcode Scanner and Generator 插件

將插件引入unity項目中, 使用debug key進行打包apk, 發生下面這個錯誤

13258-q8bqwcwdsp.png

這是因為打包apk過程中要下載groovy-all-2.4.15.jar, 連接不到的緣故
我們改成 export project 打包出來再用 android studio 處理

16758-1x9ru8x2x9ri.png

Android執行完成 gradle files 進行安裝後出現下面問題

The application could not be installed: INSTALL_PARSE_FAILED_MANIFEST_MALFOR

找到 intent-filter 的地方, 在前面加 android:exported="true", 如下
47714-53jp1y06k3.png

在打包, 出現下面問題

The application could not be installed: SHELL_UNRESPONSIVE

把手機vpn打開, 這台 pixel install apk 如果沒有翻牆就會卡住, 而且在桌面會找不到app, 但軟件清單裡面卻可以找到

最後執行閃退了

93084-77uocp3pg1.png

這是因為沒有打開 camera 權限, 開啟之後就好了

在製作地圖時為了資源的共用跟製作速度可以參考使用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 造成運算順序差異