public override void OnInspectorGUI() { tk2dSlicedSprite sprite = (tk2dSlicedSprite)target; base.OnInspectorGUI(); if (sprite.Collection == null) { return; } var spriteData = sprite.GetCurrentSpriteDef(); if (spriteData == null) { return; } EditorGUILayout.BeginVertical(); // need raw extents (excluding scale) Vector3 extents = spriteData.boundsData[1]; // this is the size of one texel Vector3 spritePixelMultiplier = new Vector3(0, 0); bool newCreateBoxCollider = EditorGUILayout.Toggle("Create Box Collider", sprite.CreateBoxCollider); if (newCreateBoxCollider != sprite.CreateBoxCollider) { Undo.RegisterUndo(targetSlicedSprites, "Create Box Collider"); sprite.CreateBoxCollider = newCreateBoxCollider; } // if either of these are zero, the division to rescale to pixels will result in a // div0, so display the data in fractions to avoid this situation bool editBorderInFractions = true; if (spriteData.texelSize.x != 0.0f && spriteData.texelSize.y != 0.0f && extents.x != 0.0f && extents.y != 0.0f) { spritePixelMultiplier = new Vector3(extents.x / spriteData.texelSize.x, extents.y / spriteData.texelSize.y, 1); editBorderInFractions = false; } if (!editBorderInFractions) { Vector2 newDimensions = EditorGUILayout.Vector2Field("Dimensions (Pixel Units)", sprite.dimensions); if (newDimensions != sprite.dimensions) { Undo.RegisterUndo(targetSlicedSprites, "Sliced Sprite Dimensions"); foreach (tk2dSlicedSprite spr in targetSlicedSprites) { spr.dimensions = newDimensions; } } tk2dSlicedSprite.Anchor newAnchor = (tk2dSlicedSprite.Anchor)EditorGUILayout.EnumPopup("Anchor", sprite.anchor); if (newAnchor != sprite.anchor) { Undo.RegisterUndo(targetSlicedSprites, "Sliced Sprite Anchor"); foreach (tk2dSlicedSprite spr in targetSlicedSprites) { spr.anchor = newAnchor; } } EditorGUILayout.PrefixLabel("Border"); EditorGUI.indentLevel++; float newBorderLeft = EditorGUILayout.FloatField("Left", sprite.borderLeft * spritePixelMultiplier.x) / spritePixelMultiplier.x; if (newBorderLeft != sprite.borderLeft) { Undo.RegisterUndo(targetSlicedSprites, "Sliced Sprite BorderLeft"); foreach (tk2dSlicedSprite spr in targetSlicedSprites) { spr.borderLeft = newBorderLeft; } } float newBorderRight = EditorGUILayout.FloatField("Right", sprite.borderRight * spritePixelMultiplier.x) / spritePixelMultiplier.x; if (newBorderRight != sprite.borderRight) { Undo.RegisterUndo(targetSlicedSprites, "Sliced Sprite BorderRight"); foreach (tk2dSlicedSprite spr in targetSlicedSprites) { spr.borderRight = newBorderRight; } } float newBorderTop = EditorGUILayout.FloatField("Top", sprite.borderTop * spritePixelMultiplier.y) / spritePixelMultiplier.y; if (newBorderTop != sprite.borderTop) { Undo.RegisterUndo(targetSlicedSprites, "Sliced Sprite BorderTop"); foreach (tk2dSlicedSprite spr in targetSlicedSprites) { spr.borderTop = newBorderTop; } } float newBorderBottom = EditorGUILayout.FloatField("Bottom", sprite.borderBottom * spritePixelMultiplier.y) / spritePixelMultiplier.y; if (newBorderBottom != sprite.borderBottom) { Undo.RegisterUndo(targetSlicedSprites, "Sliced Sprite BorderBottom"); foreach (tk2dSlicedSprite spr in targetSlicedSprites) { spr.borderBottom = newBorderBottom; } } bool newBorderOnly = EditorGUILayout.Toggle("Draw Border Only", sprite.BorderOnly); if (newBorderOnly != sprite.BorderOnly) { Undo.RegisterUndo(targetSlicedSprites, "Sliced Sprite Border Only"); foreach (tk2dSlicedSprite spr in targetSlicedSprites) { spr.BorderOnly = newBorderOnly; } } EditorGUI.indentLevel--; } else { GUILayout.Label("Border (Displayed as Fraction).\nSprite Collection needs to be rebuilt.", "textarea"); EditorGUI.indentLevel++; float newBorderLeft = EditorGUILayout.FloatField("Left", sprite.borderLeft); if (newBorderLeft != sprite.borderLeft) { Undo.RegisterUndo(targetSlicedSprites, "Sliced Sprite BorderLeft"); foreach (tk2dSlicedSprite spr in targetSlicedSprites) { spr.borderLeft = newBorderLeft; } } float newBorderRight = EditorGUILayout.FloatField("Right", sprite.borderRight); if (newBorderRight != sprite.borderRight) { Undo.RegisterUndo(targetSlicedSprites, "Sliced Sprite BorderRight"); foreach (tk2dSlicedSprite spr in targetSlicedSprites) { spr.borderRight = newBorderRight; } } float newBorderTop = EditorGUILayout.FloatField("Top", sprite.borderTop); if (newBorderTop != sprite.borderTop) { Undo.RegisterUndo(targetSlicedSprites, "Sliced Sprite BorderTop"); foreach (tk2dSlicedSprite spr in targetSlicedSprites) { spr.borderTop = newBorderTop; } } float newBorderBottom = EditorGUILayout.FloatField("Bottom", sprite.borderBottom); if (newBorderBottom != sprite.borderBottom) { Undo.RegisterUndo(targetSlicedSprites, "Sliced Sprite BorderBottom"); foreach (tk2dSlicedSprite spr in targetSlicedSprites) { spr.borderBottom = newBorderBottom; } } EditorGUI.indentLevel--; } // One of the border valus has changed, so simply rebuild mesh data here if (GUI.changed) { foreach (tk2dSlicedSprite spr in targetSlicedSprites) { spr.Build(); EditorUtility.SetDirty(spr); } } EditorGUILayout.EndVertical(); }
public override void OnInspectorGUI() { tk2dSlicedSprite sprite = (tk2dSlicedSprite)target; base.OnInspectorGUI(); EditorGUILayout.BeginVertical(); var spriteData = sprite.GetCurrentSpriteDef(); // need raw extents (excluding scale) Vector3 extents = spriteData.boundsData[1]; // this is the size of one texel Vector3 spritePixelMultiplier = new Vector3(0, 0); // if either of these are zero, the division to rescale to pixels will result in a // div0, so display the data in fractions to avoid this situation bool editBorderInFractions = true; if (spriteData.texelSize.x != 0.0f && spriteData.texelSize.y != 0.0f && extents.x != 0.0f && extents.y != 0.0f) { spritePixelMultiplier = new Vector3(extents.x / spriteData.texelSize.x, extents.y / spriteData.texelSize.y, 1); editBorderInFractions = false; } if (!editBorderInFractions) { if (sprite.transform.localScale == Vector3.one) { Vector2 scalePixelUnits = new Vector2(spritePixelMultiplier.x * sprite.scale.x, spritePixelMultiplier.y * sprite.scale.y); Vector2 scalePixelUnitsChanged = EditorGUILayout.Vector2Field("Scale (Pixel Units)", scalePixelUnits); if (scalePixelUnits != scalePixelUnitsChanged) { sprite.scale = new Vector3(scalePixelUnitsChanged.x / spritePixelMultiplier.x, scalePixelUnitsChanged.y / spritePixelMultiplier.y, sprite.scale.z); } } EditorGUILayout.PrefixLabel("Border"); sprite.borderLeft = EditorGUILayout.FloatField("Left", sprite.borderLeft * spritePixelMultiplier.x) / spritePixelMultiplier.x; sprite.borderRight = EditorGUILayout.FloatField("Right", sprite.borderRight * spritePixelMultiplier.x) / spritePixelMultiplier.x; sprite.borderTop = EditorGUILayout.FloatField("Top", sprite.borderTop * spritePixelMultiplier.y) / spritePixelMultiplier.y; sprite.borderBottom = EditorGUILayout.FloatField("Bottom", sprite.borderBottom * spritePixelMultiplier.y) / spritePixelMultiplier.y; } else { GUILayout.Label("Border (Displayed as Fraction).\nSprite Collection needs to be rebuilt.", "textarea"); sprite.borderLeft = EditorGUILayout.FloatField("Left", sprite.borderLeft); sprite.borderRight = EditorGUILayout.FloatField("Right", sprite.borderRight); sprite.borderTop = EditorGUILayout.FloatField("Top", sprite.borderTop); sprite.borderBottom = EditorGUILayout.FloatField("Bottom", sprite.borderBottom); } // One of the border valus has changed, so simply rebuild mesh data here if (GUI.changed) { sprite.Build(); } if (GUI.changed || GUILayout.Button("Commit")) { Vector3 scl = sprite.transform.localScale; Vector3 newScale = new Vector3(sprite.scale.x * scl.x, sprite.scale.y * scl.y, sprite.scale.z); sprite.scale = newScale; sprite.transform.localScale = Vector3.one; } EditorGUILayout.EndVertical(); }