DoTween 控制UGUI tween动画

发表于2018-08-01
评论0 7.3k浏览
NGUI有自带的tween动画,但是UGUI却没有,如果想用UGUI实现tween动画效果,需要使用插件DoTween。

DoTween使用之前,需要添加引用usingDG.Tweening;  

使用方式: 
首先获取对象的RectTransform实例rectTransform  

基本的移动:
rectTransform.DOMove(newVector2(100,100),1f);  

DoMove移动的位置是屏幕的左下角,如果想要移动的位置和Inspector上面显示的左边一致,需要添加屏幕的偏移量:  

centerPos=newVector2(Screen.width*0.5f,Screen.height*0.5f);  
rectTransform.DOMove(newVector3(Screen.width*0.5f+100,Screen.height*0.5f+100,0),1f);  
缩放:rectTransform.DOScale(newVector3(2,2,1),1f);  
旋转:rectTransform.DORotate(newVector3(0,0,180),1f);  

移动相关的基本事件:  
OnComplete(TweenCallback callback)  
OnKill(TweenCallback callback)  
OnPlay(TweenCallback callback)  
OnPause(TweenCallback callback)  
OnRewind(TweenCallback callback)  
OnStart(TweenCallback callback)  
OnStepComplete(TweenCallback callback)  
OnUpdate(TweenCallback callback)  
OnWaypointChange(TweenCallback<int> callback) 

使用方式:  
tweener.OnComplete (delegate() {
        Debug.Log("tween animation 结束");
    });

测试demo:  
创建一个UGUIimage对象,然后在该对象上面添加脚本DoTweenTest2.cs  
using UnityEngine;
using System.Collections;
using DG.Tweening;
using UnityEngine.UI;
public class DoTweenTest2 : MonoBehaviour {
    Vector2 centerPos;
    Image image;
    // Use this for initialization
    void Start () {
        centerPos = new Vector2 (Screen.width*0.5f,Screen.height*0.5f);
        image = transform.GetComponent<Image>();
    }
    void OnGUI(){
        if(GUILayout.Button("move to word pos(100,100)")){
            //DoMove的坐标系是左下角为准,移动到100,100位置
            image.rectTransform.DOMove (new Vector2(100,100),1f);
        }
        if(GUILayout.Button("move to anchor pos(100,100)")){
            image.rectTransform.DOMove(new Vector3(Screen.width * 0.5f+100, Screen.height * 0.5f+100,0), 1f); 
        }
        if(GUILayout.Button("add scale (2,2)")){//每点击一次,在原始缩放基础上放大(2,2)
            //当前sacle(1,1,1)1秒内添加到(3,3,1)
            image.rectTransform.DOBlendableScaleBy (new Vector2(2,2),1f);
            //          image.rectTransform.DOScale (new Vector2(2,2),1f);
        }
        if(GUILayout.Button("scale to (2,2,1)")){
            image.rectTransform.DOScale (new Vector3(2,2,1),1f);
        }
        if(GUILayout.Button("rotate 180 degree")){
            //旋转到180度
            image.rectTransform.DORotate (new Vector3(0,0,180),1f);
        }
        if(GUILayout.Button("test tweener event")){
            Tweener tweener = image.rectTransform.DOMove(new Vector3(Screen.width * 0.5f+300, Screen.height * 0.5f-100,0), 1f); 
            tweener.OnPlay (OnPlay);
            tweener.OnComplete (OnComplete);
//          tweener.OnComplete (delegate() {
//              Debug.Log("tween animation 结束");
//          });
        }
    }
    void OnComplete(){
        Debug.Log("tween animation 结束");
    }
    void OnPlay(){
        Debug.Log("tween animation 开始");
    }
}

常用事件脚本:  
using UnityEngine;
using System.Collections;
using DG.Tweening;
public class DoTween_event : MonoBehaviour {
    public RectTransform panelTranform;
    private bool isIn = false;
    public LoopType loopType;                  //循环的模式
    void Start()
    {
        Tweener paneltweener = panelTranform.DOScale (new Vector3(2,2,1),1f);
        //多次调用DOTween动画会影响性能
        //DOTween默认动画播放完毕时会自动销毁动画
        //Tweener对象保存这个动画
        paneltweener.SetAutoKill(false);              //禁止销毁动画
        paneltweener.Pause();                         //停止播放动画
        //paneltweener.SetDelay(0.5f);                //设置动画延迟播放
        //paneltweener.SetEase(Ease.INTERNAL_Zero);   //设置动画运动的模式
        //paneltweener.SetLoops(-1);                  //设置循环播放 (当参数为-1的时候循环播放;当参数>=0的时候则表示循环的次数;0的时候表示循环一次)
        paneltweener.SetLoops(-1,loopType);          //设置循环播放并且设置动画循环的模式
        //paneltweener.PlayForward();                 //播放
        //paneltweener.PlayBackwards();               //倒放
        paneltweener.OnComplete(OnComplete);        //动画播放完毕后执行,动画倒放时候不执行
        paneltweener.OnStart(OnStart);              //动画第一次播放时执行
        paneltweener.OnUpdate(OnUpdate);            //动画播放时不断执行
        paneltweener.OnPlay(OnPlay);                //动画开始播放时执行
        //paneltweener.OnStepComplete(OnStepComplete);//动画播放且倒放都会执行一次,且执行顺序先于OnComplete
        //paneltweener.OnKill(OnKill);                //动画删除的时候执行事件
        //paneltweener.Kill(true);                    //删除动画且组件会直接到达指定位置
    }
    private void OnKill()
    {
        Debug.Log("This is OnKill");
    }
    private void OnStepComplete()
    {
        Debug.Log("This is OnStepComplete");
    }
    private void OnPlay()
    {
        Debug.Log("This is OnPlay");
    }
    private void OnUpdate()
    {
        Debug.Log("This is OnUpdate");
    }
    private void OnStart()
    {
        Debug.Log("动画第一次播放");
    }
    void OnComplete()
    {
        Debug.Log("动画播放完毕!");
    }
    // Update is called once per frame
    void Update () {
        if(Input.GetMouseButtonDown(0)){
            if(!isIn)
            {
                //注释掉的方法是效果都是一样的
                //panelTranform.DOPlay();                     //动画只会播放一次
                panelTranform.DOPlayForward();                //前进
                //paneltweener.PlayForward();                 //播放
                isIn = true;
            }
            else
            {
                //paneltweener.PlayBackwards();               //倒放
                panelTranform.DOPlayBackwards();              //倒放
                isIn = false;
            }
        }
    }
}
来自:https://blog.csdn.net/u011484013/article/details/73566187

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引