Beispiel #1
0
    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;
            }
        }
    }
Beispiel #2
0
        static public AnimationWindowEvent Edit(AnimationClipInfoProperties clipInfo, int eventIndex)
        {
            AnimationWindowEvent animationWindowEvent = CreateInstance <AnimationWindowEvent>();

            animationWindowEvent.hideFlags = HideFlags.HideInHierarchy;
            animationWindowEvent.name      = "Animation Event";

            animationWindowEvent.root       = null;
            animationWindowEvent.clip       = null;
            animationWindowEvent.clipInfo   = clipInfo;
            animationWindowEvent.eventIndex = eventIndex;

            return(animationWindowEvent);
        }
Beispiel #3
0
    static void DoAddEventImportedClip(AnimationClip sourceAnimClip, AnimationClip targetAnimClip, bool iscurve, bool isevent, bool isloop)
    {
        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);
                if (iscurve)
                {
                    EditorCurveBinding[] curveBindings = AnimationUtility.GetCurveBindings(sourceAnimClip);
                    AnimationCurve       curve         = AnimationUtility.GetEditorCurve(sourceAnimClip, curveBindings[0]);
                    clipInfoProperties.SetCurve(curve, curveBindings[0].propertyName);
                }
                if (isevent)
                {
                    clipInfoProperties.SetEvents(sourceAnimEvents);
                }
                if (isloop)
                {
                    AnimationClipSettings animaSetting = AnimationUtility.GetAnimationClipSettings(sourceAnimClip);
                    clipInfoProperties.SetLoop(animaSetting);
                }
                serializedObject.ApplyModifiedProperties();
                AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(targetAnimClip));
                break;
            }
        }
    }
Beispiel #4
0
    /// <summary>
    /// 对动作进行添加运行事件, 【注意:如果动作上已经有事件,那这个动作必需手动清理掉,不然不会进行处理,避免动作运行事件重复生成!】
    /// </summary>
    private static void AutoAnimationEvent(bool useActionEvent = false)
    {
        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);

                string actionName                = objGo.name.Trim();
                bool   isLoop                    = false;
                bool   isExistActionEvent        = false;
                List <AnimationEvent> eventGroup = new List <AnimationEvent>();
                if (ActionConfig.actionCfg.ContainsKey(actionName))
                {
                    ActionData ad = ActionConfig.actionCfg[actionName];
                    isLoop = ad.isLoop;
                    if (useActionEvent)
                    {
                        if (ad.endCallback)
                        {
                            eventGroup.Add(CreateActionEvent("OnActionEnd", 0.9f, 0, objGo.name));
                        }
                        for (int i = 0; i < ad.triggerIds.Count; i++)
                        {
                            int   triggerId    = ad.triggerIds[i];
                            float triggerDelay = ad.triggerDelays[i];
                            eventGroup.Add(CreateActionEvent("OnActionTriggerId", triggerDelay, triggerId));
                        }
                    }
                }

                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));
                    }

                    isExistActionEvent = true;
                    //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.loopTime = isLoop;
                    if (!isExistActionEvent)
                    {
                        serializedObject.ApplyModifiedProperties();
                    }
                    clipInfoProperties.SetEvents(eventGroup.ToArray());
                    serializedObject.ApplyModifiedProperties();

                    AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(clipGo));
                }
            }
        }
        AssetDatabase.Refresh();
    }
Beispiel #5
0
    /// <summary>
    /// 对动作进行添加运行事件, 【注意:如果动作上已经有事件,那这个动作必需手动清理掉,不然不会进行处理,避免动作运行事件重复生成!】
    /// </summary>
    /// <param name="eventGroup"></param>
    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();
    }