014-DoTween动画插件学习

DOTween.To(() => myValue, x => myValue = x, new Vector3(0, 0, 10), 2);

1.myValue已在外界声明;前两个是两个lambda表达式,第一个是返回myValue,第二个是将x的值赋给myValue,x是插件自动计算出来的;第三个参数为目标位置,第四个参数为时间

DOMove(new Vector3(0, 0, 0), 0.3f);
DOLocalMove(new Vector3(0, 0, 0), 0.3f);
DORotate();
DOLocalRotate();
DORotateQuaternion();
DOLookAt();
DOScale();
DOPunchPosition();
DOPunchRotation();
DOPunchScale();

2.生成并播放一个动画,第一个参数是目标位置,第二个参数是用时;下面的是按照局部座标来;一般是在Transform类对象下调用;关于旋转的方法,第一个是目标角(用Vector3变量表示,也可以用四元数),第二个是时间;DOLookAt方法一般两个参数,第一个表示看向的点,第二个表示时间;DOScale方法第一个参数为一个Vector3变量,表示三个方向的缩放,第二个参数时间;DOPunch类方法以Position举例,效果是物体震动,一般有三个参数,第一个是震动的目标位置,第二个是持续时间,第三个是震动的频率,若有第四个参数,则表示相反方向震动的幅度,为0-1之间的值(0的话向相反方向运动时不会超过其原来位置);其它相同类方法同理

SetAutoKill();

3.Tweener对象的方法,设置动画播放完后是否自动销毁,默认为true,设置为false后播放完的动画将会处于暂停状态

Pause();
Play();

4.Tweener对象的方法,设置动画暂停

DOPlay();
DOPause();
DORestart();
DORewind();
DOSmoothRewind();
DOKill();
DOFlip():
DOGoto();
DOPlayBackwards();
DOPlayForward();
DOTogglePause();

5.第一个将所绑定对象上的所有动画播放;如在Transform类对象下调用,绑定即生成时绑定在触发的对象上;第二个一般用于将暂停播放的动画继续播放;第三个动画重新播放;第四个动画倒放,倒是是一瞬间倒放完;第五个倒放,但能看到过程;第六个销毁当前对象所有动画;第七个动画倒放,但执行的时间要在动画还没播完或者刚好播完时才有效果;第八个用于直接跳转到动画播放的某个时间点,有两个参数,第一个是动画播放的时间点,第二个是跳转后是否继续播放;第九个倒放;第十个正放,与DOPlay的区别在于DOPlay只能播一次,而这个方法配合上面的倒放方法可以实现多次播放;第十一个若当前动画为暂停,则播放,若为播放则暂停

DOMoveX(5, 4);
DOMoveX(5, 4).From(true);
DOMoveX(5, 4).From(false);

6.一般绑定在Transform类对象上;第一个是从当前位置移动到x为5的位置;第二个是从5+当前位置移动到当前位置;第三个是从5移动到当前位置;第二参数都是表示时间

transform.DOMoveX(4, 1).OnComplete(MyCallback);
transform.DOMove(new Vector3(4, 4, 4), 2).OnComplete(() => { MyCallBack(5); });
OnKill();
OnPlay();
OnStart();
OnPause();
OnStepComplete();
OnUpdate();
OnRewind();

7.第一个当动画播放完后执行括号里的方法,若方法含参,则需要用lambda表达式;第二个方法,当销毁这个动画后执行括号内方法;第三个方法,当动画播放时执行相应方法;第四个方法,当动画第一次播放时执行相应方法;第五个方法,当动画暂停时执行相应方法;第六个方法,若动画有周期性动作,如在两个位置之间反复移动多次,则每一步移动完后都会触发括号中方法;第七个方法,用于在动画帧中执行方法;第八个方法,触发时机较多,一般用于动画重新播放时触发,其它细节不再讨论

DOText(“xxxxxxxxxxxxxxx", 4);

8.DOText,将参数中的字符在4秒内逐个显示完毕;Text类对象的方法

DOShakePosition(1);
DOShakePosition(1, new Vector3(0, 3, 3));

9.震动方法,第一个参数为震动时间;第二个参数为力度和方向,默认是xyz都晃动1单位的距离;第二个种写法是只在y和z轴震动3单位的距离;Transform类对象的方法;若有第三个参数则表示震动频率(该方法一般用于摄像机震动以营造打击特效);其它DOShake方法相似

DOColor(Color.red, 2);
DOFade(1, 3);
//也可以用第一种方法,通过Color.clear来实现渐隐效果
DOColor(Color.red, "Name", 2);//改变材质颜色时,若材质没有Main Color属性,用DOTween可以通过该方法实现
SetColor("Name", Color.red);//用Unity自带的方法实现

10.第一个是将颜色在2秒内变化为红色;第二个是将透明度在3秒内变为1

private DOTweenAnimation tweenAni;

11.可视化动画编辑器,需要用GetComponent获取后才能在代码中使用其功能(与上面的API差不多)

DOPlay注册在按钮上,继续播放动画
DOTogglePause注册按钮上,可以实现用按钮播放和暂停
DORestart注册在按钮上,每次点击按钮,都将重新播放动画

12.路径编辑器的方法,注册在按钮上是指将路径编辑器所挂物体注册在按钮上

DOBlendableMoveBy();

13.参数一般两个,第一个表示目标位置与当前位置的差,第二个表示时间;与DOMove不同的是该方法是表示增量,而不是固定目的地;其它Blendable类方法相似;

public Gradient _gradient;
Material material = GetComponent<MeshRenderer>().material;
material.DOGradientColor(_gradient, "_TintColor", 2);

14.Unity自带的渐变编辑器,通过在编辑器界面设置好变化之后,通过如上代码的方式即可实现播放;上面第二个参数是因为所选材质没有Main Color属性,用一些其它方法修改该材质的颜色时也需要指定第二个参数

DOOffset();
DOVector(Color.red, "Name", 2);

15.第一个方法用来改变材质的offset属性的,第二个是用来实现四维向量值的渐变的,如改变颜色时也可以用这个方法

Camera camera;
camera.DOAspect();
camera.DOColor();
camera.DONearClipPlane();
camera.DOFarClipPlane();
camera.DOFieldOfView();
camera.DOOrthoSize();
camera.DOPiexlRect();
camera.DORect();
camera.DOShakePosition();

16.第一个方法是用来改变相机视野宽高比的,第一个参数为宽高比,第二个参数为时间;第二个方法时改变相机背景颜色的,第一个参数为目标颜色,第二个参数为时间;第三个和第四个方法是用来改变相机近切面和远切面的,第一个参数为目标值,第二个参数为时间;第五六个方法分别是改变相机视域的方法,第五个用于透视视野,第六个是正交视野;第一个参数为目标值,第二个参数为时间;可以实现物体的方法和缩小;第七八个方法是用来实现相机分屏的,所不同的是第一个方法是以像素为单位分屏,第二个是以百分比为单位分屏;第一个参数为一个Rect,前两个值表示起点座标,后两个值分别表示宽度和高度,需要注意的是第一个方法后两个值要输计算好的像素,第二个方法的后两个值要写0-1之间的数,表示百分比;第二个参数表示时间;第九个方法是让相机晃动以实现屏幕晃动,第一个参数是时间,第二个参数是振动的力度,第三个参数是震动频率

DOTween.Sequence().Append();
Sequence quence = DOTween.Sequence();
quence.Append(transform.DOMove(Vector3.one, 2));
quence.AppendInterval(1);
quence.Insert(6, transform.DOMove(-Vector3.one, 1));
quence.Join(transform.DOScale(Vector3.one*2, 2));
quence.PrependInterval(1);
quence.Prepend(transform.DOMove(-Vector3.one*2, 2));
quence.PrependCallback(CallbackName);
quence.InsertCallback(5, CallbackName);
quence.AppendCallback(CallbackName);

17.前两个方法都是声明队列用的,其中第二个比较通用,因为能得到具体的对象,便于以后用;第三个方法表示向队列中插入一个动画,参数为一个DOTween动画;第四个方法表示暂停一秒,参数为暂停的时间;第五个方法表示向具体时间点插入动画,参数第一个是时间点,第二个是动画,注意这里的时间点是只计算DOTween动画的时间的;在队列中的动画会严格按照插入的先后依次播放;第六个方法是与在其之前插入的方法一起播放,当然也可以用Insert方法实现相同功能;第七八九个方法是与原来的插入顺序相反的执行方法,即后插入的先执行;第十十一十二个方法是在播放完相应动画后或在相应的时间点执行指定的回调函数

transform.DOMove(Vector3.one, 2).SetLoops(-1, LoopType.Incremental);
LoopType.Restart;
LoopType.Yoyo;

18.设置动画的循环参数,-1指无线循环,Incremental是指向一个方向播放,Restart是指播放完一次后再跳回原位置再循环,Yoyo是指来回晃动

transform.DOMove(Vector3.one, 1).SetDelay(1);
transform.DOMove(Vector3.one, 1).SetSpeedBased();
transform.DOMove(Vector3.one, 1).SetId(0);
DOTween.PlayForward(0);
transform.DOMove(Vector3.one, 1).SetRecyclable(false);
transform.DOMove(Vector3.one, 1).SetRelative(true);
transform.DOMove(Vector3.one, 1).SetUpdate(UpdateType.Normal, true);
gameObject.GetComponent<MeshRenderer>().material.DOColor(Color.red, 8f).SetEase(Ease.Flash, 16, 1);
transform.DOMove(Vector3.one, 4f).SetEase(Ease.Linear);
public AnimationCurve _curve;
transform.DOMove(Vector3.one, 2).SetEase(_curve);

19.第一个设置延迟播放时间;第二个是将方法的第二个参数看作速度,每秒1个Unity单位;第三个设置该动画的Id,可通过下面的方法指定Id播放;第四个是设置该动画是否为可回收,默认为false,设置为true之后动画播放完会作为资源保存;第五个是是否第一个参数为增量;第六个是设置帧动画的模式,Normal是正常的模式,后面的bool值表示是否忽略Unity的timeScale;第七个方法可以实现颜色闪动动画,Ease.Flash表示实现闪动效果,16表示颜色变化次数,最后一个参数取值为-1到1,正数时变化幅度由大逐渐变小,负数时由小逐渐变大,也可运用于运动方法,如DOMove等,以实现运动规律性变化;第八个方法为设置运动方式为匀速;下面两句,是通过Unity设置好运动方式,在传递给DOTween执行,Unity设置界面见下图:

详细可以看这个网站:http://robertpenner.com/easing/easing_demo.html

其中横座标表示时间比例,纵座标表示当前位置与目标位置距离的倍数。上图所示是一种设置好的运动方式(匀速)

using System.Threading.Tasks;
using System;
async void Start()
{
    await Task.Delay(TimeSpan.FromSeconds(3));
}

20.实现中途暂停3秒再向下执行

var list = DOTween.PausedTweens();//获取所有暂停动画
PlayingTweens();//获取正在播的动画
TweensById();//第一个参数有三种,整数,字符串,object,获取当前Id下所有动画,第二个参数为是否收集当前正在播放动画
TweensByTarget();//第一个参数为一个对象,第二个参数为是否收集正在播放动画,返回该对象下所有动画
IsTweenig();//第一个参数同第三个方法,第二个参数为是否收集正在播放,返回当前Id下是否有动画
TotalPlayingTweens();//获取当前所有正在播放和延迟状态的动画
//注意上述方法除第五个外返回的均为一个数组,如没有符合条件的,数组为空,而不是长度为0
tweener.CompletedLoops();
tweener.fullPosition = 0;
tweener.Elapsed();
tweener.Duration();
tweener.Delay();
tweener.ElapsedDirectionalPercentage();
tweener.ElapsedPercentage();
tweener.IsActive();
tweener.IsBackwards();
tweener.IsComplete();
tweener.IsInitialized();
tweener.IsPlaying();
tweener.Loops();

21.从第六个方法说起,若是tweener动画设置了循环次数,则该方法会返回该动画完成了几次循环;第七个方法设置当前动画的播放时间点,如上面设置为0的话,则会重新开始播放;第八个方法为返回当前已经播放时间,有一个参数为是否包括循环,若不包括循环,则每一次新的循环执行前时间都会从零开始;第九个方法返回当前动画的时间,参数同第八个;第十个方法返回动画的延时;十一个方法,返回当前动画完成进度的百分比,不计算循环,若有循环,每次循环开始前会清零;第十二个方法返回当前动画的完成进度,有一个参数,为是否包括循环,若为false则与上面的方法相同;第十三个方法返回当前动画是否还存活;第十四个方法返回当前动画是否被设为倒放;第十五个方法返回当前动画是否已完成;第十六个方法返回当前动画是否已经初始化;第十七个方法返回当前动画是否正在播放;第十八个方法返回当前动画总共循环次数

private Tweener _tweener;
void Start()
{
    _tweener = transform.DOMove(Vector3.one, 1).SetLoops(3);
}
IEnumerator WaitTime()
{
    yield return _tweener.WaitForCompletion();
    yield return _tweener.WaitForElapsedLoops(1);
    yield return _tweener.WaitForKill();
    yield return _tweener.WaitForPosition(1);
    yield return _tweener.WaitForRewind();
    yield return _tweener.WaitForStart();
    Debug.Log("tqt");
}

22.第一个表示当动画播完后执行后面的方法;第二个表示当执行完第一次循环之后执行后面的方法;第三个表示等待动画被杀死后执行后面的方法;第四个表示等待动画执行到1秒时执行后面的方法;第五个同相同方法的回调函数差不多,调用时机比较多,一般是在动画重新播放后调用后面的方法;第六个表示动画Start后执行后面的方法,注意一个动画先Start再Play

public Transform[] posList;
void Start()
{
    var positions = posList.Select(u => u.position).ToArray();
    transform.DOPath(positions, 5, PathType.CatmullRom, PathMode.Full3D, 50, Color.red).SetOptions(true, AxisConstraint.None, AxisConstraint.None).SetLookAt(0);
}

23.路径动画的代码实现:Unity界面:

需要建几个Cube作为路径点,将它们放于Path下;另外我们要移动的Cube放在Path外面,上面的脚本需要挂在它身上,需要注意的是这个Cube也会作为一个位置点;解释上面的代码,var positions = PosList.Select(u => u.position).ToArray();这个利用Linq将posList中的position筛选出来作为一个数组赋给positions;transform.DOPath(positions, 5, PathType.CatmullRom, PathMode.Full3D, 50, Color.red).SetOptions(true, AxisConstraint.None, AxisConstraint.None).SetLookAt(0);先解释DOPath,也就是生成路径的方法,第一个参数是传入路径点,第二个参数是动画时间,第三个参数是设置路径为直线或者曲线,上面的为曲线,第四个参数是设置LookAt的方式的,这里的Full3D是向整个3D空间中看都可以,Ignore是忽略这个参数和其后的LookAt设置,TopDown2D是只能向上或者向下,Sidescroller2D是只能向左右,第五个参数是设置路径的像素点,第六个参数是设置路径的颜色;在解释后面的SetOptions,第一个参数为路径是否闭合,第二个参数是用来设置对移动的轴限制的,第三个参数用来设置对旋转方向的限制;最后再说一下SetLookAt,首先它有三种重载,第一种直接写一个Vecor3的值,表示物体朝这个点看,第二种直接传一个物体,表示让物体朝着这个物体看,第三种是一个0到1之间的数,在闭环情况下,0是物体始终朝着路径前方,0.5物体的路径方向会与其视线方向成一个直角,0.9时视线会基本与前进方向相反,但最好不要写1,1的时候物体的角度将不再改变,若没有闭环,则物体开始运动时同上面叙述一致,但当最后快要运动完成时物体会自动调整视线与前进方向相同

Ps:一个动画多次播放时最好不要在中间加非动画操作但却能影响动画效果的语句,如DOMove后又手动设置了位置,下次再通过其它方法调用上面未销毁DOMove时可能会不执行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章