private void AdjustAttachment(SerializedSpriteAttachment attachment) { int flipX = spriteRenderer.flipX ? -1 : 1; int flipY = spriteRenderer.flipY ? -1 : 1; Transform trans = attachments[attachment.Name]; trans.localPosition = new Vector3( (spriteRenderer.sprite.bounds.size.x * attachment.NormalizedPosition.x) * flipX, (spriteRenderer.sprite.bounds.size.y * attachment.NormalizedPosition.y) * flipY, trans.position.z); trans.localRotation = attachment.Rotation; }
protected override void OnGUIRightView() { if (SpriteSheet != null) { if (SpriteSheet.Texture == null) { GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); GUILayout.BeginVertical(); GUILayout.FlexibleSpace(); GUILayout.Label("No texture"); GUILayout.FlexibleSpace(); GUILayout.EndVertical(); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); } if (sprites.Count > 0) { Texture t = sprites[selectedSprite].texture; Rect tr = sprites[selectedSprite].rect; Rect r = new Rect(tr.x / t.width, tr.y / t.height, tr.width / t.width, tr.height / t.height); float sW = sprites[selectedSprite].rect.width * UniScale; float sH = sprites[selectedSprite].rect.height * UniScale; GUI.DrawTextureWithTexCoords(new Rect(0, 0, sW, sH), t, r); if (dragging != null) { Undo.RecordObject(SpriteSheet, "Positioning Attachment"); dragging.EditorPosition = Event.current.mousePosition - new Vector2(circleTexture.width / 2, circleTexture.height / 2); Repaint(); } int index = 0; if (SpriteSheet.AttachmentSprites.Count > 0) { foreach (SerializedSpriteAttachment attachment in SpriteSheet[sprites[selectedSprite].name].Attachments) { if (Event.current.type == EventType.MouseDown) { Rect attRect = new Rect( attachment.EditorPosition.x, attachment.EditorPosition.y, circleTexture.width, circleTexture.height); Rect mouseRect = new Rect( Event.current.mousePosition.x, Event.current.mousePosition.y, 2, 2); if (mouseRect.Overlaps(attRect) && dragging == null) { selectedAttachmentIndex = index; dragging = attachment; } } else if (Event.current.type == EventType.MouseUp) { dragging = null; dirty = true; } if (circleTexture != null) { Rect circleRect = new Rect(attachment.EditorPosition.x, attachment.EditorPosition.y, circleTexture.width, circleTexture.height); GUIStyle grayStyle = GUIStyle.none; grayStyle.normal.textColor = Color.grey; if (attachment == SpriteSheet[sprites[selectedSprite].name].Attachments[selectedAttachmentIndex]) { grayStyle.normal.textColor = Color.green; } Rect textRect = new Rect( circleRect.x - (attachment.Name.Length / 2), circleRect.y - 21.0f, 400, 100); GUI.Label(textRect, attachment.Name, grayStyle); if (attachment == SpriteSheet[sprites[selectedSprite].name].Attachments[selectedAttachmentIndex]) { GUI.color = Color.green; } GUI.DrawTexture(circleRect, circleTexture); GUI.color = Color.white; } index++; } } } } else { GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); GUILayout.BeginVertical(); GUILayout.FlexibleSpace(); GUILayout.Label("Select Sprite Attachment Sheet Asset"); GUILayout.Label("Or create a new one by clicking: Assets -> Create -> Sprite Attachment Sheet"); GUILayout.FlexibleSpace(); GUILayout.EndVertical(); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); } }
protected override void OnGUILeftView() { EditorGUIUtility.labelWidth = 80; EditorGUILayout.LabelField(""); if (SpriteSheet == null) { gridSpriteNames.Clear(); selectedSprite = 0; } if (SpriteSheet != null) { GUILayout.Space(10); showSprites = EditorGUILayout.Foldout(showSprites, "Sprites"); if (showSprites) { selectedSprite = GUILayout.SelectionGrid(selectedSprite, gridSpriteNames.ToArray(), 1); } showAttachments = EditorGUILayout.Foldout(showAttachments, "Attachments"); if (showAttachments) { EditorGUILayout.BeginHorizontal(); GUI.backgroundColor = Color.green; if (popup == null) { popupActive = false; } if (GUILayout.Button("Create") && !popupActive) { popupActive = true; popup = GetWindow <EditorPopupEnterString>(); popup.m_DemandInput = true; popup.Focus(); popup.OnConfirm += (string name) => { foreach (SerializedSpriteAttachmentSprite sprite in SpriteSheet.AttachmentSprites) { if (sprite.Attachments.SingleOrDefault(x => x.Name == name) != null) { Debug.LogError(string.Format("[SAEditor] Sprite Attachment with name '{0}' already exists.", name)); break; } SerializedSpriteAttachment attachment = new SerializedSpriteAttachment(); attachment.Name = name; Undo.RecordObject(SpriteSheet, "Add Attachment"); sprite.Attachments.Add(attachment); dirty = true; } Repaint(); popupActive = false; }; } GUI.backgroundColor = Color.red; if (GUILayout.Button("Delete")) { foreach (SerializedSpriteAttachmentSprite sprite in SpriteSheet.AttachmentSprites) { SerializedSpriteAttachment toDelete = null; foreach (SerializedSpriteAttachment attachment in sprite.Attachments) { if (sprite.Attachments[selectedAttachmentIndex].Name == attachment.Name) { toDelete = attachment; break; } } if (toDelete != null) { Undo.RecordObject(SpriteSheet, "Delete Attachment"); sprite.Attachments.Remove(toDelete); dirty = true; } } selectedAttachmentIndex = 0; Repaint(); } GUI.backgroundColor = Color.white; EditorGUILayout.EndHorizontal(); if (SpriteSheet.AttachmentSprites.Count > 0) { string spriteName = sprites[selectedSprite].name; SerializedSpriteAttachmentSprite sprite = null; foreach (SerializedSpriteAttachmentSprite s in SpriteSheet.AttachmentSprites) { if (s.Name == spriteName) { sprite = s; break; } } if (sprite.Attachments.Count > 0) { List <string> attachmentNames = new List <string>(); sprite.Attachments.ForEach(x => attachmentNames.Add(x.Name)); selectedAttachmentIndex = GUILayout.SelectionGrid(selectedAttachmentIndex, attachmentNames.ToArray(), 1); } } } } else { GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); GUILayout.BeginVertical(); GUILayout.FlexibleSpace(); GUILayout.Label("Select Sprite Attachment Sheet Asset"); GUILayout.FlexibleSpace(); GUILayout.EndVertical(); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); } }