Unity中在运行时获取AnimationClip中的关键帧信息
今天遇到一个制作动画路径的问题如下:
从题中可以看出物体路径受指定动画操控,我们不能改变控制方式,因此问题的重点在于如何从AnimationClip中获得位置每帧物体XYZ移动的位置信息,有了位置信息,绘制线条也就不是难事了。
查询了官方文档发现通过一个编辑器类可以获取到帧信息AnimationUtility
但是它只能在编辑器模式下使用因此便想到了在编辑器模式下把帧信息序列化,然后在运行时读取便能解决问题
以下为主要代码
public class ClipInfo : EditorWindow
{private AnimationClip clip;[MenuItem("Window/Clip Info")]static void Init(){GetWindow(typeof(ClipInfo));}public void OnGUI(){clip = EditorGUILayout.ObjectField("Clip", clip, typeof(AnimationClip), false) as AnimationClip;EditorGUILayout.LabelField("Curves:");if (clip != null){foreach (var binding in AnimationUtility.GetCurveBindings(clip)){AnimationCurve curve = AnimationUtility.GetEditorCurve(clip, binding);EditorGUILayout.LabelField(binding.path + "/" + binding.propertyName + ", Keys: " + curve.keys.Length);for (int i = 0; i < curve.length; i++){EditorGUILayout.LabelField("Keys" + i + ":" + curve[i].value);}}}if (GUILayout.Button("Save")){Save(); }}public void Save(){if (clip != null){ObjectPosCurvesData o = new ObjectPosCurvesData();foreach (var binding in AnimationUtility.GetCurveBindings(clip)){AnimationCurve curve = AnimationUtility.GetEditorCurve(clip, binding);Debug.Log(binding.propertyName);if (binding.propertyName == "m_LocalPosition.x"){o.curveX = new float[curve.length];o.KeyLength = curve.length;for (int i = 0; i < curve.length; i++){o.curveX[i] = curve[i].value;}}else if (binding.propertyName == "m_LocalPosition.y"){o.curveY = new float[curve.length];for (int i = 0; i < curve.length; i++){o.curveY[i] = curve[i].value;}}else if (binding.propertyName == "m_LocalPosition.z"){o.curveZ = new float[curve.length];for (int i = 0; i < curve.length; i++){o.curveZ[i] = curve[i].value;}}}//序列化并保存文件FileUtils.SaveFile(@"E:\AnimationData\AD.data",FileUtils.SerializeToBinary(o));}}
}[Serializable]
public class ObjectPosCurvesData
{public int KeyLength;public float[] curveX;public float[] curveY;public float[] curveZ;
}
Unity中在运行时获取AnimationClip中的关键帧信息相关推荐
- gettype获取类名_在TypeScript中运行时获取对象的类名
在TypeScript中运行时获取对象的类名 是否可以使用typescript在运行时获取对象的类/类型名称? class MyClass{} var instance = new MyClass() ...
- 在Amazon FreeRTOS V10中使用运行时统计信息
在MCU on Eclipse网站上看到Erich Styger在8月2日发的博文,一篇关于在Amazon FreeRTOS V10中使用运行时统计信息的文章,本人觉得很有启发,特将其翻译过来以备参考 ...
- Java对象运行时在内存中的情况
Java对象运行时在内存中的情况 您可能已经知道,一旦创建了一个对象,它就只是堆中的一系列字节.您可能对Java对象在内存中的情况感到好奇吗? 1.变量 以下是"Base"(B)类 ...
- 运行时数据区中包含哪些区域?哪些线程共享?哪些线程独享?
运行时数据区中包含哪些区域?哪些线程共享?哪些线程独享?[⭐⭐⭐⭐⭐] Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域. JDK 1.8 和之前的版本略有不同 ...
- JVM Runtime Data Area(运行时数据区中的堆/栈/方法区讲解)
JVM的组成 JVM由4大部分组成:ClassLoader .Runtime Data Area .Execution Engine .Native Interface.我们这里重点讲得是Runtim ...
- java hibernate方言_java – 如何在运行时获取Hibernate方言
在我的应用程序中,我使用Hibernate与SQL Server数据库,所以我设置 在我的persistence.xml中. 在某些情况下,我想用NULL包括排序记录,我使用关键字NULLS FIRS ...
- java 获取运行时参数,Java8增强反射可以在运行时获取参数名
技术公众号:Java In Mind(Java_In_Mind),欢迎关注! 原文:Java8增强反射可以在运行时获取参数名 介绍 在JDK增强意见:JPE 118:Access to Paramet ...
- java 运行时获取泛型真实类型
前情提要 本文章用于运行时获取泛型的具体类型,有一些情况下可以获取到真实类型,有一些情况下获取不到的情况. Class 类的两个方法 /*** Returns the {@code Class} re ...
- 如何在程序运行时获取 dpdk-16.04 大页使用情况?
前言 基于 dpdk-16.04 开发的 dpdk 程序需要使用的大页内存总大小可以通过计算得出,但由于 dpdk-16.04 legacy memory 模型只支持物理地址连续的 segment 内 ...
最新文章
- BLAST引物或靶点特异性
- PLSQL_性能优化系列17_Oracle Merge Into和Update更新效率
- 6 redhat 查看rtc时间_甜甜老师的DB Fun圈第2讲:GaussDB 100 OLTP 单机在RHEL7.6上的安装...
- 空气质量html模板,基于HTML5+CSS3移动端空气质量APP的设计与实现
- 基于空间金字塔池化的卷积神经网络物体检测
- [转]Linux awk 命令 说明
- python udp 传输文件_python网络编程:UDP方式传输数据
- MySQL查询select实例 【笔记】
- 使用selenium 驱动最新火狐浏览器出错:ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的连接。...
- 程序员撕开京东 618 大促压测的另一面 | 原力计划
- 【C++】异常简述(三):补充之如何看待C++异常
- 基于MATLAB的车牌识别(GUI)
- R语言——双因素方差分析
- 国外5G行业应用产业政策分析及对我国的启示
- c++链表——银行账户管理系统
- 转 研发团队绩效评定机制细则。
- 【视频分享】尚学堂---数据结构和算法
- 史上最详细sql注入wp
- 新手学习嵌入式开发要学什么
- 单线复用有线Mesh组网案例