这是之前做一个蜘蛛的技能时,遇到的一个问题。
蜘蛛出生时有一个从天上掉下来的动作,因此出生点在地面上方稍高一点的位置,当蜘蛛释放吐丝技能时,丝的特效从尾巴尖上发出,飞向敌人,于是可以在尾巴尖的位置绑定一个Socket,发特效的时候来获得此位置。
但是现象却是特效总从天上发出来。于是打Log检查Socket位置是否正确。果不其然,在服务端取到的Socket位置比客户端取到的位置高很多,而且蜘蛛站在原地时的动作会有上下的浮动,但服务端取到的Socket位置不随蜘蛛的动作而变化,而客户端取到的Socket位置则一直随着动作变化而变化。
可以判断,服务端的骨骼位置并没有实时刷新。
此时就跟Mesh Component的UpdateFlag有关系了。
默认值为AlwaysTickPose,由于服务端没有渲染骨骼,所以就没有更新骨骼位置,而客户端却有更新。
于是可以选择AlwaysTickPoseAndRefreshBones来解决这个问题。
但是,由于考虑到服务端的性能问题,可以做一些优化,比如:
- 没有用到骨骼位置的NPC可以保持默认选项,无需额外刷新骨骼
- 对骨骼位置不要求是实时的,可以在需要用到骨骼位置之前,刷新一次骨骼位置(调用SkeletalMeshComponent::RefreshBoneTransform)
- 对骨骼位置实时性有要求的,可以考虑NPC死亡后(假设一般情况NPC死亡后趴在地上不会动弹,否则另当别论)、对象销毁前,关闭骨骼实时刷新