/************************************************************************************************************************/ private void PlayTransition() { var transition = Transition; var animancer = _Instance._Scene.Animancer; animancer.States.TryGet(transition, out var oldState); var targetState = animancer.Play(transition); OnPlayAnimation(); if (oldState != null && oldState != targetState) { oldState.Destroy(); } var warnings = OptionalWarning.UnsupportedEvents.DisableTemporarily(); targetState.Events.OnEnd = () => { if (_NextAnimation != null) { var fadeDuration = AnimancerEvent.GetFadeOutDuration(targetState, AnimancerPlayable.DefaultFadeDuration); PlayOther(NextAnimationKey, _NextAnimation, 0, fadeDuration); OnPlayAnimation(); } else { animancer.Layers[0].IncrementCommandCount(); } }; warnings.Enable(); }
/// <summary>Returns a summary of the `events`.</summary> public static string GetSummary(Sequence events) { var cache = float.IsNaN(events.endEvent.normalizedTime) && AnimancerEvent.IsNullOrDummy(events.endEvent.callback) ? SummaryCache : EndSummaryCache; return(cache.Convert(events.Count)); }
/// <summary>Draws the GUI for the `animancerEvent`.</summary> public static void Draw(ref Rect area, string name, AnimancerEvent animancerEvent) { area.height = AnimancerGUI.LineHeight; if (_EventTimeCache == null) { _EventTimeCache = new ConversionCache <float, string>((time) => float.IsNaN(time) ? "Time = Auto" : $"Time = {time.ToStringCached()}x"); } EditorGUI.LabelField(area, name, _EventTimeCache.Convert(animancerEvent.normalizedTime)); AnimancerGUI.NextVerticalArea(ref area); EditorGUI.indentLevel++; DrawInvocationList(ref area, animancerEvent.callback); EditorGUI.indentLevel--; }
/************************************************************************************************************************/ /// <summary>Draws the GUI fields for the event at the specified `index`.</summary> public static void DoCallbackGUI(ref Rect area, Context context, int index, bool autoSort, string callbackLabel) { EditorGUI.BeginChangeCheck(); using (ObjectPool.Disposable.AcquireContent(out var label, callbackLabel)) { if (index < context.Callbacks.Count) { var callback = context.Callbacks.GetElement(index); area.height = EditorGUI.GetPropertyHeight(callback, false); EditorGUI.BeginProperty(area, GUIContent.none, callback); // UnityEvents ignore the proper indentation which makes them look terrible in a list. // So we force the area to be indented. var indentedArea = EditorGUI.IndentedRect(area); var indentLevel = EditorGUI.indentLevel; EditorGUI.indentLevel = 0; EditorGUI.PropertyField(indentedArea, callback, label, false); EditorGUI.indentLevel = indentLevel; EditorGUI.EndProperty(); } else if (DummySerializableCallback.DoCallbackGUI(ref area, label, context.Callbacks.Property, out var callback)) { try { Sequence.DisableCompactArrays = true; if (index >= context.Times.Count) { context.Times.Property.InsertArrayElementAtIndex(index); context.Times.Count++; context.Times.GetElement(index).floatValue = float.NaN; context.Times.Property.serializedObject.ApplyModifiedProperties(); } context.Callbacks.Property.ForEachTarget((callbacksProperty) => { var accessor = callbacksProperty.GetAccessor(); var oldCallbacks = (Array)accessor.GetValue(callbacksProperty.serializedObject.targetObject); Array newCallbacks; if (oldCallbacks == null) { var elementType = accessor.GetFieldElementType(callbacksProperty); newCallbacks = Array.CreateInstance(elementType, 1); } else { var elementType = oldCallbacks.GetType().GetElementType(); newCallbacks = Array.CreateInstance(elementType, index + 1); Array.Copy(oldCallbacks, newCallbacks, oldCallbacks.Length); } newCallbacks.SetValue(callback, index); accessor.SetValue(callbacksProperty, newCallbacks); }); context.Callbacks.Property.OnPropertyChanged(); context.Callbacks.Refresh(); } finally { Sequence.DisableCompactArrays = false; } } } if (EditorGUI.EndChangeCheck()) { if (index < context.Callbacks.Count) { var events = context.Sequence?.InitializedEvents; if (events != null) { var animancerEvent = index < events.Count ? events[index] : events.endEvent; if (AnimancerEvent.IsNullOrDummy(animancerEvent.callback)) { context.Callbacks.Property.serializedObject.ApplyModifiedProperties(); var property = context.Callbacks.GetElement(index); var callback = property.GetValue(); var invoker = Sequence.GetInvoker(callback); if (index < events.Count) { events.SetCallback(index, invoker); } else { events.OnEnd = invoker; } } } } } AnimancerGUI.NextVerticalArea(ref area); }