原文链接: 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
版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. 像黑客一样使用 Linux 命令行
  2. SQL Server 高级sql总结
  3. Mac上更新Ruby
  4. java之内部类详解
  5. 【XLL API 函数】 xlGetInst
  6. mac操作快捷键
  7. 【Other】千字文 硬笔 楷书 字帖
  8. jsp七大动作指令
  9. sql 中的回车和换行问题
  10. pstack使用和原理
  11. BI案例:某通信企业综合报表和决策分析系统实施案例
  12. OC基础(13)
  13. centos下在php.ini设置时区
  14. Safari 浏览器模拟iPhone和其他浏览器
  15. MySQL导入数据报 Got a packet bigger than‘max_allowed_packet’bytes 错误的解决方法
  16. 解决vscode无法安装golang相关插件的问题 - 即无法直连golang.org的问题
  17. 记一次安装Nginx+php-fpm安装后无法解析.php文件,状态码200,但显示空白页
  18. 解题(LevenshteinInstance--Levenshtein距离)
  19. OAuth 白话简明教程 2.授权码模式(Authorization Code)
  20. splice的多种用法

热门文章

  1. Translent关键字-InvalidClassException异常_原理和解决方案
  2. 结构型模式 - 代理模式Proxy
  3. LeetCode_804. 唯一摩尔斯密码词
  4. docker03-常用命令
  5. 逻辑运算符、成员运算符、身份运算符、流程控制、if判断、while循环
  6. react 项目的性能优化
  7. Training Spiking Neural Networks with Local Tandem Learning
  8. MQ收到无序的消息时如何进行业务处理
  9. P4525 【模板】自适应辛普森法 1
  10. Bus Stop