예제 #1
0
        public override void OnTrackChanged()
        {
            FAnimationTrack animTrack = (FAnimationTrack)Track;

            FAnimationTrackInspector.RebuildStateMachine(animTrack);
            FAnimationTrackInspector.SetAnimator(animTrack);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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;
            }
        }
예제 #4
0
 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);
     }
 }
예제 #5
0
//		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;
        }
예제 #6
0
        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);
 }
예제 #10
0
        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);
            }
        }
예제 #11
0
        public override void Init(FObject obj, FEditor owner)
        {
            base.Init(obj, owner);

            FAnimationTrackInspector.SetAnimator((FAnimationTrack)Track);
        }
예제 #12
0
        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();
            }
        }