public override void OnTrackChanged() { FAnimationTrack animTrack = (FAnimationTrack)Track; FAnimationTrackInspector.RebuildStateMachine(animTrack); FAnimationTrackInspector.SetAnimator(animTrack); }
public static void SetAnimationClip(FPlayAnimationEvent animEvent, AnimationClip animClip) { FAnimationEventInspector editor = (FAnimationEventInspector)CreateEditor(animEvent, typeof(FAnimationEventInspector)); editor.SetAnimationClip(animClip); DestroyImmediate(editor); FAnimationTrackInspector.RebuildStateMachine((FAnimationTrack)animEvent.Track); }
public override void OnTrackChanged() { // Debug.LogWarning("FAnimationTrackEditor.OnTrackChanged"); bool isPreviewing = _track.IsPreviewing; if (isPreviewing) { _track.IsPreviewing = false; } FAnimationTrackInspector.RebuildStateMachine((FAnimationTrack)_track); if (isPreviewing) { _track.IsPreviewing = true; } }
public static void SetAnimator(FAnimationTrack animTrack) { if (animTrack.Owner.GetComponent <Animator>() == null) { Animator animator = animTrack.Owner.gameObject.AddComponent <Animator>(); Undo.RegisterCreatedObjectUndo(animator, string.Empty); } if (animTrack.AnimatorController == null) { var temp = FUtility.GetFluxAssets <UnityEditor.Animations.AnimatorController>("EditorAnimatorController.controller"); var animatorController = Instantiate(temp); animTrack.LayerId = 0; animTrack.LayerName = "Base Layer"; var layers = animatorController.layers; layers[animTrack.LayerId].name = animTrack.LayerName; layers[animTrack.LayerId].stateMachine.name = animTrack.LayerName; animatorController.layers = layers; animTrack.AnimatorController = animatorController; FAnimationTrackInspector.RebuildStateMachine(animTrack); } }
// public static EditorWindow GetAnimationWindow( bool showWindow ) // { // System.Type t = typeof(EditorWindow).Assembly.GetType("UnityEditor.AnimationWindow"); // if( showWindow ) // { // return EditorWindow.GetWindow( t ); // } // // System.Reflection.MethodInfo getWindow = typeof(EditorWindow).GetMethod( "GetWindowDontShow", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static ); // System.Reflection.MethodInfo getWindowGeneric = getWindow.MakeGenericMethod( t ); // return (EditorWindow)getWindowGeneric.Invoke(null, null); // } #endregion #region Upgrade Sequences public static void Upgrade(FSequence sequence) { const int fluxVersion = Flux.FUtility.FLUX_VERSION; if (sequence.Version == fluxVersion) { return; } Debug.LogFormat("Upgrading sequence '{0}' from version '{1}' to '{2}'", sequence.name, sequence.Version, fluxVersion); // is it before 2.0.0 release? if (sequence.Version < 200) { // set TimelineContainer as Content Transform timelineContainer = null; foreach (Transform t in sequence.transform) { if (t.name == "Timeline Container") { timelineContainer = t; break; } } if (timelineContainer == null) { timelineContainer = new GameObject("SequenceContent").transform; timelineContainer.hideFlags |= HideFlags.HideInHierarchy; } sequence.Content = timelineContainer; // create a container, and add it to the sequence FContainer container = FContainer.Create(FContainer.DEFAULT_COLOR); sequence.Add(container); FTimeline[] timelines = timelineContainer.GetComponentsInChildren <FTimeline>(); foreach (FTimeline timeline in timelines) { container.Add(timeline); List <FTrack> tracks = timeline.Tracks; foreach (FTrack track in tracks) { if (track is FAnimationTrack) { FAnimationTrack animTrack = (FAnimationTrack)track; if (animTrack.AnimatorController != null) { FAnimationTrackInspector inspector = (FAnimationTrackInspector)FAnimationTrackInspector.CreateEditor(animTrack); AnimatorController controller = (AnimatorController)animTrack.AnimatorController; inspector.UpdateLayer(controller == null || controller.layers.Length == 0 ? null : controller.layers[0]); inspector.serializedObject.ApplyModifiedProperties(); if (controller.layers.Length > 0) { while (controller.layers[0].stateMachine.stateMachines.Length > 0) { controller.layers[0].stateMachine.RemoveStateMachine(controller.layers[0].stateMachine.stateMachines[controller.layers[0].stateMachine.stateMachines.Length - 1].stateMachine); } while (controller.layers[0].stateMachine.states.Length > 0) { controller.layers[0].stateMachine.RemoveState(controller.layers[0].stateMachine.states[controller.layers[0].stateMachine.states.Length - 1].state); } } Editor.DestroyImmediate(inspector); FAnimationTrackInspector.RebuildStateMachine(animTrack); } } track.CacheMode = track.RequiredCacheMode; } // foreach( FTrack track in tracks ) // { // track.CacheType = track.DefaultCacheType(); // } } } sequence.Version = fluxVersion; }
public override void OnInspectorGUI() { bool rebuildTrack = false; base.OnInspectorGUI(); serializedObject.Update(); if (_animationClip.objectReferenceValue == null) { EditorGUILayout.HelpBox("There's no Animation Clip", MessageType.Warning); Rect helpBoxRect = GUILayoutUtility.GetLastRect(); float yCenter = helpBoxRect.center.y; helpBoxRect.xMax -= 3; helpBoxRect.xMin = helpBoxRect.xMax - 50; helpBoxRect.yMin = yCenter - 12.5f; helpBoxRect.height = 25f; FAnimationTrack animTrack = (FAnimationTrack)_animEvent.Track; if (animTrack.AnimatorController == null || animTrack.LayerId == -1) { GUI.enabled = false; } if (GUI.Button(helpBoxRect, "Create")) { CreateAnimationClip(_animEvent); } GUI.enabled = true; } EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(_animationClip); Rect animationClipRect = GUILayoutUtility.GetLastRect(); if (Event.current.type == EventType.DragUpdated && animationClipRect.Contains(Event.current.mousePosition)) { int numAnimations = NumAnimationsDragAndDrop(_animEvent.Sequence.FrameRate); if (numAnimations > 0) { DragAndDrop.visualMode = DragAndDropVisualMode.Link; } } else if (Event.current.type == EventType.DragPerform && animationClipRect.Contains(Event.current.mousePosition)) { if (NumAnimationsDragAndDrop(_animEvent.Sequence.FrameRate) > 0) { DragAndDrop.AcceptDrag(); AnimationClip clip = GetAnimationClipDragAndDrop(_animEvent.Sequence.FrameRate); if (clip != null) { _animationClip.objectReferenceValue = clip; } } } if (EditorGUI.EndChangeCheck()) { AnimationClip clip = (AnimationClip)_animationClip.objectReferenceValue; if (clip) { if (clip.frameRate != _animEvent.Track.Timeline.Sequence.FrameRate) { Debug.LogError(string.Format("Can't add animation, it has a different frame rate from the sequence ({0} vs {1})", clip.frameRate, _animEvent.Track.Timeline.Sequence.FrameRate)); _animationClip.objectReferenceValue = null; } else { SerializedProperty frameRangeEnd = _frameRange.FindPropertyRelative("_end"); FrameRange maxFrameRange = _animEvent.GetMaxFrameRange(); frameRangeEnd.intValue = Mathf.Min(_animEvent.FrameRange.Start + Mathf.RoundToInt(clip.length * clip.frameRate), maxFrameRange.End); } rebuildTrack = true; } else { CheckDeleteAnimation(_animEvent); } } bool isAnimationEditable = Flux.FUtility.IsAnimationEditable(_animEvent._animationClip); if (isAnimationEditable) { EditorGUILayout.PropertyField(_controlsAnimation); } else { if (_controlsAnimation.boolValue) { _controlsAnimation.boolValue = false; } } if (!_controlsAnimation.boolValue) { if (_animEvent.IsBlending()) { float offset = _startOffset.intValue / _animEvent._animationClip.frameRate; float blendFinish = offset + (_blendLength.intValue / _animEvent._animationClip.frameRate); EditorGUILayout.BeginHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(EditorGUIUtility.labelWidth - 5)); // hack to get around some layout issue with imgui _showBlendAndOffsetContent = EditorGUILayout.Foldout(_showBlendAndOffsetContent, new GUIContent("Offset+Blend")); EditorGUILayout.EndHorizontal(); EditorGUI.BeginChangeCheck(); EditorGUILayout.MinMaxSlider(ref offset, ref blendFinish, 0, _animEvent.GetMaxStartOffset() / _animEvent._animationClip.frameRate + _animEvent.LengthTime); if (EditorGUI.EndChangeCheck()) { _startOffset.intValue = Mathf.Clamp(Mathf.RoundToInt(offset * _animEvent.Sequence.FrameRate), 0, _animEvent.GetMaxStartOffset()); _blendLength.intValue = Mathf.Clamp(Mathf.RoundToInt((blendFinish - offset) * _animEvent.Sequence.FrameRate), 0, _animEvent.Length); rebuildTrack = true; } EditorGUILayout.EndHorizontal(); if (_showBlendAndOffsetContent) { EditorGUI.BeginChangeCheck(); ++EditorGUI.indentLevel; if (!isAnimationEditable) { EditorGUILayout.IntSlider(_startOffset, 0, _animEvent.GetMaxStartOffset()); } // if( _animEvent.IsBlending() ) { EditorGUILayout.IntSlider(_blendLength, 0, _animEvent.Length); } --EditorGUI.indentLevel; if (EditorGUI.EndChangeCheck()) { rebuildTrack = true; } } } else { EditorGUI.BeginChangeCheck(); EditorGUILayout.IntSlider(_startOffset, 0, _animEvent.GetMaxStartOffset()); if (EditorGUI.EndChangeCheck()) { rebuildTrack = true; } } } serializedObject.ApplyModifiedProperties(); if (rebuildTrack) { FAnimationTrackInspector.RebuildStateMachine((FAnimationTrack)_animEvent.Track); } }
public override void OnTrackChanged() { // Debug.LogWarning("FAnimationTrackEditor.OnTrackChanged"); FAnimationTrackInspector.RebuildStateMachine((FAnimationTrack)Track); }
// protected override void OnEnable() // { // base.OnEnable(); // } // // protected override void OnDestroy() // { // base.OnDestroy(); // } // protected override void Init( FObject obj ) // { // base.Init( obj, ); // // _animEvt = (FPlayAnimationEvent)_evt; // // _animTrack = (FAnimationTrack)_animEvt.GetTrack(); // // // } private void UpdateEventFromController() { bool isBlending = AnimEvt.IsBlending(); if (isBlending) { // FPlayAnimationEvent prevAnimEvt = (FPlayAnimationEvent)_animTrack.GetEvents()[_animEvt.GetId() - 1]; if (_transitionToState == null) { _transitionToState = FAnimationTrackInspector.GetTransitionTo(AnimEvt); if (_transitionToState == null || _transitionToState.conditions.Length > 0) { // if( animTrackEditor.PreviewInSceneView ) // animTrackEditor.ClearPreview(); FAnimationTrackInspector.RebuildStateMachine((FAnimationTrack)TrackEditor.Track); _transitionToState = FAnimationTrackInspector.GetTransitionTo(AnimEvt); } } // else // { // if( _transitionToState.conditions.Length > 0 ) // { // FAnimationTrackInspector.RebuildStateMachine( (FAnimationTrack)_trackEditor._track ); // } // } if (_transitionSO == null) { if (_transitionToState != null) { _transitionSO = new SerializedObject(_transitionToState); // SerializedProperty p = _transitionSO.GetIterator(); // // while( p.Next( true ) ) // Debug.Log (p.propertyPath ); _transitionExitTime = _transitionSO.FindProperty("m_ExitTime"); _transitionDuration = _transitionSO.FindProperty("m_TransitionDuration"); _transitionOffset = _transitionSO.FindProperty("m_TransitionOffset"); } } else if (_transitionSO.targetObject == null) { _transitionExitTime = null; _transitionDuration = null; _transitionOffset = null; _transitionSO = null; } } else { if (_transitionToState != null || _transitionSO != null) { _transitionToState = null; _transitionSO = null; _transitionExitTime = null; _transitionOffset = null; _transitionDuration = null; } } if (_transitionSO != null) { _transitionSO.Update(); _animEvtSO.Update(); FPlayAnimationEvent prevAnimEvt = (FPlayAnimationEvent)AnimTrack.Events[AnimEvt.GetId() - 1]; AnimationClip prevAnimEvtClip = prevAnimEvt._animationClip; if (prevAnimEvtClip != null) { float exitTimeNormalized = (prevAnimEvt.Length + prevAnimEvt._startOffset) / (prevAnimEvtClip.frameRate * prevAnimEvtClip.length); if (!Mathf.Approximately(exitTimeNormalized, _transitionExitTime.floatValue)) { _transitionExitTime.floatValue = exitTimeNormalized; } float blendNormalized = (_blendLength.intValue / prevAnimEvtClip.frameRate) / prevAnimEvtClip.length; if (!Mathf.Approximately(blendNormalized, _transitionDuration.floatValue)) { _blendLength.intValue = Mathf.Clamp(Mathf.RoundToInt(_transitionDuration.floatValue * prevAnimEvtClip.length * prevAnimEvtClip.frameRate), 0, AnimEvt.Length); _transitionDuration.floatValue = (_blendLength.intValue / prevAnimEvtClip.frameRate) / prevAnimEvtClip.length; _animEvtSO.ApplyModifiedProperties(); } float startOffsetNorm = (_startOffset.intValue / AnimEvt._animationClip.frameRate) / AnimEvt._animationClip.length; if (!Mathf.Approximately(startOffsetNorm, _transitionOffset.floatValue)) { _startOffset.intValue = Mathf.RoundToInt(_transitionOffset.floatValue * AnimEvt._animationClip.length * AnimEvt._animationClip.frameRate); _transitionOffset.floatValue = (_startOffset.intValue / AnimEvt._animationClip.frameRate) / AnimEvt._animationClip.length; _animEvtSO.ApplyModifiedProperties(); } } _transitionSO.ApplyModifiedProperties(); } }
private void RebuildAnimationTrack() { FAnimationTrackInspector.RebuildStateMachine((FAnimationTrack)AnimEvt.Track); }
public override void OnInspectorGUI() { bool rebuildTrack = false; base.OnInspectorGUI(); serializedObject.Update(); if (_animationClip.objectReferenceValue == null) { EditorGUILayout.HelpBox("无动画剪辑Clip", MessageType.Warning); } EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(_animationClip, _animationClipUI); Rect animationClipRect = GUILayoutUtility.GetLastRect(); if (Event.current.type == EventType.DragUpdated && animationClipRect.Contains(Event.current.mousePosition)) { int numAnimations = NumAnimationsDragAndDrop(_animEvent.Sequence.FrameRate); if (numAnimations > 0) { DragAndDrop.visualMode = DragAndDropVisualMode.Link; } } else if (Event.current.type == EventType.DragPerform && animationClipRect.Contains(Event.current.mousePosition)) { if (NumAnimationsDragAndDrop(_animEvent.Sequence.FrameRate) > 0) { DragAndDrop.AcceptDrag(); AnimationClip clip = GetAnimationClipDragAndDrop(_animEvent.Sequence.FrameRate); if (clip != null) { _animationClip.objectReferenceValue = clip; } } } if (EditorGUI.EndChangeCheck()) { AnimationClip clip = (AnimationClip)_animationClip.objectReferenceValue; if (clip) { if (clip.frameRate != _animEvent.Track.Container.Sequence.FrameRate) { Debug.LogError(string.Format("Can't add animation, it has a different frame rate from the sequence ({0} vs {1})", clip.frameRate, _animEvent.Track.Container.Sequence.FrameRate)); _animationClip.objectReferenceValue = null; } else { SerializedProperty frameRangeEnd = _frameRange.FindPropertyRelative("_end"); FrameRange maxFrameRange = _animEvent.GetMaxFrameRange(); frameRangeEnd.intValue = Mathf.Min(_animEvent.FrameRange.Start + Mathf.RoundToInt(clip.length * clip.frameRate), maxFrameRange.End); } rebuildTrack = true; } else { CheckDeleteAnimation(_animEvent); } } if (_animEvent.IsBlending()) { int id = _animEvent.GetId(); FPlayAnimationEvent preAnimEvt = _animEvent.Track.Events[id - 1] as FPlayAnimationEvent; if (id > 0) { EditorGUI.BeginChangeCheck(); EditorGUILayout.IntSlider(_startOffset, 0, _animEvent.GetMaxStartOffset(), _startOffsetUI); EditorGUILayout.IntSlider(_blendLength, 0, preAnimEvt.Length > _animEvent.Length ? _animEvent.Length : preAnimEvt.Length, _blendLengthUI); if (EditorGUI.EndChangeCheck()) { rebuildTrack = true; } } } else { EditorGUI.BeginChangeCheck(); EditorGUILayout.IntSlider(_startOffset, 0, _animEvent.GetMaxStartOffset(), _startOffsetUI); if (EditorGUI.EndChangeCheck()) { rebuildTrack = true; } } serializedObject.ApplyModifiedProperties(); if (rebuildTrack) { FAnimationTrackInspector.RebuildStateMachine((FAnimationTrack)_animEvent.Track); } }
public override void Init(FObject obj, FEditor owner) { base.Init(obj, owner); FAnimationTrackInspector.SetAnimator((FAnimationTrack)Track); }
private void UpdateEventFromController() { bool isBlending = AnimEvt.IsBlending(); if (isBlending) { if (_transitionToState == null) { _transitionToState = FAnimationTrackInspector.GetTransitionTo(AnimEvt); if (_transitionToState == null || _transitionToState.conditions.Length > 0) { FAnimationTrackInspector.RebuildStateMachine((FAnimationTrack)TrackEditor.Track); _transitionToState = FAnimationTrackInspector.GetTransitionTo(AnimEvt); } } if (_transitionSO == null) { if (_transitionToState != null) { _transitionSO = new SerializedObject(_transitionToState); _transitionExitTime = _transitionSO.FindProperty("m_ExitTime"); _transitionDuration = _transitionSO.FindProperty("m_TransitionDuration"); _transitionOffset = _transitionSO.FindProperty("m_TransitionOffset"); } } else if (_transitionSO.targetObject == null) { _transitionExitTime = null; _transitionDuration = null; _transitionOffset = null; _transitionSO = null; } } else { if (_transitionToState != null || _transitionSO != null) { _transitionToState = null; _transitionSO = null; _transitionExitTime = null; _transitionOffset = null; _transitionDuration = null; } } if (_transitionSO != null) { _transitionSO.Update(); _animEvtSO.Update(); FPlayAnimationEvent prevAnimEvt = (FPlayAnimationEvent)AnimTrack.Events[AnimEvt.GetId() - 1]; AnimationClip prevAnimEvtClip = prevAnimEvt._animationClip; if (prevAnimEvtClip != null) { float blendSeconds = _blendLength.intValue / prevAnimEvtClip.frameRate; if (!Mathf.Approximately(blendSeconds, _transitionDuration.floatValue)) { _transitionDuration.floatValue = blendSeconds; float p = blendSeconds / prevAnimEvtClip.length; _transitionExitTime.floatValue = p > 1f ? 1f : 1f - Mathf.Clamp01(blendSeconds / prevAnimEvtClip.length); _animEvtSO.ApplyModifiedProperties(); } float startOffsetNorm = _startOffset.intValue / AnimEvt._animationClip.frameRate / AnimEvt._animationClip.length; if (!Mathf.Approximately(startOffsetNorm, _transitionOffset.floatValue)) { _transitionOffset.floatValue = startOffsetNorm; _animEvtSO.ApplyModifiedProperties(); } } _transitionSO.ApplyModifiedProperties(); } }