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