/// <summary> /// Sprite creation function. /// </summary> void CreateSprite <T> (GameObject go, ref string field) where T : UISprite { if (UISettings.atlas != null) { GUILayout.BeginHorizontal(); string sp = UISpriteInspector.SpriteField(UISettings.atlas, "Sprite", field, GUILayout.Width(200f)); if (!string.IsNullOrEmpty(sp)) { GUILayout.Space(20f); GUILayout.Label("Sprite that will be created"); } GUILayout.EndHorizontal(); if (sp != field) { field = sp; Save(); } } if (ShouldCreate(go, UISettings.atlas != null)) { T sprite = NGUITools.AddWidget <T>(go); sprite.name = sprite.name + " (" + field + ")"; sprite.atlas = UISettings.atlas; sprite.spriteName = field; sprite.MakePixelPerfect(); Selection.activeGameObject = sprite.gameObject; } }
/// <summary> /// Sprite creation function. /// </summary> void CreateSprite <T>(GameObject go, string field, SpriteSelector.Callback callback) where T : UISprite { if (UISettings.atlas != null) { UISpriteInspector.SpriteField("Sprite", "Sprite that will be created", UISettings.atlas, field, callback); if (!string.IsNullOrEmpty(field)) { GUILayout.BeginHorizontal(); UISettings.pivot = (UIWidget.Pivot)EditorGUILayout.EnumPopup("Pivot", UISettings.pivot, GUILayout.Width(200f)); GUILayout.Space(20f); GUILayout.Label("Initial pivot point used by the sprite"); GUILayout.EndHorizontal(); } } if (ShouldCreate(go, UISettings.atlas != null)) { T sprite = NGUITools.AddWidget <T>(go); sprite.name = sprite.name + " (" + field + ")"; sprite.atlas = UISettings.atlas; sprite.spriteName = field; sprite.pivot = UISettings.pivot; sprite.MakePixelPerfect(); Selection.activeGameObject = sprite.gameObject; } }
/// <summary> /// Input field creation function. /// </summary> void CreateInput(GameObject go) { if (UISettings.atlas != null) { GUILayout.BeginHorizontal(); string bg = UISpriteInspector.SpriteField(UISettings.atlas, "Background", mInputBG, GUILayout.Width(200f)); GUILayout.Space(20f); GUILayout.Label("Sliced Sprite for the background"); GUILayout.EndHorizontal(); if (mInputBG != bg) { mInputBG = bg; Save(); } } if (ShouldCreate(go, UISettings.atlas != null && UISettings.font != null)) { int depth = NGUITools.CalculateNextDepth(go); go = NGUITools.AddChild(go); go.name = "Input"; float padding = 3f; UISlicedSprite bg = NGUITools.AddWidget <UISlicedSprite>(go); bg.name = "Background"; bg.depth = depth; bg.atlas = UISettings.atlas; bg.spriteName = mInputBG; bg.pivot = UIWidget.Pivot.Left; bg.transform.localScale = new Vector3(400f, UISettings.font.size + padding * 2f, 1f); bg.MakePixelPerfect(); UILabel lbl = NGUITools.AddWidget <UILabel>(go); lbl.font = UISettings.font; lbl.pivot = UIWidget.Pivot.Left; lbl.transform.localPosition = new Vector3(padding, 0f, 0f); lbl.multiLine = false; lbl.supportEncoding = false; lbl.lineWidth = Mathf.RoundToInt(400f - padding * 2f); lbl.text = "You can type here"; lbl.MakePixelPerfect(); // Add a collider to the background NGUITools.AddWidgetCollider(go); // Add an input script to the background and have it point to the label UIInput input = go.AddComponent <UIInput>(); input.label = lbl; // Update the selection Selection.activeGameObject = go; } }
/// <summary> /// Button creation function. /// </summary> void CreateButton(GameObject go) { if (UISettings.atlas != null) { GUILayout.BeginHorizontal(); string bg = UISpriteInspector.SpriteField(UISettings.atlas, "Background", mButton, GUILayout.Width(200f)); GUILayout.Space(20f); GUILayout.Label("Sliced Sprite for the background"); GUILayout.EndHorizontal(); if (mButton != bg) { mButton = bg; Save(); } } if (ShouldCreate(go, UISettings.atlas != null)) { int depth = NGUITools.CalculateNextDepth(go); go = NGUITools.AddChild(go); go.name = "Button"; UISlicedSprite bg = NGUITools.AddWidget <UISlicedSprite>(go); bg.name = "Background"; bg.depth = depth; bg.atlas = UISettings.atlas; bg.spriteName = mButton; bg.transform.localScale = new Vector3(150f, 40f, 1f); bg.MakePixelPerfect(); if (UISettings.font != null) { UILabel lbl = NGUITools.AddWidget <UILabel>(go); lbl.font = UISettings.font; lbl.text = go.name; lbl.MakePixelPerfect(); } // Add a collider NGUITools.AddWidgetCollider(go); // Add the scripts go.AddComponent <UIButton>().tweenTarget = bg.gameObject; go.AddComponent <UIButtonScale>(); go.AddComponent <UIButtonOffset>(); go.AddComponent <UIButtonSound>(); Selection.activeGameObject = go; } }
public override void OnInspectorGUI() { #pragma warning disable 0618 EditorGUIUtility.LookLikeControls(80f); #pragma warning restore 0618 mButton = target as UIImageButton; UISprite sprite = EditorGUILayout.ObjectField("Sprite", mButton.target, typeof(UISprite), true) as UISprite; if (mButton.target != sprite) { NGUIEditorTools.RegisterUndo("Image Button Change", mButton); mButton.target = sprite; if (sprite != null) { sprite.spriteName = mButton.normalSprite; } } if (mButton.target != null) { ComponentSelector.Draw <UIAtlas>(sprite.atlas as UIAtlas, OnSelectAtlas); if (sprite.atlas != null) { string normal = UISpriteInspector.SpriteField(sprite.atlas as UIAtlas, "Normal", mButton.normalSprite); string hover = UISpriteInspector.SpriteField(sprite.atlas as UIAtlas, "Hover", mButton.hoverSprite); string press = UISpriteInspector.SpriteField(sprite.atlas as UIAtlas, "Pressed", mButton.pressedSprite); if (mButton.normalSprite != normal || mButton.hoverSprite != hover || mButton.pressedSprite != press) { NGUIEditorTools.RegisterUndo("Image Button Change", mButton, mButton.gameObject, sprite); mButton.normalSprite = normal; mButton.hoverSprite = hover; mButton.pressedSprite = press; sprite.spriteName = normal; sprite.MakePixelPerfect(); NGUITools.AddWidgetCollider(mButton.gameObject); } } } }
/// <summary> /// Create a popup list or a menu. /// </summary> void CreatePopup(GameObject go, bool isDropDown) { if (UISettings.atlas != null) { GUILayout.BeginHorizontal(); string sprite = UISpriteInspector.SpriteField(UISettings.atlas, "Foreground", mListFG, GUILayout.Width(200f)); GUILayout.Space(20f); GUILayout.Label("Foreground sprite (shown on the button)"); GUILayout.EndHorizontal(); if (mListFG != sprite) { mListFG = sprite; Save(); } GUILayout.BeginHorizontal(); sprite = UISpriteInspector.SpriteField(UISettings.atlas, "Background", mListBG, GUILayout.Width(200f)); GUILayout.Space(20f); GUILayout.Label("Background sprite (envelops the options)"); GUILayout.EndHorizontal(); if (mListBG != sprite) { mListBG = sprite; Save(); } GUILayout.BeginHorizontal(); sprite = UISpriteInspector.SpriteField(UISettings.atlas, "Highlight", mListHL, GUILayout.Width(200f)); GUILayout.Space(20f); GUILayout.Label("Sprite used to highlight the selected option"); GUILayout.EndHorizontal(); if (mListHL != sprite) { mListHL = sprite; Save(); } } if (ShouldCreate(go, UISettings.atlas != null && UISettings.font != null)) { int depth = NGUITools.CalculateNextDepth(go); go = NGUITools.AddChild(go); go.name = isDropDown ? "Popup List" : "Popup Menu"; UIAtlas.Sprite sphl = UISettings.atlas.GetSprite(mListHL); UIAtlas.Sprite spfg = UISettings.atlas.GetSprite(mListFG); Vector2 hlPadding = new Vector2( Mathf.Max(4f, sphl.inner.xMin - sphl.outer.xMin), Mathf.Max(4f, sphl.inner.yMin - sphl.outer.yMin)); Vector2 fgPadding = new Vector2( Mathf.Max(4f, spfg.inner.xMin - spfg.outer.xMin), Mathf.Max(4f, spfg.inner.yMin - spfg.outer.yMin)); // Background sprite UISprite sprite = NGUITools.AddSprite(go, UISettings.atlas, mListFG); sprite.depth = depth; sprite.atlas = UISettings.atlas; sprite.transform.localScale = new Vector3(150f + fgPadding.x * 2f, UISettings.font.size + fgPadding.y * 2f, 1f); sprite.pivot = UIWidget.Pivot.Left; sprite.MakePixelPerfect(); // Text label UILabel lbl = NGUITools.AddWidget <UILabel>(go); lbl.font = UISettings.font; lbl.text = go.name; lbl.pivot = UIWidget.Pivot.Left; lbl.cachedTransform.localPosition = new Vector3(fgPadding.x, 0f, 0f); lbl.MakePixelPerfect(); // Add a collider NGUITools.AddWidgetCollider(go); // Add the popup list UIPopupList list = go.AddComponent <UIPopupList>(); list.atlas = UISettings.atlas; list.font = UISettings.font; list.backgroundSprite = mListBG; list.highlightSprite = mListHL; list.padding = hlPadding; if (isDropDown) { list.textLabel = lbl; } for (int i = 0; i < 5; ++i) { list.items.Add(isDropDown ? ("List Option " + i) : ("Menu Option " + i)); } // Add the scripts go.AddComponent <UIButton>().tweenTarget = sprite.gameObject; go.AddComponent <UIButtonSound>(); Selection.activeGameObject = go; } }
/// <summary> /// Progress bar creation function. /// </summary> void CreateSlider(GameObject go, bool slider) { if (UISettings.atlas != null) { GUILayout.BeginHorizontal(); string bg = UISpriteInspector.SpriteField(UISettings.atlas, "Background", mSliderBG, GUILayout.Width(200f)); GUILayout.Space(20f); GUILayout.Label("Sprite for the background (empty bar)"); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); string fg = UISpriteInspector.SpriteField(UISettings.atlas, "Foreground", mSliderFG, GUILayout.Width(200f)); GUILayout.Space(20f); GUILayout.Label("Sprite for the foreground (full bar)"); GUILayout.EndHorizontal(); string tb = mSliderTB; if (slider) { GUILayout.BeginHorizontal(); tb = UISpriteInspector.SpriteField(UISettings.atlas, "Thumb", mSliderTB, GUILayout.Width(200f)); GUILayout.Space(20f); GUILayout.Label("Sprite for the thumb indicator"); GUILayout.EndHorizontal(); } if (mSliderBG != bg || mSliderFG != fg || mSliderTB != tb) { mSliderBG = bg; mSliderFG = fg; mSliderTB = tb; Save(); } } if (ShouldCreate(go, UISettings.atlas != null)) { int depth = NGUITools.CalculateNextDepth(go); go = NGUITools.AddChild(go); go.name = slider ? "Slider" : "Progress Bar"; // Background sprite UIAtlas.Sprite bgs = UISettings.atlas.GetSprite(mSliderBG); UISprite back = (bgs.inner == bgs.outer) ? (UISprite)NGUITools.AddWidget <UISprite>(go) : (UISprite)NGUITools.AddWidget <UISlicedSprite>(go); back.name = "Background"; back.depth = depth; back.pivot = UIWidget.Pivot.Left; back.atlas = UISettings.atlas; back.spriteName = mSliderBG; back.transform.localScale = new Vector3(200f, 30f, 1f); back.MakePixelPerfect(); // Fireground sprite UIAtlas.Sprite fgs = UISettings.atlas.GetSprite(mSliderFG); UISprite front = (fgs.inner == fgs.outer) ? (UISprite)NGUITools.AddWidget <UIFilledSprite>(go) : (UISprite)NGUITools.AddWidget <UISlicedSprite>(go); front.name = "Foreground"; front.pivot = UIWidget.Pivot.Left; front.atlas = UISettings.atlas; front.spriteName = mSliderFG; front.transform.localScale = new Vector3(200f, 30f, 1f); front.MakePixelPerfect(); // Add a collider if (slider) { NGUITools.AddWidgetCollider(go); } // Add the slider script UISlider uiSlider = go.AddComponent <UISlider>(); uiSlider.foreground = front.transform; uiSlider.fullSize = front.transform.localScale; // Thumb sprite if (slider) { UIAtlas.Sprite tbs = UISettings.atlas.GetSprite(mSliderTB); UISprite thb = (tbs.inner == tbs.outer) ? (UISprite)NGUITools.AddWidget <UISprite>(go) : (UISprite)NGUITools.AddWidget <UISlicedSprite>(go); thb.name = "Thumb"; thb.atlas = UISettings.atlas; thb.spriteName = mSliderTB; thb.transform.localPosition = new Vector3(200f, 0f, 0f); thb.transform.localScale = new Vector3(20f, 40f, 1f); thb.MakePixelPerfect(); NGUITools.AddWidgetCollider(thb.gameObject); thb.gameObject.AddComponent <UIButtonColor>(); thb.gameObject.AddComponent <UIButtonScale>(); uiSlider.thumb = thb.transform; } uiSlider.sliderValue = 0.75f; // Select the slider Selection.activeGameObject = go; } }
/// <summary> /// Scroll bar template. /// </summary> void CreateScrollBar(GameObject go) { if (UISettings.atlas != null) { GUILayout.BeginHorizontal(); string bg = UISpriteInspector.SpriteField(UISettings.atlas, "Background", mScrollBG, GUILayout.Width(200f)); GUILayout.Space(20f); GUILayout.Label("Sprite for the background"); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); string fg = UISpriteInspector.SpriteField(UISettings.atlas, "Foreground", mScrollFG, GUILayout.Width(200f)); GUILayout.Space(20f); GUILayout.Label("Sprite for the foreground (thumb)"); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); UIScrollBar.Direction dir = (UIScrollBar.Direction)EditorGUILayout.EnumPopup("Direction", mScrollDir, GUILayout.Width(200f)); GUILayout.Space(20f); GUILayout.Label("Add colliders?", GUILayout.Width(80f)); bool draggable = EditorGUILayout.Toggle(mScrollCL); GUILayout.EndHorizontal(); if (mScrollBG != bg || mScrollFG != fg || mScrollCL != draggable || mScrollDir != dir) { mScrollBG = bg; mScrollFG = fg; mScrollCL = draggable; mScrollDir = dir; Save(); } } if (ShouldCreate(go, UISettings.atlas != null)) { int depth = NGUITools.CalculateNextDepth(go); go = NGUITools.AddChild(go); go.name = "Scroll Bar"; UISlicedSprite bg = NGUITools.AddWidget <UISlicedSprite>(go); bg.name = "Background"; bg.depth = depth; bg.atlas = UISettings.atlas; bg.spriteName = mScrollBG; bg.transform.localScale = new Vector3(400f + bg.border.x + bg.border.z, 14f + bg.border.y + bg.border.w, 1f); bg.MakePixelPerfect(); UISlicedSprite fg = NGUITools.AddWidget <UISlicedSprite>(go); fg.name = "Foreground"; fg.atlas = UISettings.atlas; fg.spriteName = mScrollFG; UIScrollBar sb = go.AddComponent <UIScrollBar>(); sb.background = bg; sb.foreground = fg; sb.direction = mScrollDir; sb.barSize = 0.3f; sb.scrollValue = 0.3f; sb.ForceUpdate(); if (mScrollCL) { NGUITools.AddWidgetCollider(bg.gameObject); NGUITools.AddWidgetCollider(fg.gameObject); } Selection.activeGameObject = go; } }
/// <summary> /// Checkbox creation function. /// </summary> void CreateCheckbox(GameObject go) { if (UISettings.atlas != null) { GUILayout.BeginHorizontal(); string bg = UISpriteInspector.SpriteField(UISettings.atlas, "Background", mCheckBG, GUILayout.Width(200f)); GUILayout.Space(20f); GUILayout.Label("Sliced Sprite for the background"); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); string ck = UISpriteInspector.SpriteField(UISettings.atlas, "Checkmark", mCheck, GUILayout.Width(200f)); GUILayout.Space(20f); GUILayout.Label("Sprite visible when the state is 'checked'"); GUILayout.EndHorizontal(); if (mCheckBG != bg || mCheck != ck) { mCheckBG = bg; mCheck = ck; Save(); } } if (ShouldCreate(go, UISettings.atlas != null)) { int depth = NGUITools.CalculateNextDepth(go); go = NGUITools.AddChild(go); go.name = "Checkbox"; UISlicedSprite bg = NGUITools.AddWidget <UISlicedSprite>(go); bg.name = "Background"; bg.depth = depth; bg.atlas = UISettings.atlas; bg.spriteName = mCheckBG; bg.transform.localScale = new Vector3(26f, 26f, 1f); bg.MakePixelPerfect(); UISprite fg = NGUITools.AddWidget <UISprite>(go); fg.name = "Checkmark"; fg.atlas = UISettings.atlas; fg.spriteName = mCheck; fg.MakePixelPerfect(); if (UISettings.font != null) { UILabel lbl = NGUITools.AddWidget <UILabel>(go); lbl.font = UISettings.font; lbl.text = go.name; lbl.pivot = UIWidget.Pivot.Left; lbl.transform.localPosition = new Vector3(16f, 0f, 0f); lbl.MakePixelPerfect(); } // Add a collider NGUITools.AddWidgetCollider(go); // Add the scripts go.AddComponent <UICheckbox>().checkSprite = fg; go.AddComponent <UIButton>().tweenTarget = bg.gameObject; go.AddComponent <UIButtonScale>().tweenTarget = bg.transform; go.AddComponent <UIButtonSound>(); Selection.activeGameObject = go; } }
/// <summary> /// Button creation function. /// </summary> void CreateImageButton(GameObject go) { if (UISettings.atlas != null) { GUILayout.BeginHorizontal(); string bg = UISpriteInspector.SpriteField(UISettings.atlas, "Normal", mImage0, GUILayout.Width(200f)); GUILayout.Space(20f); GUILayout.Label("Normal state sprite"); GUILayout.EndHorizontal(); if (mImage0 != bg) { mImage0 = bg; Save(); } GUILayout.BeginHorizontal(); bg = UISpriteInspector.SpriteField(UISettings.atlas, "Hover", mImage1, GUILayout.Width(200f)); GUILayout.Space(20f); GUILayout.Label("Hover state sprite"); GUILayout.EndHorizontal(); if (mImage1 != bg) { mImage1 = bg; Save(); } GUILayout.BeginHorizontal(); bg = UISpriteInspector.SpriteField(UISettings.atlas, "Pressed", mImage2, GUILayout.Width(200f)); GUILayout.Space(20f); GUILayout.Label("Pressed state sprite"); GUILayout.EndHorizontal(); if (mImage2 != bg) { mImage2 = bg; Save(); } } if (ShouldCreate(go, UISettings.atlas != null)) { int depth = NGUITools.CalculateNextDepth(go); go = NGUITools.AddChild(go); go.name = "Image Button"; UIAtlas.Sprite sp = UISettings.atlas.GetSprite(mImage0); UISprite sprite = (sp.inner == sp.outer) ? NGUITools.AddWidget <UISprite>(go) : (UISprite)NGUITools.AddWidget <UISlicedSprite>(go); sprite.name = "Background"; sprite.depth = depth; sprite.atlas = UISettings.atlas; sprite.spriteName = mImage0; sprite.transform.localScale = new Vector3(150f, 40f, 1f); sprite.MakePixelPerfect(); if (UISettings.font != null) { UILabel lbl = NGUITools.AddWidget <UILabel>(go); lbl.font = UISettings.font; lbl.text = go.name; lbl.MakePixelPerfect(); } // Add a collider NGUITools.AddWidgetCollider(go); // Add the scripts UIImageButton ib = go.AddComponent <UIImageButton>(); ib.target = sprite; ib.normalSprite = mImage0; ib.hoverSprite = mImage1; ib.pressedSprite = mImage2; go.AddComponent <UIButtonSound>(); Selection.activeGameObject = go; } }
/// <summary> /// Draw the inspector widget. /// </summary> public override void OnInspectorGUI() { EditorGUIUtility.LookLikeControls(80f); mAtlas = target as UIAtlas; NGUIEditorTools.DrawSeparator(); if (mAtlas.replacement != null) { mType = AtlasType.Reference; mReplacement = mAtlas.replacement as UIAtlas; } AtlasType after = (AtlasType)EditorGUILayout.EnumPopup("Atlas Type", mType); if (mType != after) { if (after == AtlasType.Normal) { OnSelectAtlas(null); } else { mType = AtlasType.Reference; } } if (mType == AtlasType.Reference) { ComponentSelector.Draw <UIAtlas>(mAtlas.replacement as UIAtlas, OnSelectAtlas); NGUIEditorTools.DrawSeparator(); GUILayout.Label("You can have one atlas simply point to\n" + "another one. This is useful if you want to be\n" + "able to quickly replace the contents of one\n" + "atlas with another one, for example for\n" + "swapping an SD atlas with an HD one, or\n" + "replacing an English atlas with a Chinese\n" + "one. All the sprites referencing this atlas\n" + "will update their references to the new one."); if (mReplacement != mAtlas && mAtlas.replacement != mReplacement) { NGUIEditorTools.RegisterUndo("Atlas Change", mAtlas); mAtlas.replacement = mReplacement; UnityEditor.EditorUtility.SetDirty(mAtlas); } return; } if (!mConfirmDelete) { NGUIEditorTools.DrawSeparator(); Material mat = EditorGUILayout.ObjectField("Material", mAtlas.spriteMaterial, typeof(Material), false) as Material; if (mAtlas.spriteMaterial != mat) { NGUIEditorTools.RegisterUndo("Atlas Change", mAtlas); mAtlas.spriteMaterial = mat; // Ensure that this atlas has valid import settings if (mAtlas.texture != null) { NGUIEditorTools.ImportTexture(mAtlas.texture, false, false); } mAtlas.MarkAsDirty(); mConfirmDelete = false; } if (mat != null) { TextAsset ta = EditorGUILayout.ObjectField("TP Import", null, typeof(TextAsset), false) as TextAsset; if (ta != null) { // Ensure that this atlas has valid import settings if (mAtlas.texture != null) { NGUIEditorTools.ImportTexture(mAtlas.texture, false, false); } NGUIEditorTools.RegisterUndo("Import Sprites", mAtlas); NGUIJson.LoadSpriteData(mAtlas, ta); if (mSprite != null) { mSprite = mAtlas.GetSprite(mSprite.name); } mAtlas.MarkAsDirty(); } UIAtlas.Coordinates coords = (UIAtlas.Coordinates)EditorGUILayout.EnumPopup("Coordinates", mAtlas.coordinates); if (coords != mAtlas.coordinates) { NGUIEditorTools.RegisterUndo("Atlas Change", mAtlas); mAtlas.coordinates = coords; mConfirmDelete = false; } float pixelSize = EditorGUILayout.FloatField("Pixel Size", mAtlas.pixelSize); if (pixelSize != mAtlas.pixelSize) { NGUIEditorTools.RegisterUndo("Atlas Change", mAtlas); mAtlas.pixelSize = pixelSize; mConfirmDelete = false; } } } if (mAtlas.spriteMaterial != null) { Color blue = new Color(0f, 0.7f, 1f, 1f); Color green = new Color(0.4f, 1f, 0f, 1f); if (mConfirmDelete) { if (mSprite != null) { // Show the confirmation dialog NGUIEditorTools.DrawSeparator(); GUILayout.Label("Are you sure you want to delete '" + mSprite.name + "'?"); NGUIEditorTools.DrawSeparator(); GUILayout.BeginHorizontal(); { GUI.backgroundColor = Color.green; if (GUILayout.Button("Cancel")) { mConfirmDelete = false; } GUI.backgroundColor = Color.red; if (GUILayout.Button("Delete")) { NGUIEditorTools.RegisterUndo("Delete Sprite", mAtlas); mAtlas.spriteList.Remove(mSprite); mConfirmDelete = false; } GUI.backgroundColor = Color.white; } GUILayout.EndHorizontal(); } else { mConfirmDelete = false; } } else { if (mSprite == null && mAtlas.spriteList.Count > 0) { string spriteName = EditorPrefs.GetString("NGUI Selected Sprite"); if (!string.IsNullOrEmpty(spriteName)) { mSprite = mAtlas.GetSprite(spriteName); } if (mSprite == null) { mSprite = mAtlas.spriteList[0]; } } GUI.backgroundColor = Color.green; GUILayout.BeginHorizontal(); { EditorGUILayout.PrefixLabel("Add/Delete"); if (GUILayout.Button("New Sprite")) { NGUIEditorTools.RegisterUndo("Add Sprite", mAtlas); UIAtlas.Sprite newSprite = new UIAtlas.Sprite(); if (mSprite != null) { newSprite.name = "Copy of " + mSprite.name; newSprite.outer = mSprite.outer; newSprite.inner = mSprite.inner; } else { newSprite.name = "New Sprite"; } mAtlas.spriteList.Add(newSprite); mSprite = newSprite; } // Show the delete button GUI.backgroundColor = Color.red; if (mSprite != null && GUILayout.Button("Delete", GUILayout.Width(55f))) { mConfirmDelete = true; } GUI.backgroundColor = Color.white; } GUILayout.EndHorizontal(); if (!mConfirmDelete && mSprite != null) { NGUIEditorTools.DrawSeparator(); string spriteName = UISpriteInspector.SpriteField(mAtlas, mSprite.name); if (spriteName != mSprite.name) { mSprite = mAtlas.GetSprite(spriteName); EditorPrefs.SetString("NGUI Selected Sprite", spriteName); } if (mSprite == null) { return; } Texture2D tex = mAtlas.spriteMaterial.mainTexture as Texture2D; if (tex != null) { Rect inner = mSprite.inner; Rect outer = mSprite.outer; string name = EditorGUILayout.TextField("Edit Name", mSprite.name); if (mSprite.name != name && !string.IsNullOrEmpty(name)) { bool found = false; foreach (UIAtlas.Sprite sp in mAtlas.spriteList) { if (sp.name == name) { found = true; break; } } if (!found) { NGUIEditorTools.RegisterUndo("Edit Sprite Name", mAtlas); mSprite.name = name; } } if (mAtlas.coordinates == UIAtlas.Coordinates.Pixels) { GUI.backgroundColor = green; outer = NGUIEditorTools.IntRect("Dimensions", mSprite.outer); Vector4 border = new Vector4( mSprite.inner.xMin - mSprite.outer.xMin, mSprite.inner.yMin - mSprite.outer.yMin, mSprite.outer.xMax - mSprite.inner.xMax, mSprite.outer.yMax - mSprite.inner.yMax); GUI.backgroundColor = blue; border = NGUIEditorTools.IntPadding("Border", border); GUI.backgroundColor = Color.white; inner.xMin = mSprite.outer.xMin + border.x; inner.yMin = mSprite.outer.yMin + border.y; inner.xMax = mSprite.outer.xMax - border.z; inner.yMax = mSprite.outer.yMax - border.w; } else { // Draw the inner and outer rectangle dimensions GUI.backgroundColor = green; outer = EditorGUILayout.RectField("Outer Rect", mSprite.outer); GUI.backgroundColor = blue; inner = EditorGUILayout.RectField("Inner Rect", mSprite.inner); GUI.backgroundColor = Color.white; } if (outer.xMax < outer.xMin) { outer.xMax = outer.xMin; } if (outer.yMax < outer.yMin) { outer.yMax = outer.yMin; } if (outer != mSprite.outer) { float x = outer.xMin - mSprite.outer.xMin; float y = outer.yMin - mSprite.outer.yMin; inner.x += x; inner.y += y; } // Sanity checks to ensure that the inner rect is always inside the outer inner.xMin = Mathf.Clamp(inner.xMin, outer.xMin, outer.xMax); inner.xMax = Mathf.Clamp(inner.xMax, outer.xMin, outer.xMax); inner.yMin = Mathf.Clamp(inner.yMin, outer.yMin, outer.yMax); inner.yMax = Mathf.Clamp(inner.yMax, outer.yMin, outer.yMax); EditorGUILayout.Separator(); // Padding is mainly meant to be used by the 'trimmed' feature of TexturePacker if (mAtlas.coordinates == UIAtlas.Coordinates.Pixels) { int left = Mathf.RoundToInt(mSprite.paddingLeft * mSprite.outer.width); int right = Mathf.RoundToInt(mSprite.paddingRight * mSprite.outer.width); int top = Mathf.RoundToInt(mSprite.paddingTop * mSprite.outer.height); int bottom = Mathf.RoundToInt(mSprite.paddingBottom * mSprite.outer.height); NGUIEditorTools.IntVector a = NGUIEditorTools.IntPair("Padding", "Left", "Top", left, top); NGUIEditorTools.IntVector b = NGUIEditorTools.IntPair(null, "Right", "Bottom", right, bottom); if (a.x != left || a.y != top || b.x != right || b.y != bottom) { NGUIEditorTools.RegisterUndo("Atlas Change", mAtlas); mSprite.paddingLeft = a.x / mSprite.outer.width; mSprite.paddingTop = a.y / mSprite.outer.width; mSprite.paddingRight = b.x / mSprite.outer.height; mSprite.paddingBottom = b.y / mSprite.outer.height; MarkSpriteAsDirty(); } } else { // Create a button that can make the coordinates pixel-perfect on click GUILayout.BeginHorizontal(); { GUILayout.Label("Correction", GUILayout.Width(75f)); Rect corrected0 = outer; Rect corrected1 = inner; if (mAtlas.coordinates == UIAtlas.Coordinates.Pixels) { corrected0 = NGUIMath.MakePixelPerfect(corrected0); corrected1 = NGUIMath.MakePixelPerfect(corrected1); } else { corrected0 = NGUIMath.MakePixelPerfect(corrected0, tex.width, tex.height); corrected1 = NGUIMath.MakePixelPerfect(corrected1, tex.width, tex.height); } if (corrected0 == mSprite.outer && corrected1 == mSprite.inner) { GUI.color = Color.grey; GUILayout.Button("Make Pixel-Perfect"); GUI.color = Color.white; } else if (GUILayout.Button("Make Pixel-Perfect")) { outer = corrected0; inner = corrected1; GUI.changed = true; } } GUILayout.EndHorizontal(); } GUILayout.BeginHorizontal(); { mView = (View)EditorGUILayout.EnumPopup("Show", mView); GUILayout.Label("Shader", GUILayout.Width(45f)); if (mUseShader != EditorGUILayout.Toggle(mUseShader, GUILayout.Width(20f))) { mUseShader = !mUseShader; if (mUseShader && mView == View.Sprite) { // TODO: Remove this when Unity fixes the bug with DrawPreviewTexture not being affected by BeginGroup Debug.LogWarning("There is a bug in Unity that prevents the texture from getting clipped properly.\n" + "Until it's fixed by Unity, your texture may spill onto the rest of the Unity's GUI while using this mode."); } } } GUILayout.EndHorizontal(); if (mSprite.outer != outer || mSprite.inner != inner) { NGUIEditorTools.RegisterUndo("Atlas Change", mAtlas); mSprite.outer = outer; mSprite.inner = inner; mConfirmDelete = false; MarkSpriteAsDirty(); } Rect uv0 = outer; Rect uv1 = inner; if (mAtlas.coordinates == UIAtlas.Coordinates.Pixels) { uv0 = NGUIMath.ConvertToTexCoords(uv0, tex.width, tex.height); uv1 = NGUIMath.ConvertToTexCoords(uv1, tex.width, tex.height); } // Draw the atlas EditorGUILayout.Separator(); Material m = mUseShader ? mAtlas.spriteMaterial : null; Rect rect = (mView == View.Atlas) ? NGUIEditorTools.DrawAtlas(tex, m) : NGUIEditorTools.DrawSprite(tex, uv0, m); // Draw the sprite outline NGUIEditorTools.DrawOutline(rect, uv0, uv1); EditorGUILayout.Separator(); } } } } }
public override void OnInspectorGUI() { EditorGUIUtility.LookLikeControls(80f); mList = target as UIPopupList; ComponentSelector.Draw <UIAtlas>(mList.atlas, OnSelectAtlas); ComponentSelector.Draw <UIFont>(mList.font, OnSelectFont); UILabel lbl = EditorGUILayout.ObjectField("Text Label", mList.textLabel, typeof(UILabel), true) as UILabel; if (mList.textLabel != lbl) { RegisterUndo(); mList.textLabel = lbl; if (lbl != null) { lbl.text = mList.selection; } } if (mList.atlas != null) { string bg = UISpriteInspector.SpriteField(mList.atlas, "Background", mList.backgroundSprite); string hl = UISpriteInspector.SpriteField(mList.atlas, "Highlight", mList.highlightSprite); if (mList.backgroundSprite != bg || mList.highlightSprite != hl) { RegisterUndo(); mList.backgroundSprite = bg; mList.highlightSprite = hl; } GUILayout.BeginHorizontal(); GUILayout.Space(6f); GUILayout.Label("Options"); GUILayout.EndHorizontal(); string text = ""; foreach (string s in mList.items) { text += s + "\n"; } GUILayout.Space(-22f); GUILayout.BeginHorizontal(); GUILayout.Space(84f); string modified = EditorGUILayout.TextArea(text, GUILayout.Height(100f)); GUILayout.EndHorizontal(); if (modified != text) { RegisterUndo(); string[] split = modified.Split(new char[] { '\n' }, System.StringSplitOptions.RemoveEmptyEntries); mList.items.Clear(); foreach (string s in split) { mList.items.Add(s); } if (string.IsNullOrEmpty(mList.selection) || !mList.items.Contains(mList.selection)) { mList.selection = mList.items.Count > 0 ? mList.items[0] : ""; } } string sel = NGUIEditorTools.DrawList("Selection", mList.items.ToArray(), mList.selection); if (mList.selection != sel) { RegisterUndo(); mList.selection = sel; } UIPopupList.Position pos = (UIPopupList.Position)EditorGUILayout.EnumPopup("Position", mList.position); if (mList.position != pos) { RegisterUndo(); mList.position = pos; } float ts = EditorGUILayout.FloatField("Text Scale", mList.textScale); Color tc = EditorGUILayout.ColorField("Text Color", mList.textColor); Color bc = EditorGUILayout.ColorField("Background", mList.backgroundColor); Color hc = EditorGUILayout.ColorField("Highlight", mList.highlightColor); GUILayout.BeginHorizontal(); bool isLocalized = EditorGUILayout.Toggle("Localized", mList.isLocalized, GUILayout.Width(100f)); bool isAnimated = EditorGUILayout.Toggle("Animated", mList.isAnimated); GUILayout.EndHorizontal(); if (mList.textScale != ts || mList.textColor != tc || mList.highlightColor != hc || mList.backgroundColor != bc || mList.isLocalized != isLocalized || mList.isAnimated != isAnimated) { RegisterUndo(); mList.textScale = ts; mList.textColor = tc; mList.backgroundColor = bc; mList.highlightColor = hc; mList.isLocalized = isLocalized; mList.isAnimated = isAnimated; } NGUIEditorTools.DrawSeparator(); GUILayout.BeginHorizontal(); GUILayout.Space(6f); GUILayout.Label("Padding", GUILayout.Width(76f)); GUILayout.BeginVertical(); GUILayout.Space(-12f); Vector2 padding = EditorGUILayout.Vector2Field("", mList.padding); GUILayout.EndVertical(); GUILayout.EndHorizontal(); if (mList.padding != padding) { RegisterUndo(); mList.padding = padding; } EditorGUIUtility.LookLikeControls(100f); GameObject go = EditorGUILayout.ObjectField("Event Receiver", mList.eventReceiver, typeof(GameObject), true) as GameObject; string fn = EditorGUILayout.TextField("Function Name", mList.functionName); if (mList.eventReceiver != go || mList.functionName != fn) { RegisterUndo(); mList.eventReceiver = go; mList.functionName = fn; } } }