private static AnimationWindowEventData GetData(AnimationWindowEvent[] awEvents) { var data = new AnimationWindowEventData(); if (awEvents.Length == 0) return data; AnimationWindowEvent firstAwEvent = awEvents[0]; data.root = firstAwEvent.root; data.clip = firstAwEvent.clip; data.clipInfo = firstAwEvent.clipInfo; if (data.clip != null) data.events = AnimationUtility.GetAnimationEvents(data.clip); else if (data.clipInfo != null) data.events = data.clipInfo.GetEvents(); if (data.events != null) { List<AnimationEvent> selectedEvents = new List<AnimationEvent>(); foreach (var awEvent in awEvents) { if (awEvent.eventIndex >= 0 && awEvent.eventIndex < data.events.Length) selectedEvents.Add(data.events[awEvent.eventIndex]); } data.selectedEvents = selectedEvents.ToArray(); } return data; }
private static void SetData(AnimationWindowEvent[] awEvents, AnimationWindowEventData data) { if (data.events == null) return; if (data.clip != null) { Undo.RegisterCompleteObjectUndo(data.clip, "Animation Event Change"); AnimationUtility.SetAnimationEvents(data.clip, data.events); } else if (data.clipInfo != null) { foreach (var awEvent in awEvents) { if (awEvent.eventIndex >= 0 && awEvent.eventIndex < data.events.Length) data.clipInfo.SetEvent(awEvent.eventIndex, data.events[awEvent.eventIndex]); } } }
static void ResetValues(MenuCommand command) { AnimationWindowEvent awEvent = command.context as AnimationWindowEvent; AnimationWindowEvent[] awEvents = new AnimationWindowEvent[] {awEvent}; AnimationWindowEventData data = GetData(awEvents); if (data.events == null || data.selectedEvents == null || data.selectedEvents.Length == 0) return; foreach (var evt in data.selectedEvents) { evt.functionName = ""; evt.stringParameter = string.Empty; evt.floatParameter = 0f; evt.intParameter = 0; evt.objectReferenceParameter = null; } SetData(awEvents, data); }
public static void OnEditAnimationEvents(AnimationWindowEvent[] awEvents) { AnimationWindowEventData data = GetData(awEvents); if (data.events == null || data.selectedEvents == null || data.selectedEvents.Length == 0) { return; } AnimationEvent firstEvent = data.selectedEvents[0]; bool singleFunctionName = Array.TrueForAll(data.selectedEvents, evt => evt.functionName == firstEvent.functionName); GUI.changed = false; if (data.root != null) { List <AnimationWindowEventMethod> methods = new List <AnimationWindowEventMethod>(); HashSet <string> overloads = new HashSet <string>(); CollectSupportedMethods(data.root, methods, overloads); var methodsFormatted = new List <string>(methods.Count); for (int i = 0; i < methods.Count; ++i) { AnimationWindowEventMethod method = methods[i]; string postFix = " ( )"; if (method.parameterType != null) { if (method.parameterType == typeof(float)) { postFix = " ( float )"; } else if (method.parameterType == typeof(int)) { postFix = " ( int )"; } else { postFix = string.Format(" ( {0} )", method.parameterType.Name); } } methodsFormatted.Add(method.name + postFix); } int notSupportedIndex = methods.Count; int selected = methods.FindIndex(method => method.name == firstEvent.functionName); if (selected == -1) { selected = methods.Count; AnimationWindowEventMethod newMethod = new AnimationWindowEventMethod(); newMethod.name = firstEvent.functionName; newMethod.parameterType = null; methods.Add(newMethod); if (string.IsNullOrEmpty(firstEvent.functionName)) { methodsFormatted.Add(kNoneSelected); } else { methodsFormatted.Add(firstEvent.functionName + kNotSupportedPostFix); } } EditorGUIUtility.labelWidth = 130; EditorGUI.showMixedValue = !singleFunctionName; int wasSelected = singleFunctionName ? selected : -1; selected = EditorGUILayout.Popup("Function: ", selected, methodsFormatted.ToArray()); if (wasSelected != selected && selected != -1 && selected != notSupportedIndex) { foreach (var evt in data.selectedEvents) { evt.functionName = methods[selected].name; evt.stringParameter = string.Empty; } } EditorGUI.showMixedValue = false; var selectedParameter = methods[selected].parameterType; if (singleFunctionName && selectedParameter != null) { EditorGUILayout.Space(); if (selectedParameter == typeof(AnimationEvent)) { EditorGUILayout.PrefixLabel("Event Data"); } else { EditorGUILayout.PrefixLabel("Parameters"); } DoEditRegularParameters(data.selectedEvents, selectedParameter); } if (overloads.Count > 0) { EditorGUILayout.Space(); EditorGUILayout.HelpBox(s_OverloadWarning.text, MessageType.Warning, true); } } else { EditorGUI.showMixedValue = !singleFunctionName; string oldFunctionName = singleFunctionName ? firstEvent.functionName : ""; string functionName = EditorGUILayout.TextField(EditorGUIUtility.TrTextContent("Function"), oldFunctionName); if (functionName != oldFunctionName) { foreach (var evt in data.selectedEvents) { evt.functionName = functionName; evt.stringParameter = string.Empty; } } EditorGUI.showMixedValue = false; if (singleFunctionName) { DoEditRegularParameters(data.selectedEvents, typeof(AnimationEvent)); } else { using (new EditorGUI.DisabledScope(true)) { AnimationEvent dummyEvent = new AnimationEvent(); DoEditRegularParameters(new AnimationEvent[] { dummyEvent }, typeof(AnimationEvent)); } } } if (GUI.changed) { SetData(awEvents, data); } }