关于network:在MMORPG中其他玩家和怪物的同步做法

1次阅读

共计 2564 个字符,预计需要花费 7 分钟才能阅读完成。

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:

  1. 其余玩家和怪物的同步个别会采纳状态同步和状态预测相结合的形式。状态同步是指服务器将所有角色的状态同步给客户端,客户端依据这些状态来更新角色的状态机。状态预测是指客户端依据本人的状态机来预测其余角色的状态,并依据这些预测后果来更新本人的视图。预测的后果须要通过与服务器的同步来验证,如果预测的后果和服务器的后果不统一,就须要进行状态修改。
  2. 怪物的同步和其余玩家的同步相似,都须要采纳状态同步和状态预测相结合的形式。不同的是,怪物通常由服务器管制,因而服务器能够更准确地管制怪物的状态和行为,这样能够缩小客户端的预测量和同步量,从而进步同步的效率。
  3. 在做同步的时候,须要留神以下几个点:
  • 状态同步的频率要足够高,确保角色的状态可能及时同步到客户端,缩小状态预测的误差。
  • 状态预测要尽量精确,采纳适合的算法和参数来进步预测的准确率。
  • 当客户端呈现卡顿或者提早时,须要采纳插值和修改等形式来让角色迅速复原到失常的状态,避免出现地位不同步的状况。
  • 须要对角色的挪动和攻打等行为进行校验,防止舞弊和外挂的呈现。
  • 对于客户端和服务器之间的通信,须要采纳牢靠的协定和加密形式来保障通信的平安和稳固。

感激 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

正文完
 0