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