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/