private void AddNewState(float time, string stateName)
        {
            var clipData = CreateInstance <AnimationClipData>();

            clipData.TargetObject     = AnimationTimeline.AffectedObject.gameObject;
            clipData.StartTime        = time;
            clipData.StateName        = stateName;
            clipData.StateDuration    = MecanimAnimationUtility.GetStateDuration(stateName, clipData.TargetObject);
            clipData.PlaybackDuration = MecanimAnimationUtility.GetStateDuration(stateName, clipData.TargetObject);
            clipData.Track            = AnimationTrack;
            USUndoManager.RegisterCreatedObjectUndo(clipData, "Add New Clip");

            var cachedData = CreateInstance <AnimationClipRenderData>();

            cachedData.animationClipData = clipData;
            USUndoManager.RegisterCreatedObjectUndo(clipData, "Add New Clip");

            USUndoManager.RegisterCompleteObjectUndo(AnimationTrack, "Add New Clip");
            AnimationTrack.AddClip(clipData);

            USUndoManager.RegisterCompleteObjectUndo(this, "Add New Clip");
            cachedClipRenderData.Add(cachedData);

            OnSelectedObjects(new List <UnityEngine.Object>()
            {
                clipData
            });
        }
        private void HandleEvent()
        {
            var isContext = Event.current.type == EventType.MouseDown && Event.current.button == 1;

            if (!isContext)
            {
                return;
            }

            var contextMenu = new GenericMenu();

            if (DisplayArea.Contains(Event.current.mousePosition))
            {
                var baseAdd   = "Add State/{0}";
                var allStates = MecanimAnimationUtility.GetAllStateNames(AnimationTimeline.AffectedObject.gameObject, AnimationTrack.Layer);
                var newTime   = (((Event.current.mousePosition.x + XScroll - DisplayArea.x) / DisplayArea.width) * AnimationTimeline.Sequence.Duration) / XScale;

                foreach (var state in allStates)
                {
                    contextMenu.AddItem(
                        new GUIContent(string.Format(baseAdd, state)),
                        false,
                        (obj) => AddNewState(((float)((object[])obj)[0]), ((string)((object[])obj)[1])),
                        new object[] { newTime, state }                         // This object is passed through to the annonymous function that is passed through as the previous argument.
                        );
                }
            }

            if (DisplayArea.Contains(Event.current.mousePosition))
            {
                Event.current.Use();
                contextMenu.ShowAsContext();
            }
        }
        public void AddAnimationTrack(string layer)
        {
            var track = CreateInstance <AnimationTrack>();

            USUndoManager.RegisterCreatedObjectUndo(track, "Add New Track");

            track.Layer = MecanimAnimationUtility.LayerNameToIndex(AnimationTimeline.AffectedObject.gameObject, layer);

            USUndoManager.RegisterCompleteObjectUndo(AnimationTimeline, "Add New Track");
            AnimationTimeline.AddTrack(track);

            var hierarchyItem = CreateInstance(typeof(USAnimationTimelineTrackHierarchyItem)) as USAnimationTimelineTrackHierarchyItem;

            USUndoManager.RegisterCreatedObjectUndo(hierarchyItem, "Add New Track");
            hierarchyItem.AnimationTrack             = track;
            hierarchyItem.AnimationTimelineHierarchy = this;
            hierarchyItem.AnimationTimeline          = AnimationTimeline;
            hierarchyItem.Initialize(AnimationTimeline);

            USUndoManager.RegisterCompleteObjectUndo(USHierarchy, "Add New Track");
            USHierarchy.RootItems.Add(hierarchyItem as IUSHierarchyItem);

            if (AnimationTimeline.AnimationTracks.Count == 1)
            {
                IsExpanded = true;
            }
        }
Beispiel #4
0
        protected override void FloatingOnGUI(int depth)
        {
            GUILayout.Box("", FloatingBackground, GUILayout.Width(FloatingWidth), GUILayout.Height(17.0f));

            if (Event.current.type == EventType.Repaint)
            {
                var lastRect = GUILayoutUtility.GetLastRect();
                lastRect.x            += GetXOffsetForDepth(depth);
                lastRect.width        -= GetXOffsetForDepth(depth);
                FloatingBackgroundRect = lastRect;
            }

            var layerName = string.Format("Track (Layer : {0})", MecanimAnimationUtility.LayerIndexToName(AnimationTimeline.AffectedObject.gameObject, AnimationTrack.Layer));

            GUI.Label(FloatingBackgroundRect, layerName);

            var addRect = FloatingBackgroundRect;

            addRect.x     = addRect.x + addRect.width - 22.0f - 1.0f;
            addRect.width = 22.0f;
            if (GUI.Button(addRect, "-"))
            {
                RemoveAnimationTrack();
            }
        }
Beispiel #5
0
        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            var serializedProperty = serializedObject.GetIterator();

            serializedProperty.Next(true);

            while (serializedProperty.NextVisible(true))
            {
                EditorGUILayout.PropertyField(serializedProperty);
            }

            var stateNameProperty = serializedObject.FindProperty("stateName");
            var animationTrack    = serializedObject.FindProperty("track").objectReferenceValue as AnimationTrack;
            var targetObject      = serializedObject.FindProperty("targetObject").objectReferenceValue;
            var targetGameObject  = targetObject as GameObject;

            if (!animationTrack)
            {
                return;
            }

            if (!targetGameObject)
            {
                return;
            }

            var availableStateNames = MecanimAnimationUtility.GetAllStateNames(targetGameObject, animationTrack.Layer);

            var existingState     = -1;
            var existingStateName = stateNameProperty.stringValue;

            for (var clipIndex = 0; clipIndex < availableStateNames.Count; clipIndex++)
            {
                if (availableStateNames[clipIndex] == existingStateName)
                {
                    existingState = clipIndex;
                }
            }

            var newState = EditorGUILayout.Popup("Clip", existingState, availableStateNames.ToArray());

            if (newState != existingState)
            {
                stateNameProperty.stringValue = availableStateNames[newState];
            }

            if (serializedObject.ApplyModifiedProperties())
            {
                var windows = Resources.FindObjectsOfTypeAll <USWindow>();
                foreach (var window in windows)
                {
                    window.ExternalModification();
                }
            }
        }
        public override void AddContextItems(GenericMenu contextMenu)
        {
            var animator = AnimationTimeline.AffectedObject.GetComponent <Animator>();

            if (!animator || !animator.runtimeAnimatorController)
            {
                return;
            }

            var animationLayers = MecanimAnimationUtility.GetAllLayerNames(AnimationTimeline.AffectedObject.gameObject);

            foreach (var animationLayer in animationLayers)
            {
                contextMenu.AddItem(new GUIContent(string.Format("Add New Track/{0}", animationLayer)),
                                    false,
                                    (layer) => AddAnimationTrack((string)layer),
                                    animationLayer);
            }
        }