等分轮盘抽奖实现思路

前段时间策划提了一个需求,做一个轮盘抽奖,轮盘不转,转的是指针。指针有几个状态,启动抽奖的时候,加速,然后到达最大速度 。停止抽奖的时候,从当前速度开始减速,然后停止的时候停在目标位置。

一开始觉得挺简单的,大概思路就是:将指针从当前转动速度开始减速,直到停止到刚好的位置这一个过程,映射为一个匀减速直线运动。

但是结果实现起来,就是各种问题,表现起来就是停止的时候没有停到想要的位置。后来分析了一下代码,思路其实没错,主要是公式没用对。

关键的点有两个:
  1. 按下停止的时候,指针真正开始减速的位置,或者说是角度。因为 s = v0 * t + 0.5 * a * (t * t),在v0已知,t已知的情况下,指针从开始减速到停止这个过程,转过的角度是确定的。那么按下停止那一刻,不能立即让指针开始减速,否则停不到目标位置,而是应该根据目标位置反过来推算指针应该从哪个位置开始减速
  2. 减速的时候每帧更新走过的距离。一开始想得太简单,以为时间delta t已经足够小了,指针减速走过的距离 用 s = t * v 来算,但是实际上是错的。每次更新指针位置,还是实实在在得套用标准公式:s = v0 * t + 0.5 * a * (t * t),来算出delta t 时间内指针走过的距离,同时也需要根据 vt = v0 + at来更新vt的速度 。

如果按照上面关键的两点来做,就可以做到,在指针转动的任意时候,按下停止,都能停到目标位置了。而且将指针的最大速度完全停止转动的时间做成可配置,可以将效果调整到比较“恰好”的样子。

不过交互貌似不太满意最后那段停下来的效果,按照她的口述,我大概理解是一种变减速的运动,最后面的减速是比较诡异的,具体实现后面再看看吧~~

你可能感兴趣的:(Unity3D,C#,游戏开发,项目所得)