天天看点

Dotween常见问题及使用方式

我会不断整理遇见的问题和不一样的使用方法,更新这个帖子,大家遇到什么问题,也可以给我留言

一、问题

1)play的使用

关于play,有两个方法,一个是类方法,一个是实例方法,虽然它们的注释稍有不同,但是它们实际是一样的

这个是实例的扩展方法
        // 摘要:
        //     Plays the tween
        public static T Play<T>(this T t) where T : Tween;
           
这个是类方法
        // 摘要:
        //     Plays all tweens with the given ID or target and returns the number of actual
        //     tweens played (meaning the tweens that were not already playing or complete)
        public static int Play(object targetOrId);
           

我们就用类方法的注释来解释这个方法,毕竟比较详细,实际仔细阅读注释就可以发现问题了, 它有这样一句话

meaning the tweens that were not already playing or complete

就是你调用play方法,这个动画 不能是正在播放的,也不能是播放完成的, 所以,你如果想复用这个动画,是需要调用其他方法的,播过一次之后,play就不会有效果了

当然,你也可以使用fullPosition属性,把时间点的标记改成0,这样,实际实现的是和restart一样的效果,不如直接用restart,不过,这个方法的原理,你还是要知道的,不然遇到问题,一脸懵逼…

2)Sequence动画无法使用以速度为基准的问题

首先,我们可以看到在quence.Append()方法源码里,实际是对DoInsert方法的封装

```csharp
public static Sequence Append(this Sequence s, Tween t)
    {
      if (s == null || !s.active || (s.creationLocked || t == null) || (!t.active || t.isSequenced))
        return s;
      Sequence.DoInsert(s, t, s.duration);
      return s;
    }
           

而在DoInsert内部,有这样一句,它把以速度为基准关掉了,所以我猜,他们就没做以速度为基准的Sequence动画

```csharp
internal static Sequence DoInsert(Sequence inSequence, Tween t, float atPosition)
    {
      .....
      t.isSpeedBased = false;
      .....
      return inSequence;
    }
           

我也没有深入研究,有不同见解欢迎留言指正

所以要是想用速度为基准的队列动画,我写了一个简单的小例子

就是采用递归的方式,实现起来也很简单

private int _index;
    private void Move(Vector3 pos,float speed)
    {
        transform.DOMove(pos, speed)
            .SetSpeedBased()
            .SetEase(Ease.Linear)
            .OnComplete(StartMove);
    }

    private void StartMove()
    {
        if (_index < list.Length)
        {
            Move(list[_index].position,2);
            _index++;
        }
    }
           

二、使用方式

1)在以速度为基准的路径动画上,实现根据时间,跳转到路径动画上的某一点

这个问题,乍看之下很简单,然而我眉头一皱,发现并不简单

这个问题是网上一个朋友遇到的,他的需求是断线重连后,需要根据时间,跳转到他应该在的路径点上

首先我们能直接想到的就是这样的写法

以速度为基准的路径动画,跳转到6秒的地方
 transform
            .DOPath(path, 1, PathType.CatmullRom)
            .SetLookAt(0, Vector3.left)
            .SetSpeedBased()
            .fullPosition = 6;

           

但是你执行后就会发现,在以速度为基准的情况下,fullPosition 没有作用

比较常规的想法,就是根据速度,路径长度自己算时间,这种方法能够实现,但是会让逻辑变复杂,开发过程中,尽量让逻辑简单,不然很容易出问题,修改需求的话,会耗费较长时间

所以我想了另外一种简单一点的方法

transform
            .DOPath(arrray, 1, PathType.CatmullRom)
            .SetLookAt(0)
            .SetSpeedBased(true)
            .SetEase(MyEaseFun);
           
private float MyEaseFun(float time, float duration, float overshootOrAmplitude, float period)
    {
        //这个变量是你要跳转的时间
        float toTime = 6;
        return (time + toTime) / duration;
    }
           

对于这个ease的函数不清楚的同学,可以去看我的Dotween详解,这样就能以非常直观的逻辑解决这个需求

以上的问题和使用方法,都是别人或我自己遇见的,这里放出来,也可以方便其他人,遇到问题,也能有一个解决方法,大家遇到什么问题,欢迎跟我一起讨论

我会在我的公众号上推送新的博文,也可以帮大家解答问题

微信公众号 Andy and Unity 搜索名称或扫描二维码

Dotween常见问题及使用方式

希望我们能共同成长,共同进步

继续阅读