Unity3D 自动添加Fbx Animation Event

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/



posted @ 2017-03-03 15:04 00000000O 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值