private static void AddClipsAsBlendTree(AnimationPlayer animationPlayer, PersistedInt selectedLayer, PersistedInt selectedState, AnimationPlayerEditor editor, List <AnimationClip> animationClips) { EditorUtilities.RecordUndo(animationPlayer, "Added clip to Animation Player"); var layer = animationPlayer.layers[selectedLayer]; int numClipsBefore = layer.states.Count; var newStateName = GetUniqueStateName(BlendTree1D.DefaultName, layer.states); var newState = BlendTree1D.Create(newStateName); foreach (var clip in animationClips) { var newEntry = new BlendTreeEntry1D { clip = clip }; newState.blendTree.Add(newEntry); } layer.states.Add(newState); selectedState.SetTo(numClipsBefore); editor.MarkDirty(); }
public static void Draw(AnimationPlayer animationPlayer, PersistedInt selectedLayer, PersistedInt selectedState, PersistedEditMode selectedEditMode, AnimationPlayerEditor editor, List <AnimationClip> multiSelectClips) { if (popupStyle == null) { buttonWidth = GUILayout.Width(200f); selectedStateLabel = new GUIContent("Selected state: "); popupStyle = new GUIStyle(EditorStyles.popup) { fontSize = GUI.skin.button.fontSize, font = GUI.skin.button.font, fontStyle = GUI.skin.button.fontStyle, fixedHeight = 20f, alignment = TextAnchor.MiddleCenter }; dragAndDropBoxStyle = new GUIStyle(EditorStyles.helpBox) { alignment = TextAnchor.MiddleCenter, fontStyle = FontStyle.Bold, fontSize = 12, }; } var layer = animationPlayer.layers[selectedLayer]; var wrap = Screen.width < 420f; if (wrap) { EditorGUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); EditorGUILayout.BeginVertical(); { DrawSelection(layer, selectedState); GUILayout.Space(10f); DrawAddition(animationPlayer, selectedLayer, selectedState, editor, layer, multiSelectClips); } EditorGUILayout.EndVertical(); GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); } else { EditorGUILayout.BeginHorizontal(); { GUILayout.FlexibleSpace(); DrawSelection(layer, selectedState); GUILayout.Space(20f); DrawAddition(animationPlayer, selectedLayer, selectedState, editor, layer, multiSelectClips); GUILayout.FlexibleSpace(); } EditorGUILayout.EndHorizontal(); } }
private static void AddClipsAsSeperateStates(AnimationPlayer animationPlayer, PersistedInt selectedLayer, PersistedInt selectedState, AnimationPlayerEditor editor, List <AnimationClip> animationClips) { EditorUtilities.RecordUndo(animationPlayer, "Added clip to Animation Player"); var layer = animationPlayer.layers[selectedLayer]; int numClipsBefore = layer.states.Count; foreach (var clip in animationClips) { var newStateName = GetUniqueStateName(clip.name, layer.states); var newState = SingleClip.Create(newStateName, clip); layer.states.Add(newState); } selectedState.SetTo(numClipsBefore); editor.MarkDirty(); }
public static void DrawStateData(AnimationPlayer animationPlayer, PersistedInt selectedLayer, PersistedInt selectedState, AnimationPlayerEditor currentEditor) { var updateStateNames = false; var layer = animationPlayer.layers[selectedLayer]; if (layer.states.Count == 0) { EditorGUILayout.LabelField("No states"); return; } if (!layer.states.IsInBounds(selectedState)) { Debug.LogError("Out of bounds state: " + selectedState + " out of " + layer.states.Count + " states! Resetting to 0"); selectedState.SetTo(0); return; } EditorGUILayout.LabelField("State"); EditorGUI.indentLevel++; DrawStateData(layer.states[selectedState], ref updateStateNames); GUILayout.Space(20f); var deleteThisState = DrawDeleteStateButton(selectedLayer, selectedState); EditorGUI.indentLevel--; if (deleteThisState) { DeleteState(animationPlayer, layer, selectedState); updateStateNames = true; } if (updateStateNames) { currentEditor.MarkDirty(); } currentEditor.previewer.DrawStatePreview(selectedLayer, selectedState); }
private static void DrawAddition(AnimationPlayer animationPlayer, PersistedInt selectedLayer, PersistedInt selectedState, AnimationPlayerEditor editor, AnimationLayer layer, List <AnimationClip> multiSelectClips) { if (multiSelectClips != null && multiSelectClips.Count > 0) { EditorGUILayout.BeginVertical(buttonWidth); { DrawMultiSelectChoice(animationPlayer, selectedLayer, selectedState, multiSelectClips, editor); } EditorGUILayout.EndVertical(); return; } EditorGUILayout.BeginVertical(buttonWidth); { EditorGUILayout.LabelField("Add new state:"); if (DragAndDrop.objectReferences.Length > 0) { DoDragAndDrop(animationPlayer, selectedLayer, selectedState, editor); } else { DrawAddStateButtons(animationPlayer, selectedState, editor, layer); } } EditorGUILayout.EndVertical(); }
private static void DrawAddStateButtons(AnimationPlayer animationPlayer, PersistedInt selectedState, AnimationPlayerEditor editor, AnimationLayer layer) { if (GUILayout.Button("Single Clip", buttonWidth)) { EditorUtilities.RecordUndo(animationPlayer, "Add state to animation player"); layer.states.Add(SingleClip.Create(GetUniqueStateName(SingleClip.DefaultName, layer.states))); selectedState.SetTo(layer.states.Count - 1); editor.MarkDirty(); } if (GUILayout.Button("Play Random Clip", buttonWidth)) { EditorUtilities.RecordUndo(animationPlayer, "Add random state to animation player"); layer.states.Add(PlayRandomClip.Create(GetUniqueStateName(PlayRandomClip.DefaultName, layer.states))); selectedState.SetTo(layer.states.Count - 1); editor.MarkDirty(); } if (GUILayout.Button("Sequence", buttonWidth)) { EditorUtilities.RecordUndo(animationPlayer, "Add sequence to animation player"); layer.states.Add(Sequence.Create(GetUniqueStateName(Sequence.DefaultName, layer.states))); selectedState.SetTo(layer.states.Count - 1); editor.MarkDirty(); } if (GUILayout.Button("1D Blend Tree", buttonWidth)) { EditorUtilities.RecordUndo(animationPlayer, "Add blend tree to animation player"); layer.states.Add(BlendTree1D.Create(GetUniqueStateName(BlendTree1D.DefaultName, layer.states))); selectedState.SetTo(layer.states.Count - 1); editor.MarkDirty(); } if (GUILayout.Button("2D Blend Tree", buttonWidth)) { EditorUtilities.RecordUndo(animationPlayer, "Add 2D blend tree to animation player"); layer.states.Add(BlendTree2D.Create(GetUniqueStateName(BlendTree2D.DefaultName, layer.states))); selectedState.SetTo(layer.states.Count - 1); editor.MarkDirty(); } }
private static void DrawMultiSelectChoice(AnimationPlayer animationPlayer, PersistedInt selectedLayer, PersistedInt selectedState, List <AnimationClip> multiSelectClips, AnimationPlayerEditor editor) { EditorGUILayout.LabelField($"Adding {multiSelectClips.Count} clips! How do you want to add them?"); // @TODO: Sequences, Random Selection if (GUILayout.Button("Separate Clips")) { AddClipsAsSeperateStates(animationPlayer, selectedLayer, selectedState, editor, multiSelectClips); editor.StopDragAndDropMultiChoice(); } if (GUILayout.Button("Blend Tree")) { AddClipsAsBlendTree(animationPlayer, selectedLayer, selectedState, editor, multiSelectClips); editor.StopDragAndDropMultiChoice(); } if (GUILayout.Button("Cancel")) { editor.StopDragAndDropMultiChoice(); } }
private static void DoDragAndDrop(AnimationPlayer animationPlayer, PersistedInt selectedLayer, PersistedInt selectedState, AnimationPlayerEditor editor) { const int numButtons = 5; const float spacePerButton = 20f; const float border = 3f; Debug.Log(DragAndDrop.objectReferences.PrettyPrint()); var dragAndDropRect = EditorUtilities.ReserveRect(GUILayout.Height((numButtons * spacePerButton) + border)); Event evt = Event.current; GUI.Box(dragAndDropRect, "Drag clips here to add\nthem to the player!", dragAndDropBoxStyle); switch (evt.type) { case EventType.DragUpdated: case EventType.DragPerform: if (!dragAndDropRect.Contains(evt.mousePosition)) { return; } DragAndDrop.visualMode = DragAndDropVisualMode.Copy; if (evt.type == EventType.DragPerform) { DragAndDrop.AcceptDrag(); var animationClips = DragAndDrop.objectReferences.OfType <AnimationClip>().ToList(); foreach (var obj in DragAndDrop.objectReferences.OfType <GameObject>()) { var assetPath = AssetDatabase.GetAssetPath(obj); if (!(AssetImporter.GetAtPath(assetPath) is ModelImporter)) { return; } animationClips.AddRange(AssetDatabase.LoadAllAssetsAtPath(assetPath).OfType <AnimationClip>(). Where(clip => (clip.hideFlags & HideFlags.HideInHierarchy) == 0)); } if (animationClips.Count == 1) { AddClipsAsSeperateStates(animationPlayer, selectedLayer, selectedState, editor, animationClips); } else if (animationClips.Count > 1) { editor.StartDragAndDropMultiChoice(animationClips); } } break; } }
private static void DoDragAndDrop(AnimationPlayer animationPlayer, PersistedInt selectedLayer, PersistedInt selectedState, AnimationPlayerEditor editor) { var dragAndDropRect = EditorUtilities.ReserveRect(GUILayout.Height(62f)); Event evt = Event.current; GUI.Box(dragAndDropRect, "Drag clips here to add\nthem to the player!", dragAndDropBoxStyle); switch (evt.type) { case EventType.DragUpdated: case EventType.DragPerform: if (!dragAndDropRect.Contains(evt.mousePosition)) { return; } DragAndDrop.visualMode = DragAndDropVisualMode.Copy; if (evt.type == EventType.DragPerform) { DragAndDrop.AcceptDrag(); var animationClips = DragAndDrop.objectReferences.FilterByType <AnimationClip>().ToList(); foreach (var obj in DragAndDrop.objectReferences.FilterByType <GameObject>()) { var assetPath = AssetDatabase.GetAssetPath(obj); if (!(AssetImporter.GetAtPath(assetPath) is ModelImporter)) { return; } animationClips.AddRange(AssetDatabase.LoadAllAssetsAtPath(assetPath).FilterByType <AnimationClip>(). Where(clip => (clip.hideFlags & HideFlags.HideInHierarchy) == 0)); } if (animationClips.Count > 0) { EditorUtilities.RecordUndo(animationPlayer, "Added clip to Animation Player"); var layer = animationPlayer.layers[selectedLayer]; int numClipsBefore = layer.states.Count; foreach (var clip in animationClips) { var newStateName = GetUniqueStateName(clip.name, layer.states); var newState = SingleClipState.Create(newStateName, clip); layer.states.Add(newState); } selectedState.SetTo(numClipsBefore); editor.MarkDirty(); } } break; } }
private static void DrawAddition(AnimationPlayer animationPlayer, PersistedInt selectedLayer, PersistedInt selectedState, AnimationPlayerEditor editor, AnimationLayer layer) { EditorGUILayout.BeginVertical(buttonWidth); { EditorGUILayout.LabelField("Add new state:"); if (DragAndDrop.objectReferences.Length > 0) { DoDragAndDrop(animationPlayer, selectedLayer, selectedState, editor); } else { DrawAddStateButtons(animationPlayer, selectedState, editor, layer); } } EditorGUILayout.EndVertical(); }
public static void DrawStateData(AnimationPlayer animationPlayer, int selectedLayer, PersistedInt selectedState, AnimationPlayerEditor currentEditor) { ReloadCheck(); var markDirty = false; var layer = animationPlayer.layers[selectedLayer]; if (layer.states.Count == 0) { EditorGUILayout.LabelField("No states"); return; } if (!layer.states.IsInBounds(selectedState)) { Debug.LogError($"Out of bounds state: {selectedState} out of {layer.states.Count} states! Resetting to 0"); selectedState.SetTo(0); return; } var stateName = layer.states[selectedState].Name; EditorGUILayout.LabelField($"Settings for \"{stateName}\":"); EditorGUI.indentLevel++; DrawStateData(layer.states[selectedState], ref markDirty); GUILayout.Space(20f); EditorGUILayout.BeginHorizontal(); if (selectedState == 0) { EditorGUILayout.LabelField("This is the default state of this layer", GUILayout.Width(250f)); } else if (GUILayout.Button("Set as the default state of this layer", GUILayout.Width(250f))) { layer.states.Swap(selectedState, 0); selectedState.SetTo(0); markDirty = true; } GUILayout.FlexibleSpace(); var deleteThisState = EditorUtilities.AreYouSureButton($"Delete {stateName}", "Are you sure", $"DeleteState_{selectedState}_{selectedLayer}", 1f); EditorGUILayout.EndHorizontal(); EditorGUI.indentLevel--; GUILayout.Space(20f); currentEditor.previewer.DrawStatePreview(selectedLayer, selectedState); if (deleteThisState) { DeleteState(animationPlayer, layer, selectedState); markDirty = true; } if (markDirty) { currentEditor.MarkDirty(); } }
public static void DrawStateData(AnimationPlayer animationPlayer, PersistedInt selectedLayer, PersistedInt selectedState, AnimationPlayerEditor currentEditor) { if (reloadChecker == null) { reloadChecker = new object(); upDownButtonOptions = new[] { GUILayout.Width(25f), GUILayout.Height(15f) }; upDownButtonStyle = new GUIStyle(GUI.skin.button) { alignment = TextAnchor.UpperCenter, clipping = TextClipping.Overflow }; } var markDirty = false; var layer = animationPlayer.layers[selectedLayer]; if (layer.states.Count == 0) { EditorGUILayout.LabelField("No states"); return; } if (!layer.states.IsInBounds(selectedState)) { Debug.LogError($"Out of bounds state: {selectedState} out of {layer.states.Count} states! Resetting to 0"); selectedState.SetTo(0); return; } var stateName = layer.states[selectedState].Name; EditorGUILayout.LabelField($"Settings for \"{stateName}\":"); EditorGUI.indentLevel++; DrawStateData(layer.states[selectedState], ref markDirty); GUILayout.Space(20f); EditorGUILayout.BeginHorizontal(); if (selectedState == 0) { EditorGUILayout.LabelField("This is the default state of this layer", GUILayout.Width(250f)); } else if (GUILayout.Button("Set as the default state of this layer", GUILayout.Width(250f))) { layer.states.Swap(selectedState, 0); selectedState.SetTo(0); markDirty = true; } GUILayout.FlexibleSpace(); var deleteThisState = EditorUtilities.AreYouSureButton($"Delete {stateName}", "Are you sure", $"DeleteState_{selectedState}_{selectedLayer}", 1f); EditorGUILayout.EndHorizontal(); EditorGUI.indentLevel--; if (deleteThisState) { DeleteState(animationPlayer, layer, selectedState); markDirty = true; } if (markDirty) { currentEditor.MarkDirty(); } GUILayout.Space(20f); currentEditor.previewer.DrawStatePreview(selectedLayer, selectedState); }