原文鏈接: https://blog.csdn.net/pigautumn/article/details/81781403
需求場景:由若干個數量不確定的物體從上到下排列,需要間隔0.1s依次從左到右移動到某個位置,然后返回一小段距離。
分析:使用Unity3D的動畫系統很容易實現這個功能,但是物體數量不確定,考慮將其綁定到同一個物體下,為這個物體動態創建Animation、AnimationClip(一個Animation可以含有多個動作,即AnimationClip,但我們只需要一個動作),然后針對各個子物體創建不同的AnimationCurve,最后調用這個Animation,即可實現各個物體先后按照設定的移動動畫進行運動。
代碼:
class testAnim
{
private Animation _animation = null;
public GameObject Target = null; //目標對象
public GameObject[] Items = null; //目標對象子對象數組
public float[] PosY = null; //目標對象子對象的Y坐標
public float AnimDuration = 0.3f; //動畫所用時間
public float AnimBackTime = 0.1f; //動畫返回所用時間
public float AnimInterval = 0.1f; //相鄰物體間動畫間隔
public float InitXPos = -25; //X坐標初始化位置
public float MaxXPos = 90; //X坐標最大位置
public float DestXPos = 60; //X坐標目標位置
// Use this for initialization
void Start()
{
if (Target == null || Items == null || Items.Length <= 0 || Items.Length != PosY.Length)
{
return;
}
_animation = Target.AddComponent<Animation>();
var clip = new AnimationClip()
{
name = "test",
legacy = true,
wrapMode = WrapMode.Once
};
for (var i = 0; i < Items.Length; i++)
{
var item = Items[i];
if (item == null)
{
continue;
}
var relativePath = item.name;
//創建X軸動畫
var curve = new AnimationCurve();
curve.AddKey(new Keyframe(0, InitXPos)); //初始狀態
curve.AddKey(new Keyframe(0 + AnimInterval * i, InitXPos)); //暫停關鍵幀
curve.AddKey(new Keyframe(0 + AnimInterval * i + AnimDuration, MaxXPos)); //運動關鍵幀
curve.AddKey(new Keyframe(AnimInterval * i + AnimDuration + AnimBackTime, DestXPos)); //返回關鍵幀
clip.SetCurve(relativePath, typeof(RectTransform), "m_AnchoredPosition.x", curve);
//創建Y軸動畫
curve = new AnimationCurve();
curve.AddKey(new Keyframe(0, PosY[i]));
curve.AddKey(new Keyframe(AnimDuration + AnimInterval * i, PosY[i]));
clip.SetCurve(relativePath, typeof(RectTransform), "m_AnchoredPosition.y", curve);
//創建Scale動畫
curve = new AnimationCurve();
curve.AddKey(new Keyframe(0, 0)); //初始狀態
curve.AddKey(new Keyframe(0 + AnimInterval * i, 0)); //暫停狀態
curve.AddKey(new Keyframe(AnimInterval * i + AnimDuration, 1)); //運動狀態
clip.SetCurve(relativePath, typeof(RectTransform), "m_Scale.x", curve);
clip.SetCurve(relativePath, typeof(RectTransform), "m_Scale.y", curve);
}
_animation.AddClip(clip, clip.name);
_animation.Play(clip.name);
}
}
Points:
(1)每個動畫(Animation)可以包含多個片段(AnimationClip),這里只需要一個;
(2)每個片段包含多條曲線(AnimationCurve),每條曲線描述了哪個物體(relativePath)的哪個屬性(例如RectTransform的m_AnchoredPosition.x,表示錨點位置X軸的變化)怎么運動;
(3)每個動作曲線(AnimationCurve)含有多個關鍵幀(Keyframe),表示運動的變化情況,例如X軸坐標從(0秒,位置0)移動到(0.3s,位置90),再移動到(0.4s,位置60);
(4)重要的一點是,在描述例如RectTransform類型的屬性時,需要使用“m_AnchoredPosition.x”的形式,參考“解決AnimationClip.SetCurve RectTransform Color參數 出現Missing!的情況”。
---------------------
作者:xhubobo
來源:CSDN
原文:https://blog.csdn.net/pigautumn/article/details/81781403
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!