public static bool AddAnimationToGO(GameObject go, Sprite[] frames, ShowFileDialogDelegate saveFileDialog) { SpriteRenderer spriteRenderer = go.GetComponent <SpriteRenderer>(); if (spriteRenderer == null) { Debug.LogWarning(SpriteUtilityStrings.unableToFindSpriteRendererWarning.text); spriteRenderer = (SpriteRenderer)ObjectFactory.AddComponent(go, typeof(SpriteRenderer)); if (spriteRenderer == null) { Debug.LogWarning(SpriteUtilityStrings.unableToAddSpriteRendererWarning.text); return(false); } } spriteRenderer.sprite = frames[0]; return(CreateAnimation(go, frames, saveFileDialog)); }
static bool CreateAnimation(GameObject gameObject, Object[] frames, ShowFileDialogDelegate saveFileDialog) { saveFileDialog = saveFileDialog ?? EditorUtility.SaveFilePanelInProject; // Use same name compare as when we sort in the backend: See AssetDatabase.cpp: SortChildren System.Array.Sort(frames, (a, b) => EditorUtility.NaturalCompare(a.name, b.name)); Animator animator = AnimationWindowUtility.EnsureActiveAnimationPlayer(gameObject) ? AnimationWindowUtility.GetClosestAnimatorInParents(gameObject.transform) : null; bool createSuccess = animator != null; if (animator != null) { // Go forward with presenting user a save clip dialog string message = string.Format(SpriteUtilityStrings.saveAnimDialogMessage.text, gameObject.name); string newClipDirectory = ProjectWindowUtil.GetActiveFolderPath(); string newClipPath = saveFileDialog(SpriteUtilityStrings.saveAnimDialogTitle.text, SpriteUtilityStrings.saveAnimDialogName.text, "anim", message, newClipDirectory); if (string.IsNullOrEmpty(newClipPath)) { Undo.ClearUndo(animator); Object.DestroyImmediate(animator); return(false); } else { AnimationClip newClip = AnimationWindowUtility.CreateNewClipAtPath(newClipPath); if (newClip != null) { AddSpriteAnimationToClip(newClip, frames); createSuccess = AnimationWindowUtility.AddClipToAnimatorComponent(animator, newClip); } } } if (createSuccess == false) { Debug.LogError(SpriteUtilityStrings.failedToCreateAnimationError.text); } return(createSuccess); }
public static void HandleSpriteSceneDrag(SceneView sceneView, IEvent evt, Object[] objectReferences, string[] paths, ShowFileDialogDelegate saveFileDialog) { if (evt.type != EventType.DragUpdated && evt.type != EventType.DragPerform && evt.type != EventType.DragExited) { return; } // Return if any of the dragged objects are null, e.g. a MonoBehaviour without a managed instance if (objectReferences.Any(obj => obj == null)) { return; } // Regardless of EditorBehaviorMode or SceneView mode we don't handle if texture is dragged over a GO with renderer if (objectReferences.Length == 1 && objectReferences[0] as UnityTexture2D != null) { GameObject go = HandleUtility.PickGameObject(evt.mousePosition, true); if (go != null) { var renderer = go.GetComponent <Renderer>(); if (renderer != null && !(renderer is SpriteRenderer)) { // There is an object where the cursor is // and we are dragging a texture. Most likely user wants to // assign texture to the GO // Case 730444: Proceed only if the go has a renderer CleanUp(true); return; } } } switch (evt.type) { case (EventType.DragUpdated): DragType newDragType = evt.alt ? DragType.CreateMultiple : DragType.SpriteAnimation; if (s_DragType != newDragType || s_SceneDragObjects == null) // Either this is first time we are here OR evt.alt changed during drag { if (!ExistingAssets(objectReferences) && PathsAreValidTextures(paths)) // External drag with images that are not in the project { DragAndDrop.visualMode = DragAndDropVisualMode.Copy; s_SceneDragObjects = new List <Object>(); s_DragType = newDragType; } else // Internal drag with assets from project { List <Sprite> assets = GetSpriteFromPathsOrObjects(objectReferences, paths, evt.type); if (assets.Count == 0) { return; } if (s_DragType != DragType.NotInitialized) // evt.alt changed during drag, so we need to cleanup and start over { CleanUp(true); } s_DragType = newDragType; CreateSceneDragObjects(assets, sceneView); IgnoreForRaycasts(s_SceneDragObjects); } } PositionSceneDragObjects(s_SceneDragObjects, sceneView, evt.mousePosition); DragAndDrop.visualMode = DragAndDropVisualMode.Copy; evt.Use(); break; case (EventType.DragPerform): List <Sprite> sprites = GetSpriteFromPathsOrObjects(objectReferences, paths, evt.type); if (sprites.Count > 0 && s_SceneDragObjects != null) { // Store current undoIndex to undo all operations done if any part of sprite creation fails int undoIndex = Undo.GetCurrentGroup(); // For external drags, we have delayed all creation to DragPerform because only now we have the imported sprite assets if (s_SceneDragObjects.Count == 0) { CreateSceneDragObjects(sprites, sceneView); PositionSceneDragObjects(s_SceneDragObjects, sceneView, evt.mousePosition); } foreach (GameObject dragGO in s_SceneDragObjects) { dragGO.hideFlags = HideFlags.None; // When in e.g Prefab Mode ensure to reparent dragged objects under the prefab root Transform defaultObjectTransform = SceneView.GetDefaultParentObjectIfSet(); if (defaultObjectTransform != null) { dragGO.transform.SetParent(defaultObjectTransform, true); } else if (sceneView.customParentForDraggedObjects != null) { dragGO.transform.SetParent(sceneView.customParentForDraggedObjects, true); } Undo.RegisterCreatedObjectUndo(dragGO, "Create Sprite"); EditorUtility.SetDirty(dragGO); } bool createGameObject = true; if (s_DragType == DragType.SpriteAnimation && sprites.Count > 1) { createGameObject = AddAnimationToGO((GameObject)s_SceneDragObjects[0], sprites.ToArray(), saveFileDialog); } if (createGameObject) { Selection.objects = s_SceneDragObjects.ToArray(); } else { // Revert all Create Sprite actions if animation failed to be created or was cancelled Undo.RevertAllDownToGroup(undoIndex); } CleanUp(!createGameObject); evt.Use(); } break; case EventType.DragExited: if (s_SceneDragObjects != null) { CleanUp(true); evt.Use(); } break; } }