UITweener

本文详细解析了NGUI自带动画脚本的工作原理,并对比了NGUI与iTween的不同之处。通过实例展示了如何利用TweenPosition脚本进行动画设置,包括参数配置、动画曲线、播放方式等关键要素,同时提供了控制动画播放的多种方法,如前进、后退、复位等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考官网:http://www.tasharen.com/forum/index.php?topic=6760.0

参考文章:http://dsqiu.iteye.com/blog/1974528

基于 NGUI3.0.7


NGUI自带了一套动画脚本,个人感觉比iTween好用(NGUI的Tween图形化并且使用局部坐标,而iTween的哈希表和绝对坐标比较反人类)。乍看可以用的动画脚本很多(下图),但他们的作用只是设置特定参数 (from -> to),真正执行动画变换的是它们的老爸--UITweener



以TweenPosition脚本为例,该脚本提供了两个参数设置:from to(右图),也就是动画的起始位置。

先看下它的脚本:

using UnityEngine;

public class TweenPosition : UITweener
{
    //起点坐标设置
    public Vector3 from;
    //终点坐标设置
    public Vector3 to;

    
    //该物体的Transform  
	public Transform cachedTransform 
    {
        get { if (mTrans == null) mTrans = transform; return mTrans; } 
    }
    //该物体的位置
	public Vector3 position 
    {
        get { return cachedTransform.localPosition; }
        set { cachedTransform.localPosition = value; } 
    } 


	Transform mTrans;


    //执行动画: 根据此时曲线的value改变该物体的localPosition (<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">OnUpdate是重载函数,</span>由UITweener-Update-Sample调用, factor是曲线此时的value)
	protected override void OnUpdate (float factor, bool isFinished) 
    { 
        cachedTransform.localPosition = from * (1f - factor) + to * factor; 
    }


    //类方法,让物体go在 duration秒 从 当前位置-> pos
	static public TweenPosition Begin (GameObject go, float duration, Vector3 pos)
	{
		TweenPosition comp = UITweener.Begin<TweenPosition>(go, duration);
		comp.from = comp.position;
		comp.to = pos;

        //如果duration<0, 直接从当前位置跳到pos而不播放动画
		if (duration <= 0f)
		{
			comp.Sample(1f, true);
			comp.enabled = false;
		}
		return comp;
	}
}


再简略看下UITweener的脚本:

    void Update ()
	{		
        //可理解为累计播放时间(百分比)          
        mFactor += amountPerDelta * delta;
		//.............(根据Play Style 决定 mFactor的值)
 
		//当Play Style为Once 且 播放完毕,disable该脚本             
        if ((style == Style.Once) && (mFactor > 1f || mFactor < 0f))			
            enabled = false;		
        else Sample(mFactor, false);	
    }	
    public void Sample (float factor, bool isFinished)	
    {
        float val = Mathf.Clamp01(factor);	
        //.............(根据 factor 和 曲线形状 ,计算出曲线当前时间对应的val)	
        //调用子类的OnUpdate,开始动画播放
        OnUpdate((animationCurve != null) ? animationCurve.Evaluate(val) : val, isFinished);
    }

 

知道了动画播放的原理之后,看下TweenPosition继承UITweener脚本中控制动画的设置:

Animation Curve  动画曲线,控制动画的播放。需要注意的是UITweener已经帮你转换好数值,其中X轴(0 ~ 1)表示(0 ~ Duration),Y轴(0 ~ 1)表示(from - to)。

Play Stype  动画的播放方式

Once  只播放一次。播放完成后该脚本自动disable

Loop  循环,也就是从头开始播放。

PingPong  来回播放,像乒乓球一样

Star Delay  n秒后才播放动画

Tween Group  把当前脚本归类到特定组,然后用UIPlayTween控制该组播放

Ignore TimeScale  不会因为TimeScale而改变动画播放速度。(TimeScale在Edit - Project Setting - Time 或 Time.timeScale设置,通常用于加减速或暂停游戏)

除了手动设置播放动画外,还能通过UITweener提供的方法控制:

	public void PlayForward () { Play(true); }
	public void PlayReverse () { Play(false); }
	public void Play (bool forward)
	{
		mAmountPerDelta = Mathf.Abs(amountPerDelta);
		if (!forward) mAmountPerDelta = -mAmountPerDelta;
		enabled = true;
		Update();
	}  
                 
	public void ResetToBeginning ()
	{
		mStarted = false;
		mFactor = (mAmountPerDelta < 0f) ? 1f : 0f;
		Sample(mFactor, false);
	}


Play方法用于设置动画播放方向并激活TweenPositon等子类,然后在Update里进行动画变换了

ResetToBeginning是直接跳回到原点:Forward跳到from, Reverse跳到to。



PS:假如你需要多次进行同方向的动画(以上次的位置为基础),比如多次PlayForward, 需要先用ResetToBeginning方法重置一下,否则物体就会直接从from跳到to而不播放动画。

<div style="top:428px"><pre code_snippet_id="265372" snippet_file_name="blog_20140330_2_2067687" name="code" class="csharp"><pre code_snippet_id="265372" snippet_file_name="blog_20140330_2_2067687">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值