Unity3D 自动添加Fbx Animation Event
http://blog.csdn.net/aa20274270/article/details/52528449
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Collections.Generic;
public class Test { [MenuItem("Assets/生成动作帧事件")]
public static void GenerAnimationEvent1()
{
List<AnimationEvent> eventGroup = new List<AnimationEvent>();
AnimationEvent hit = new AnimationEvent();
hit.time = 0.0f;
hit.functionName = "hit";
hit.messageOptions = SendMessageOptions.DontRequireReceiver;
eventGroup.Add(hit); AnimationEvent pr = new AnimationEvent();
pr.time = 0.3f;
pr.functionName = "pr";
eventGroup.Add(pr); GenerAnimationEvent(eventGroup.ToArray());
}
private static void GenerAnimationEvent(AnimationEvent[] eventGroup)
{
UnityEngine.Object[] selObjs = Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.DeepAssets);
if (selObjs == null || selObjs.Length == 0)
{
Debug.LogError("请选择需要添加帧事件的动画!");
return;
}
foreach (UnityEngine.Object obj in selObjs)
{
if (obj.GetType() != typeof(GameObject))
continue;
GameObject fbx = (GameObject)obj;
string fbxPath = AssetDatabase.GetAssetPath(fbx);
UnityEngine.Object[] assets = AssetDatabase.LoadAllAssetsAtPath(fbxPath);
foreach (UnityEngine.Object objGo in assets)
{
if (objGo.GetType() != typeof(AnimationClip))
continue;
if (objGo.name.Contains("Take 0"))
continue;
Debug.Log(objGo.name);
AnimationClip clipGo = (AnimationClip)objGo; AnimationEvent[] events = AnimationUtility.GetAnimationEvents(clipGo);
if (events.Length != 0)
{
Debug.Log(fbx.name + "/" + clipGo.name + "已有帧事件");
foreach (AnimationEvent eventGo in events)
Debug.Log(string.Format("functionName: {0}, time: {1}", eventGo.functionName, eventGo.time));
continue;
} ModelImporter modelImporter = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(clipGo)) as ModelImporter;
if (modelImporter == null)
return;
modelImporter.clipAnimations = modelImporter.defaultClipAnimations; SerializedObject serializedObject = new SerializedObject(modelImporter);
SerializedProperty clipAnimations = serializedObject.FindProperty("m_ClipAnimations");
Debug.Log("clipAnimations.arraySize " + clipAnimations.arraySize);
for (int i = 0; i < clipAnimations.arraySize; i++)
{
AnimationClipInfoProperties clipInfoProperties = new AnimationClipInfoProperties(clipAnimations.GetArrayElementAtIndex(i));
clipInfoProperties.SetEvents(eventGroup);
serializedObject.ApplyModifiedProperties();
AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(clipGo));
}
}
}
AssetDatabase.Refresh();
} static void DoAddEventImportedClip(AnimationClip sourceAnimClip, AnimationClip targetAnimClip)
{
ModelImporter modelImporter = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(targetAnimClip)) as ModelImporter;
if (modelImporter == null)
return; SerializedObject serializedObject = new SerializedObject(modelImporter);
SerializedProperty clipAnimations = serializedObject.FindProperty("m_ClipAnimations"); if (!clipAnimations.isArray)
return; for (int i = 0; i < clipAnimations.arraySize; i++)
{
AnimationClipInfoProperties clipInfoProperties = new AnimationClipInfoProperties(clipAnimations.GetArrayElementAtIndex(i));
if (clipInfoProperties.name == targetAnimClip.name)
{
AnimationEvent[] sourceAnimEvents = AnimationUtility.GetAnimationEvents(sourceAnimClip); clipInfoProperties.SetEvents(sourceAnimEvents);
serializedObject.ApplyModifiedProperties();
AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(targetAnimClip));
break;
}
} }
} class AnimationClipInfoProperties
{
SerializedProperty m_Property; private SerializedProperty Get(string property) { return m_Property.FindPropertyRelative(property); } public AnimationClipInfoProperties(SerializedProperty prop) { m_Property = prop; } public string name { get { return Get("name").stringValue; } set { Get("name").stringValue = value; } }
public string takeName { get { return Get("takeName").stringValue; } set { Get("takeName").stringValue = value; } }
public float firstFrame { get { return Get("firstFrame").floatValue; } set { Get("firstFrame").floatValue = value; } }
public float lastFrame { get { return Get("lastFrame").floatValue; } set { Get("lastFrame").floatValue = value; } }
public int wrapMode { get { return Get("wrapMode").intValue; } set { Get("wrapMode").intValue = value; } }
public bool loop { get { return Get("loop").boolValue; } set { Get("loop").boolValue = value; } } // Mecanim animation properties
public float orientationOffsetY { get { return Get("orientationOffsetY").floatValue; } set { Get("orientationOffsetY").floatValue = value; } }
public float level { get { return Get("level").floatValue; } set { Get("level").floatValue = value; } }
public float cycleOffset { get { return Get("cycleOffset").floatValue; } set { Get("cycleOffset").floatValue = value; } }
public bool loopTime { get { return Get("loopTime").boolValue; } set { Get("loopTime").boolValue = value; } }
public bool loopBlend { get { return Get("loopBlend").boolValue; } set { Get("loopBlend").boolValue = value; } }
public bool loopBlendOrientation { get { return Get("loopBlendOrientation").boolValue; } set { Get("loopBlendOrientation").boolValue = value; } }
public bool loopBlendPositionY { get { return Get("loopBlendPositionY").boolValue; } set { Get("loopBlendPositionY").boolValue = value; } }
public bool loopBlendPositionXZ { get { return Get("loopBlendPositionXZ").boolValue; } set { Get("loopBlendPositionXZ").boolValue = value; } }
public bool keepOriginalOrientation { get { return Get("keepOriginalOrientation").boolValue; } set { Get("keepOriginalOrientation").boolValue = value; } }
public bool keepOriginalPositionY { get { return Get("keepOriginalPositionY").boolValue; } set { Get("keepOriginalPositionY").boolValue = value; } }
public bool keepOriginalPositionXZ { get { return Get("keepOriginalPositionXZ").boolValue; } set { Get("keepOriginalPositionXZ").boolValue = value; } }
public bool heightFromFeet { get { return Get("heightFromFeet").boolValue; } set { Get("heightFromFeet").boolValue = value; } }
public bool mirror { get { return Get("mirror").boolValue; } set { Get("mirror").boolValue = value; } } public AnimationEvent GetEvent(int index)
{
AnimationEvent evt = new AnimationEvent();
SerializedProperty events = Get("events"); if (events != null && events.isArray)
{
if (index < events.arraySize)
{
evt.floatParameter = events.GetArrayElementAtIndex(index).FindPropertyRelative("floatParameter").floatValue;
evt.functionName = events.GetArrayElementAtIndex(index).FindPropertyRelative("functionName").stringValue;
evt.intParameter = events.GetArrayElementAtIndex(index).FindPropertyRelative("intParameter").intValue;
evt.objectReferenceParameter = events.GetArrayElementAtIndex(index).FindPropertyRelative("objectReferenceParameter").objectReferenceValue;
evt.stringParameter = events.GetArrayElementAtIndex(index).FindPropertyRelative("data").stringValue;
evt.time = events.GetArrayElementAtIndex(index).FindPropertyRelative("time").floatValue;
}
else
{
Debug.LogWarning("Invalid Event Index");
}
} return evt;
} public void SetEvent(int index, AnimationEvent animationEvent)
{
SerializedProperty events = Get("events"); if (events != null && events.isArray)
{
if (index < events.arraySize)
{
events.GetArrayElementAtIndex(index).FindPropertyRelative("floatParameter").floatValue = animationEvent.floatParameter;
events.GetArrayElementAtIndex(index).FindPropertyRelative("functionName").stringValue = animationEvent.functionName;
events.GetArrayElementAtIndex(index).FindPropertyRelative("intParameter").intValue = animationEvent.intParameter;
events.GetArrayElementAtIndex(index).FindPropertyRelative("objectReferenceParameter").objectReferenceValue = animationEvent.objectReferenceParameter;
events.GetArrayElementAtIndex(index).FindPropertyRelative("data").stringValue = animationEvent.stringParameter;
events.GetArrayElementAtIndex(index).FindPropertyRelative("time").floatValue = animationEvent.time;
} else
{
Debug.LogWarning("Invalid Event Index");
}
}
} public void ClearEvents()
{
SerializedProperty events = Get("events"); if (events != null && events.isArray)
{
events.ClearArray();
}
} public int GetEventCount()
{
int ret = 0; SerializedProperty curves = Get("events"); if (curves != null && curves.isArray)
{
ret = curves.arraySize;
} return ret;
} public void SetEvents(AnimationEvent[] newEvents)
{
SerializedProperty events = Get("events"); if (events != null && events.isArray)
{
events.ClearArray(); foreach (AnimationEvent evt in newEvents)
{
events.InsertArrayElementAtIndex(events.arraySize);
SetEvent(events.arraySize - 1, evt);
}
}
} public AnimationEvent[] GetEvents()
{
AnimationEvent[] ret = new AnimationEvent[GetEventCount()];
SerializedProperty events = Get("events"); if (events != null && events.isArray)
{
for (int i = 0; i < GetEventCount(); ++i)
{
ret[i] = GetEvent(i);
}
} return ret; } }
主要参考:
http://forum.unity3d.com/threads/animationutility-setanimationevents-not-working.243810/
Unity3D 自动添加Fbx Animation Event的更多相关文章
- Unity3D研究院之使用Animation编辑器编辑动画(五十四)
Unity提供了Animation编辑器,它可以为我们编辑物理动画.举个例子比如场景中有一个来回摇动的秋千,这个秋千在项目中完全只起到衬托作用,它不会与别的游戏对象有任何交互.如果这个秋千也用代码来 ...
- Unity3D研究院之使用Animation编辑器编辑动画
Unity提供了Animation编辑器,它可以为我们编辑物理动画.举个例子比如场景中有一个来回摇动的秋千,这个秋千在项目中完全只起到衬托作用,它不会与别的游戏对象有任何交互.如果这个秋千也用代码来 ...
- unity5, animation event
一,给导入的fbx动画添加animation event: 如下图,在双击状态机中的idle状态,打开右面的面板,点开Events项会出现一个时间轴,点击下方播放器的播放按钮或者拖动播放器时间轴上的红 ...
- Zabbix网络自动发现规则和自动添加hosts及link模板
Version: zabbix 3.0 一.配置网络发现规则 Device uniqueness criteria:选择主机名作为唯一标识(Configuation Hosts中显示的NAME) 二. ...
- 关于用Max导出Unity3D使用的FBX文件流程注解
原地址:http://hi.baidu.com/phpstyle/item/c167a4c0694670b10d0a7b87 关于用Max导出Unity3D使用的FBX文件流程注解(转载) (2011 ...
- python logging详解及自动添加上下文信息
之前写过一篇文章日志的艺术(The art of logging),提到了输出日志的时候记录上下文信息的重要性,我认为上下文信息包括: when:log事件发生的时间 where:log事件发生在哪个 ...
- zabbix server的Discover功能,实现zabbix agent 大批量的自动添加,并链接到指定的模版(3)
一.需求 zabbix 服务器可以手动加入zabbix-agent客户端,对于少量的机器,这没有什么.但到了线上,我们有大量的服务器需要监控时,如果再一个个的手动加的话,工作量势必会增加很多.这时,z ...
- 前端自动化工具gulp自动添加版本号
之前,我介绍了学习安装并配置前端自动化工具Gulp,觉得gulp确实比grunt的配置简单很多,于是我决定再深入学习一下gulp,就去网上查了资料,发现gulp还可以自动添加版本号,这个功能就为我平时 ...
- Gulp自动添加版本号(转载)
本文转载自: gulp自动添加版本号
随机推荐
- [容易]Fizz Buzz 问题
题目来源:http://www.lintcode.com/zh-cn/problem/fizz-buzz/
- PYTHON调用C接口(基于Ctypes)实现stein算法最大公约数的计算
相关环境配置 mingw,选择相应的32位.64位的版本,主要用于编译动态链接库dll文件,可用vs替代,这里我选择轻量级的mingw windows64位地址:https://sourceforge ...
- [2017-12-20]ElasticSearch 小记
介绍 ElasticSearch是一款搜索引擎中间件,因其强大的全文索引.查询统计能力和非常方便的全套基于Restful的接口,以及在自动分片.无停机升级扩容.故障转移等运维方面的高效性,逐渐成为中小 ...
- HDU - 1541 Stars 【树状数组】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1541 题意 求每个等级的星星有多少个 当前这个星星的左下角 有多少个 星星 它的等级就是多少 和它同一 ...
- 算法(Algorithms)第4版 练习 1.3.9
主要思路: 用Dijkstra的双栈算法. 遇到数字则压入数字栈中(String). 遇到运算符则压入运算符栈中(String). 遇到右括号时,从数字栈和运算法栈中弹出相应的元素,生成相应的运算表达 ...
- css(4)
类选择器和id选择器都有父子选择器. 在css文件中国,有时候为了简化样式,可以把相同的样式拿出来放在一起. display:inline display:block 行内元素里只能放行内元素,而块内 ...
- html5--1.8超链接下
html5--1.8超链接下 下面演示链接打开新网友不关闭原网页. 外部网站: 百度 这是用a标签的target属性实现的,用的target="_blank" 这样新出现的页面会另 ...
- T56
警方派人监视那个可疑人的住宅.The police put a watch on the suspect's house.他们利用自己的实践经验,设计了一台气冷柴油机.According their ...
- 详解C/C++ 编译 g++ gcc 的区别
我们在编译c/c++代码的时候,有人用gcc,有人用g++,于是各种说法都来了,譬如c代码用gcc,而c++代码用g++, 或者说编译用gcc,链 接用g++,一时也不知哪个说法正确,如果再遇上个ex ...
- BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化
BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化 Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参 ...