现在有这么一个问题,玩家在游戏中乘坐上了一个会自己旋转的载具,导致玩家的坐标被动变化。
一般情况下在游戏中我们处理玩家的移动同步参考如下,考虑玩家当前点与上一次的同步点是否出现偏移,以及其他规则检测出的差值(朝向,状态,周期等),如果检出需要同步,则立即上报当前位置信息。
对于这种状态该如何比较好的检出玩家的位移变化呢 ?
这里有一些基础的移动同步知识介绍
KeyleXiao,公众号:礼拜八不工作反思下开发中位置同步遇到的问题
刚开始我认为这个检出的过程应该这样:
需要综合 上一次同步点 与 上一次同步的载具旋转角度与当前载具的旋转角度差值,然后三角函数计算出预测下一个落点。再将这个落点与当前要同步的点进行匹配。如果是一个点就不进行同步。
这个判定的计算非常繁琐,还需要额外记录载具的角度变化,那么有什么办法不看载具信息吗 ?
我们再分析下这个需求,载具平台旋转,子物体跟转,相对静止。 有句话是这样说的,当你不知道解题思路,你把题干抄下来,也是能得分的。 没错,答案就是: 相对静止。
由于是相对静止(船心坐标O),向量 OA蓝色 与 OA红色 他们的长度是没有变化的。 也就意味着,只需要计算上一次同步的相对位置与当前位置的长度差值。就可以判断玩家是否在载具平台上有位移。
bool isMove = Mathf.Abs( lastSyncRelPosition.magnitude - currentRelPosition.magnitude) > 0.01f
当然也可以优化成下面这样,不开方更省一些性能:
bool isMove = Mathf.Abs( lastSyncRelPosition.sqrMagnitude - currentRelPosition.sqrMagnitude) > 0.01f
大概如此,当然精度可以根据不同的需求进行调整。
今天的分享就到这,下期再会 !
附:太阳下山拍的晚霞。