034版本角色变动汇总
1. 角色scale属性客户端修改不同步
前因后果
改动背景
- scale之前默认做了客户端调用同步,针对NPC上容易调用后出现广播成倍增长问题
- 减少底层功能对RPC使用,将RPC的权利交还给大家
改动可能导致的问题
客户端修改玩家/ npc 体型大小不同步,会导致不同端上,玩家体型不一致
修改方案
033 | 034 |
---|---|
// 客户端 character.worldTransform.scale = 10; | // 客户端 this.net_scale(); @RemoteFunction(Server) net_scale(character: Character){ character.worldTransform.scale = 10; } |
2. setVisibility头顶ui不隐藏
前因后果
改动背景
- 034之前,当修改角色可见性的时候,
setVisibility()
中,第二个参数propagateToChildren
对角色的头顶UI对象(挂载在角色下)不生效。 - 034版本针对这个问题进行了修复:
propagateToChildren
对角色所有子对象生效
改动可能导致的问题
propagateToChildren
默认值为true。当参数生效后,头顶UI对象会受该参数的取值影响。之前的项目如果指定propagateToChildren = false
,在033上,角色会连带头顶UI进行隐藏,而034头顶UI则会显示。
修改方案
033 | 034 |
---|---|
// 头顶UI不可见 character.setVisibility(false, false); | // 头顶UI不可见 character.setVisibility(false, true); |
3. 头顶ui位置错误问题
前因后果
改动背景
- 034之前角色头顶UI反馈BUG,每次生成挂载位置由于网络和加载偶先偏移。
- 034修复了这个bug:角色头顶UI位置始终固定在距离角色头顶的某一个位置
改动可能导致的问题
原先如果有自己调整头顶UI的方案反而可能在034造成头顶UI一个异常的挂载效果。
修改方案
033 | 034 |
---|---|
// 重新挂了一次保证位置 character.attachToSLot(widget, HumanoidSlotType.Rings) | // 034直接不重新挂即可 |
4. 角色预制体下模型碰撞生效导致中断跳跃
前因后果
改动背景
- 原先反馈角色预制体内,模型的碰撞对角色没生效。
- 034修复了这个问题:角色预制体内的模型,如果开启碰撞会对角色生效
改动可能导致的问题
角色预制体挂上了开碰撞的对象,在034影响了角色移动组件工作,跳不高,跑不动
修改方案
033 | 034 |
---|---|
// 正常创建预制体 | // 034下关闭预制体下模型的碰撞 prefab.getChildren().forEach((v) => { if(v instance of Model) { (v as Model).setCollision(CollisionStatus.Off, true); } }) |
5. 动画状态切换改为属性同步导致一帧之内多次切换客户端无法知晓
前因后果
改动背景
- 034之前,动画切换状态是通过RPC,反馈RPC太多,且偶尔断线导致丢失不好做重连处理。
- 034改为属性同步,保证最终同步的状态是对的
改动可能导致的问题
034之前,如果利用RPC机制,在一帧内调用play和pause来实现暂停在第一帧需求,现在由于属性同步只会同步最后一帧的动画状态,因此同样的调用方法,动画不会播放。
修改方案
033 | 034 |
---|---|
// 一帧内播放 animation.play() animation.pause() | // 034延迟一帧 if(SystemUtil.getEditorVersion != "034") { animation.play(); } else { setTimeout(() => { animation.pause(); }, 0); } |
6. 双端npc去掉findfloor逻辑导致角色位置与033不同
前因后果
改动背景
- 原先NPC角色对象每时每刻都在findFloor带来额外性能消耗。
- 角色对象如果findFloor,那编辑态下设置位置和运行时真实位置会有偏差,比如本身角色就是陷入土里,但是运行起来又站在地面上。所以034去除了npc对象findFloor的逻辑。
改动可能导致的问题
之前有项目依赖findFloor逻辑,来间接解决资源异步带来的角色和模型碰撞加载的时序问题,034去除这个逻辑后,角色由于受到模型资源加载时序的影响没有检测到地板,创建在空中的角色会下落。
修改方案
033 | 034 |
---|---|
// 创建角色后设置坐标 let chara = await GameObject.asyncSpawn("Id") as Character; await chara = asyncReady(); chara.worldTransform.position = new Vector(100, 100, 1000); | // 034需要把移动组件关闭 if(SystemUtil.getEditorVersion != "034") { let chara = await GameObject.asyncSpawn("Id") as Character; await chara = asyncReady(); chara.worldTransform.position = new Vector(100, 100, 1000); } else { let chara = await GameObject.asyncSpawn("Id") as Character; chara .complexMovementEnabled = false; await chara = asyncReady(); chara.worldTransform.position = new Vector(100, 100, 1000); } |
7. 移动组件执行提前,执行时序调整导致角色移动组件提前工作
前因后果
改动背景
- 在034修改了角色初始化流程方案
- 角色034在骨骼和主Mesh加载完成后,即可开始移动,移动组件工作更早
改动可能导致的问题
之前项目可能将初始化的角色置于空中,由于初始化提速,onStart执行更慢,角色会下落一段距离在空中定住
修改方案
033 | 034 |
---|---|
// 创建角色后设置坐标 let chara = await GameObject.asyncSpawn("Id") as Character; await chara = asyncReady(); chara.worldTransform.position = new Vector(100, 100, 1000); | // 034需要把移动组件关闭 if(SystemUtil.getEditorVersion != "034") { let chara = await GameObject.asyncSpawn("Id") as Character; await chara = asyncReady(); chara.worldTransform.position = new Vector(100, 100, 1000); } else { let chara = await GameObject.asyncSpawn("Id") as Character; chara .complexMovementEnabled = false; await chara = asyncReady(); chara.worldTransform.position = new Vector(100, 100, 1000); } |
8. 角色换装阶段调用attachToSlot并操作位置,相对坐标异常
前因后果
- 之前角色在换装过程中,挂载对象后设置坐标有问题
- 034对操作逻辑进行梳理,确定了异步逻辑执行的可靠性,但同步执行时序仍然不保证
改动可能导致的问题
在之前的版本中,角色换装的同时执行同步挂载操作,和相对Transform的设置,本身效果不稳定。但如果通过自己的调整配置了一个大致的位置值,在034上可能由于代码的梳理,各项异步逻辑可能组合起来执行有变动。导致033 034挂载位置出现很小的偏移。