关于对SWS插件的一些扩展

最近用unity写物体按照一定路线运动的一些内容,中间接触到了SWS这个插件。这个插件是基于DoTween来实现的,性能优化的不错,推荐一下。但插件中忽略了一个问题,如果运动过程中,游戏被切到后台(后台被挂起没有运行),切回来之后按理说物体的运动的位置应该发生改变了,但是这个插件并没有提供。因此,决定改写一下,来完善这个功能。

以splineMove为例进行扩展:

1:定义脚本继承splineMove
public class ExSplineMove : splineMove
{
}
2:定义物体运动的初始时间,并在开始的时候初始化它
 public long createTime { get; set; }
    // Use this for initialization
    private void Start()
    {
        createTime = DateTime.Now.Ticks;
        if (onStart)//这个是splineMove原有的,拷贝它
            StartMove();
    }
3:添加变量来判定,切换到主屏幕后,是否按照时间同步
public bool SynTime;//时间是否同步
4:定义刷新位置的方法
private void RefreshPosition()
    {
        float lifeTime = (DateTime.Now.Ticks - createTime) / 10000000.0f;//转换成秒
        float totalTime = WaypointManager.GetPathLength(pathContainer.GetPathPoints()) / speed;//获取运动的总时间
        if (tween == null)
        {
            return;
        }
        tween.ForceInit();
        tween.Goto(lifeTime, true);//迫使运动到具体的时间应到的位置
    }
5:最后再加上切换到主屏幕监听
private void OnApplicationFocus(bool hasFocus)
    {
        if (hasFocus&&SynTime/*按照自己的需求,看是否需要按照时间同步*/)
        {
            RefreshPosition();//刷新物体的位置
        }
    }

这样总体就完成了。但细心的读者会发现,

 float totalTime = WaypointManager.GetPathLength(pathContainer.GetPathPoints()) / speed;//获取运动的总时间

这行代码是求物体运动的总时间的,这就要求该物体是匀速率运动的;倘若是变速运动,则需要自己给出相应时间应到具体位置的算法了,这里就不再赘述。

猜你喜欢

转载自blog.csdn.net/liulei199079/article/details/76927012