Unity3D 自动添加Fbx Animation Event

来源:互联网 发布:linux ftp登录 编辑:程序博客网 时间:2024/06/10 20:51
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/



0 0
原创粉丝点击