1)在MMORPG中,其他玩家和怪物的同步做法
2)AssetBundle通過Offset加密/解密問題
3)加載預製體API區別
4)關於MaterialPropertyBlock的使用問題
這是第340篇UWA技術知識分享的推送,精選了UWA社區的熱門話題,涵蓋了UWA問答、社區帖子等技術知識點,助力大家更全面地掌握和學習。
UWA社區主頁:community.uwa4d.com
UWA QQ羣:465082844
Network
Q:關於在MMORPG中,其他玩家和怪物的同步做法:
目前的做法是怪物和玩家都有一個狀態機,狀態的改變是根據服務器下發的狀態進行狀態設置的,但是目前有個問題就是如果出現本地卡頓或者網絡波動等其他原因導致客户端之前的動作還沒有結束,服務器又下發了新的狀態,這個時候如果直接設置新狀態就會表現異常也會出現位置不同步的情況(例如客户端還沒有移動結束,由於卡頓或者延遲原因又收到了攻擊狀態,如果這個時候直接攻擊就表現出又移動又攻擊的情況)。
因為之前沒有這方面的經驗,在網上查了其他人的做法,説是要做對其他角色的狀態預測,如果出現同步異常,用插值讓異常的對象迅速恢復到正常的狀態。
那麼:
1. 其他玩家和同步是用狀態機加預測去做的嗎?
2. 怪物同步的一般做法大概是怎麼樣的?和其他玩家類似嗎?
3. 在做同步的時候有哪些要注意的點呢?
A:
- 其他玩家和怪物的同步一般會採用狀態同步和狀態預測相結合的方式。狀態同步是指服務器將所有角色的狀態同步給客户端,客户端根據這些狀態來更新角色的狀態機。狀態預測是指客户端根據自己的狀態機來預測其他角色的狀態,並根據這些預測結果來更新自己的視圖。預測的結果需要通過與服務器的同步來驗證,如果預測的結果和服務器的結果不一致,就需要進行狀態修正。
- 怪物的同步和其他玩家的同步類似,都需要採用狀態同步和狀態預測相結合的方式。不同的是,怪物通常由服務器控制,因此服務器可以更精確地控制怪物的狀態和行為,這樣可以減少客户端的預測量和同步量,從而提高同步的效率。
- 在做同步的時候,需要注意以下幾個點:
- 狀態同步的頻率要足夠高,確保角色的狀態能夠及時同步到客户端,減少狀態預測的誤差。
- 狀態預測要儘量準確,採用合適的算法和參數來提高預測的準確率。
- 當客户端出現卡頓或者延遲時,需要採用插值和修正等方式來讓角色迅速恢復到正常的狀態,避免出現位置不同步的情況。
- 需要對角色的移動和攻擊等行為進行校驗,避免作弊和外掛的出現。
- 對於客户端和服務器之間的通信,需要採用可靠的協議和加密方式來保證通信的安全和穩定。
感謝NG週@UWA問答社區提供了回答
AssetBundle
Q:打包AssetBundle想用偏移量簡單做一下加密:
App版本使用:
AssetBundle.LoadFromFile(filePath, 0, offset)
但是WebGL版本使用:
UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(urlPath);
AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
未找到相關接口,請問大家有沒有什麼思路?
A:在WebGL平台上使用UnityWebRequest發送網絡請求獲取AssetBundle文件,獲取到後在內存中進行解密,然後將解密後的AssetBundle內容存儲到內存中。
在內存中加載AssetBundle,可以使用AssetBundle.LoadFromMemoryAsync(byte[] buffer)方法或者AssetBundle.LoadFromMemory(byte[] buffer)方法。
感謝NG週@UWA問答社區提供了回答
Loading
Q:請問PrefabUtility.LoadPrefabContents和AssetDatabase.LoadAssetAtPath這兩個加載預製體的API具體有什麼區別呢?
都試過測試感覺差不多,速度上沒多大區別:
PrefabUtility.LoadPrefabContents之後需要PrefabUtility.SavaAsPrefabAsset保存和PrefabUtility.UnloadPrefabContents釋放;AssetDatabase.LoadAssetAtPath之後,使用EditorUtility.SetDirty標記,然後AssetDatabase.SaveAssets保存。
針對以上問題,有經驗的朋友歡迎轉至社區交流分享:
https://answer.uwa4d.com/question/648047ab47691b75be04aa96
Rendering
Q:3D麻將項目,一個牌面一個材質球。我使用了一個不帶材質球的麻將預製體,然後在創建麻將牌的時候實例化預製體,根據牌面值查找並賦值對應材質球, GetComponent<MeshRender>().shareMaterial = XXXXX。
材質球使用的Shader是URP裏的Complex Lit。
有個需求是點擊手中麻將牌時,修改已經打出的牌(相同牌面的)在桌面的牌的顏色,但不能影響手中的牌的顏色。於是我用MaterialPropertyBlock的SetPropertyBlock方法修改已打出的牌的顏色值,但是不生效。
已打出牌的材質球的Inspector下方有提示“MaterialPropertyBlock is used to Modify these values”。網上也有一些解答,但還是沒搞懂。請問正確流程和做法應該怎樣才行呢?
針對以上問題,有經驗的朋友歡迎轉至社區交流分享:
https://answer.uwa4d.com/question/647e96efe63c097f73e2f2d9
封面圖來源於網絡
今天的分享就到這裏。生有涯而知無涯,在漫漫的開發週期中,我們遇到的問題只是冰山一角,UWA社區願伴你同行,一起探索分享。歡迎更多的開發者加入UWA社區。
UWA官網:www.uwa4d.com
UWA社區:community.uwa4d.com
UWA學堂:edu.uwa4d.com
官方技術QQ羣:465082844