赞
踩
我会不断整理遇见的问题和不一样的使用方法,更新这个帖子,大家遇到什么问题,也可以给我留言
关于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,不过,这个方法的原理,你还是要知道的,不然遇到问题,一脸懵逼…
首先,我们可以看到在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++; } }
这个问题,乍看之下很简单,然而我眉头一皱,发现并不简单
这个问题是网上一个朋友遇到的,他的需求是断线重连后,需要根据时间,跳转到他应该在的路径点上
首先我们能直接想到的就是这样的写法
以速度为基准的路径动画,跳转到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 搜索名称或扫描二维码
希望我们能共同成长,共同进步
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。