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; } }
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(); } }
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); } }