NGUI有自带的tween动画,但是UGUI却没有,如果需要UGUI实现tween动画效果,需要使用插件DoTween.
下载地址:http://download.csdn.net/detail/u011484013/9877427
DoTween使用之前,需要添加引用 using DG.Tweening;
使用方式:
首先获取对象的RectTransform实例rectTransform
基本的移动:rectTransform.DOMove (new Vector2(100,100),1f);
DoMove移动的位置是屏幕的左下角,如果想要移动的位置和Inspector上面显示的左边一致,需要添加屏幕的偏移量:
centerPos = new Vector2 (Screen.width*0.5f,Screen.height*0.5f);
rectTransform.DOMove(new Vector3(Screen.width * 0.5f+100, Screen.height * 0.5f+100,0), 1f);
缩放:rectTransform.DOScale (new Vector3(2,2,1),1f);
旋转:rectTransform.DORotate (new Vector3(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:
创建一个UGUI image对象,然后在该对象上面添加脚本DoTweenTest2.cs
code:
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;
}
}
}
}
相关博客参考:
http://blog.csdn.net/lyh916/article/details/45888117
http://m.blog.csdn.net/begonia__z/article/details/51244304