重写Tween动画组件

tween 动画源于一系列的数学公式 。今天仔细的介绍他们 如何通过数学公式一步步的封装出 tween 动画 。以及对NGUI的 Tween 进行重写 。

参考文章 : http://www.manew.com/forum.php?mod=viewthread&tid=40974

 关于如何 自己写一个动画 上面的翻译已经有了十分详细的解释 。就不再造车了。

下面记录一下 在NGUI中 重写Tween 的效果。

先新建一个脚本 TweenPositionAndScale.cs

将 TweenPosition的内容直接复制到 里面:

public class TweenPositionAndScale : UITweener
{
    public Vector3 from;
    public Vector3 to;

    [HideInInspector]
    public bool worldSpace = false;

    Transform mTrans;
    UIRect mRect;

    public Transform cachedTransform { get { if (mTrans == null) mTrans = transform; return mTrans; } }

    [System.Obsolete("Use 'value' instead")]
    public Vector3 position { get { return this.value; } set { this.value = value; } }

    /// <summary>
    /// Tween's current value.
    /// </summary>

    public Vector3 value
    {
        get
        {
            return worldSpace ? cachedTransform.position : cachedTransform.localPosition;
        }
        set
        {
            if (mRect == null || !mRect.isAnchored || worldSpace)
            {
                if (worldSpace) cachedTransform.position = value;
                else cachedTransform.localPosition = value;
            }
            else
            {
                value -= cachedTransform.localPosition;
                NGUIMath.MoveRect(mRect, value.x, value.y);
            }
        }
    }

    void Awake() { mRect = GetComponent<UIRect>(); }

    /// <summary>
    /// Tween the value.
    /// </summary>

    protected override void OnUpdate(float factor, bool isFinished) 
    { 
        value = from * (1f - factor) + to * factor;
    }

    /// <summary>
    /// Start the tweening operation.
    /// </summary>

    static public TweenPosition Begin(GameObject go, float duration, Vector3 pos)
    {
        TweenPosition comp = UITweener.Begin<TweenPosition>(go, duration);
        comp.from = comp.value;
        comp.to = pos;

        if (duration <= 0f)
        {
            comp.Sample(1f, true);
            comp.enabled = false;
        }
        return comp;
    }

    /// <summary>
    /// Start the tweening operation.
    /// </summary>

    static public TweenPosition Begin(GameObject go, float duration, Vector3 pos, bool worldSpace)
    {
        TweenPosition comp = UITweener.Begin<TweenPosition>(go, duration);
        comp.worldSpace = worldSpace;
        comp.from = comp.value;
        comp.to = pos;

        if (duration <= 0f)
        {
            comp.Sample(1f, true);
            comp.enabled = false;
        }
        return comp;
    }

    [ContextMenu("Set 'From' to current value")]
    public override void SetStartToCurrentValue() { from = value; }

    [ContextMenu("Set 'To' to current value")]
    public override void SetEndToCurrentValue() { to = value; }

    [ContextMenu("Assume value of 'From'")]
    void SetCurrentValueToStart() { value = from; }

    [ContextMenu("Assume value of 'To'")]
    void SetCurrentValueToEnd() { value = to; }
}

观察代码可一发现 改变transform的 位置值是在 Value 里面。 而 Value的值的改变 是在 OnUpdate (float factor, bool isFinished) 里面。 如果看了上面连接的博客就知道这个值是有渐变函数公式计算的出的一个值,直接将他应用 到Scale上 ,参考 TweenScale 加上这些变量


public Vector3 fromScale;
public Vector3 toScale;

public bool updateTable = false;
UITable mTable;

/// <summary>
/// Tween Scale Value
/// </summary>

public Vector3 valueScale { get { return cachedTransform.localScale; } set { cachedTransform.localScale = value; } }

在Onupdate里来改变 他的值,加上:

valueScale = fromScale * (1f - factor) + toScale * factor;

        if (updateTable)
        {
            if (mTable == null)
            {
                mTable = NGUITools.FindInParents<UITable>(gameObject);
                if (mTable == null) { updateTable = false; return; }
            }
            mTable.repositionNow = true;
        }


Ok



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值