Files
Continentis/Assets/OtherPlugins/DamageNumbersPro/Scripts/Internal/Editor/DNPEditorInternal.cs
SoulliesOfficial 9b1b5ca93f initial
2025-10-03 00:02:43 -04:00

1380 lines
46 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#if UNITY_EDITOR
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using TMPro;
using DamageNumbersPro;
using UnityEngine.Rendering;
using UnityEditor.SceneManagement;
namespace DamageNumbersPro.Internal {
public static class DNPEditorInternal
{
// Public
public static int currentTab;
public static bool repaintViews;
public static HashSet<string> hints;
public static DamageNumber[] damageNumbers;
public static TextMeshPro[] textMeshPros;
// Private
static Transform[] meshAs;
static Transform[] meshBs;
// Presets
static Dictionary<string,DNPPreset[]> allPresets;
// GUI Resources
public static GUIStyle labelStyle;
public static GUIStyle buttonStyle;
public static GUIStyle rightTextStyle;
public static GUIStyle centerTextStyle;
public static GUIStyle bottomRightTextStyle;
public static GUIStyle topRightTextStyle;
static GUIStyle whiteBoxStyle;
static Texture2D whiteBoxTexture;
static Texture bannerTexture;
public static float currentWidth;
// External Editor
static int currentEditor;
static bool cleanEditor;
static Material[] currentMaterials;
static MaterialEditor materialEditor;
static Editor textMeshProEditor;
static bool generatedGUIStyles;
public static void PrepareInspector(DamageNumberEditor damageNumberEditor)
{
// Clean Editors
cleanEditor = true;
generatedGUIStyles = false;
// Get Damage Numbers
damageNumbers = new DamageNumber[damageNumberEditor.targets.Length];
for (int i = 0; i < damageNumberEditor.targets.Length; i++)
{
damageNumbers[i] = (DamageNumber)damageNumberEditor.targets[i];
}
// Type
bool isMesh = damageNumbers[0].IsMesh();
// Get Presets
allPresets = new Dictionary<string, DNPPreset[]>();
allPresets.Add("Style", Resources.LoadAll<DNPPreset>("DNP/Style"));
allPresets.Add("Fade In", Resources.LoadAll<DNPPreset>("DNP/Fade In"));
allPresets.Add("Fade Out", Resources.LoadAll<DNPPreset>("DNP/Fade Out"));
allPresets.Add("Behaviour", Resources.LoadAll<DNPPreset>("DNP/Behaviour"));
// Get Structural Objects
textMeshPros = new TextMeshPro[damageNumbers.Length];
meshAs = new Transform[damageNumbers.Length];
meshBs = new Transform[damageNumbers.Length];
if(isMesh)
{
for (int n = 0; n < damageNumbers.Length; n++)
{
Transform dnTransform = damageNumbers[n].transform;
// TMP
Transform textMeshProTransform = dnTransform.Find("TMP");
if (textMeshProTransform != null)
{
textMeshPros[n] = textMeshProTransform.GetComponent<TextMeshPro>();
}
// MeshA
meshAs[n] = dnTransform.Find("MeshA");
// MeshB
meshBs[n] = dnTransform.Find("MeshB");
}
}
// Get Banner Texture
if (damageNumbers != null && damageNumbers.Length > 0 && damageNumbers[0] != null)
{
bannerTexture = Resources.Load<Texture>("DNP/Textures/DNP_Banner");
}
// Create White Box Texture
Color[] pixels = new Color[4];
for (int n = 0; n < pixels.Length; n++)
{
pixels[n] = Color.white;
}
whiteBoxTexture = new Texture2D(2, 2);
whiteBoxTexture.SetPixels(pixels);
whiteBoxTexture.Apply();
// Close Hints
hints = new HashSet<string>();
}
public static void OnInspectorGUI(DamageNumberEditor damageNumberEditor)
{
// Prepare Inspector
if (damageNumbers == null || damageNumbers.Length == 0 || damageNumbers[0] == null)
{
PrepareInspector(damageNumberEditor);
}
// Prepare Styles
PrepareStyles();
// Repaint
if (repaintViews)
{
repaintViews = false;
UnityEditorInternal.InternalEditorUtility.RepaintAllViews();
}
}
#region Inspector Top
public static void DrawInspectorTop(bool isMesh)
{
// Banner
Rect bannerRect = DrawBanner(isMesh);
// Tabs
DrawTabs(bannerRect);
// Distance
EditorGUILayout.Space(42);
}
static Rect DrawBanner(bool isMesh)
{
Rect bannerRect = default;
if (bannerTexture != null)
{
// Banner
EditorGUILayout.BeginVertical();
GUILayout.Label("", GUILayout.Height(100 + 0.38f * Mathf.Min(0,EditorGUIUtility.currentViewWidth - 430)));
bannerRect = GUILayoutUtility.GetLastRect();
float ratio = (bannerRect.width / bannerRect.height) / 8f;
Rect clipRect = new Rect((1 - ratio) * 0.5f, 0, ratio, 1);
GUI.DrawTextureWithTexCoords(bannerRect, bannerTexture, clipRect, true);
EditorGUILayout.EndVertical();
// Version Info
Rect infoRect = new Rect(bannerRect);
infoRect.width -= 3;
infoRect.y += 4;
infoRect.height -= 8;
GUI.Label(infoRect, "<color=#FFFFFF><b><size=10>v</size>" + DamageNumberEditor.version + " </b></color>", bottomRightTextStyle);
// Type Info
GUI.Label(infoRect, "<color=#FFFFFF><b>" + (isMesh ? "Mesh" : "GUI") + "<size=10> </size></b></color>", topRightTextStyle);
// Button
Rect documentationRect = GUILayoutUtility.GetLastRect();
documentationRect.x += 9;
documentationRect.y += 9;
documentationRect.width = 56;
documentationRect.height = 18;
if (GUI.Button(documentationRect, "<b>Manual</b>", buttonStyle))
{
Application.OpenURL("https://ekincantas.com/damage-numbers-pro/");
}
documentationRect.y += 21;
if (GUI.Button(documentationRect, "<b>Discord</b>", buttonStyle))
{
Application.OpenURL("https://discord.gg/nWbRkN8Zxr");
}
// Box
BoxLastRect();
EditorGUILayout.Space();
// Calculate Width for GUI Scaling
float newWidth = GUILayoutUtility.GetLastRect().width;
if(newWidth > 50)
{
currentWidth = newWidth;
}
}
return bannerRect;
}
static void DrawTabs(Rect lastRect)
{
// Position
lastRect.y += lastRect.height - 3;
lastRect.height = 29;
// Row 1
int lastTab = currentTab;
currentTab = GUI.Toolbar(lastRect, currentTab, new string[] { "Main", "Text", "Fade In", "Fade Out" }, buttonStyle);
lastRect.height -= 1;
BoxRect(lastRect);
string rotAndScaleText = "Rotation & Size";
if(currentWidth < 388)
{
rotAndScaleText = "<size=11>Rotation & Size</size>";
if(currentWidth < 356)
{
rotAndScaleText = "<size=10>Rotation & Size</size>";
if (currentWidth < 324)
{
rotAndScaleText = "<size=9>Rotation & Size</size>";
if (currentWidth < 303)
{
rotAndScaleText = "<size=8>Rotation & Size</size>";
if (currentWidth < 276)
{
rotAndScaleText = "<size=7>Rotation & Size</size>";
}
}
}
}
}
string spamText = "Spam Control";
if(currentWidth < 340)
{
spamText = "<size=11>Spam Control</size>";
if (currentWidth < 324)
{
spamText = "<size=10>Spam Control</size>";
if (currentWidth < 304)
{
spamText = "<size=9>Spam Control</size>";
if (currentWidth < 367)
{
spamText = "<size=8>Spam Control</size>";
}
}
}
}
string performanceText = "Performance";
if(currentWidth < 336)
{
performanceText = "<size=11>Performance</size>";
if (currentWidth < 310)
{
performanceText = "<size=10>Performance</size>";
if (currentWidth < 292)
{
performanceText = "<size=9>Performance</size>";
}
}
}
string movementText = "Movement";
if(currentWidth < 293)
{
movementText = "<size=11>Movement</size>";
if (currentWidth < 282)
{
movementText = "<size=10>Movement</size>";
if (currentWidth < 263)
{
movementText = "<size=9>Movement</size>";
}
}
}
// Row 2
lastRect.y += lastRect.height - 3;
lastRect.height = 22;
currentTab = 4 + GUI.Toolbar(lastRect, currentTab - 4, new string[] { movementText, rotAndScaleText, spamText, performanceText }, buttonStyle);
lastRect.height += 2;
// On Switch
if (currentTab != lastTab)
{
EditorGUIUtility.keyboardControl = EditorGUIUtility.hotControl = 0;
hints = new HashSet<string>(); // Clear Hints
}
// Box
BoxRect(lastRect, true, false);
}
#endregion
#region Special Sections
public static void FinalInformation()
{
Color finalInformationColor = new Color(0.93f, 0.95f, 1);
GUIStyle linkStyle = new GUIStyle(labelStyle);
linkStyle.normal.textColor = linkStyle.focused.textColor = linkStyle.hover.textColor = EditorGUIUtility.isProSkin ? new Color(0.8f, 0.9f, 1f, 1) : new Color(0.1f, 0.2f, 0.4f, 1);
linkStyle.active.textColor = EditorGUIUtility.isProSkin ? new Color(0.6f, 0.8f, 1f, 1) : new Color(0.15f, 0.4f, 0.6f, 1);
EditorGUILayout.Space(2);
StartBox(finalInformationColor);
EditorGUILayout.BeginVertical();
GUI.color = new Color(1, 1, 1f, 0.75f);
if(currentWidth < 285)
{
if(currentWidth < 265)
{
Label("<size=10><b>Thank you for using Damage Numbers Pro.</b></size>");
}
else
{
Label("<size=11><b>Thank you for using Damage Numbers Pro.</b></size>");
}
}
else
{
Label("<b>Thank you for using Damage Numbers Pro.</b>");
}
Label("<b>Contact me if you need any help.</b>");
EditorGUILayout.Space(8);
EditorGUILayout.BeginHorizontal();
GUI.color = new Color(1, 1, 1, 1);
// Link Shrinking
string docLink = "https://ekincantas.com/damage-numbers-pro/";
if(currentWidth < 420f)
{
docLink = "https://ekincantas.com/damage-numbers...";
if (currentWidth < 398)
{
docLink = "https://ekincantas.com/damage...";
if (currentWidth < 340)
{
docLink = "https://ekincantas.com/...";
if(currentWidth < 293)
{
docLink = "Open Link";
}
}
}
}
string discordLink = "https://discord.gg/nWbRkN8Zxr";
if (currentWidth < 335f)
{
discordLink = "https://discord.gg/...";
if (currentWidth < 264)
{
discordLink = "Open Link";
}
}
EditorGUILayout.LabelField("<b>Documentation:</b>", labelStyle, GUILayout.Width(100));
if (GUILayout.Button("<b>" + docLink + "</b>", linkStyle))
{
Application.OpenURL("https://ekincantas.com/damage-numbers-pro/");
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
GUI.color = new Color(1, 1, 1, 1);
EditorGUILayout.LabelField("<b>Discord:</b>", labelStyle, GUILayout.Width(100));
if (GUILayout.Button("<b>" + discordLink + "</b>", linkStyle))
{
Application.OpenURL("https://discord.gg/nWbRkN8Zxr");
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
GUI.color = new Color(1, 1, 1, 1);
string emailPrefix = "<b>Email:</b>";
if(currentWidth < 259)
{
emailPrefix = "<size=11><b>Email:</b></size>";
if(currentWidth < 256)
{
emailPrefix = "<size=10><b>Email:</b></size>";
if (currentWidth < 254)
{
emailPrefix = "<size=9><b>Email:</b></size>";
}
}
}
EditorGUILayout.LabelField(emailPrefix, labelStyle, GUILayout.Width(100 + Mathf.Min(0,(currentWidth - 320))));
EditorGUILayout.SelectableLabel("<b>ekincantascontact@gmail.com</b>", linkStyle, GUILayout.Height(16));
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
GUI.backgroundColor = Color.white;
CloseBox(finalInformationColor);
EditorGUILayout.Space(5);
}
public static void Externalnspectors(bool isMesh, Object target)
{
EditorGUILayout.Space(2);
Lines();
Color externalInspectorColor = new Color(0.93f, 0.95f, 1);
EditorGUILayout.Space(2);
StartBox(externalInspectorColor);
GUI.backgroundColor = externalInspectorColor;
EditorGUILayout.BeginVertical();
bool editingPrefabPreview = EditingPrefabPreview(target);
if (editingPrefabPreview)
{
GUI.color = new Color(1, 1, 1f, 0.75f);
ScalingLabel("<b>Open</b> the prefab to access the <b>presets</b>, <b>material</b> and <b>text mesh pro</b> tabs.", 440);
OpenPrefabButton(target);
GUI.backgroundColor = Color.white;
EditorGUILayout.EndVertical();
CloseBox(externalInspectorColor);
return;
}
int previousEditor = currentEditor;
if (cleanEditor)
{
previousEditor = -1; // Force Clean
cleanEditor = false;
}
// Tab Names
string textMeshProTab = "TextMeshPro";
string materialTab = "Material";
if (damageNumbers != null && damageNumbers.Length > 1)
{
textMeshProTab = damageNumbers.Length + " TextMeshPros";
materialTab = "Materials";
}
if(currentWidth < 266)
{
textMeshProTab = "<size=11>" + textMeshProTab + "</size>";
}
// Tab Rect
GUILayout.BeginVertical();
GUILayout.Space(13);
GUILayout.EndVertical();
Rect tabRect = GUILayoutUtility.GetLastRect();
tabRect.x -= 5;
tabRect.width += 12;
tabRect.y -= 5;
tabRect.height = 25;
// Draw Tab
currentEditor = GUI.Toolbar(tabRect, currentEditor, new string[] { "Presets", materialTab , textMeshProTab });
// Box Tab Rect
tabRect.y += 23;
tabRect.height = 3;
tabRect.width -= 3;
if (currentEditor == 1)
{
EditorGUILayout.Space(14);
// Material
if (previousEditor != 1)
{
ResetMaterials();
}
if (materialEditor != null)
{
materialEditor.DrawHeader();
materialEditor.OnInspectorGUI();
}
}
else if (currentEditor == 2)
{
EditorGUILayout.Space(14);
if (damageNumbers.Length > 1)
{
GUI.color = new Color(1, 1, 1, 0.7f);
Label("The fancy inspector does not work for <b>multiple</b> damage numbers.");
Label("You can also <b>manually select</b> the text-mesh-pro components.");
Label("- Sorry for the inconvenience.");
GUI.color = Color.white;
EditorGUILayout.Space(8);
}
if (isMesh)
{
// Text Mesh Pro
if (previousEditor != 2)
{
if (textMeshProEditor != null)
{
Object.DestroyImmediate(textMeshProEditor);
}
textMeshProEditor = Editor.CreateEditor(textMeshPros, null);
}
// Editor
if (textMeshProEditor != null)
{
textMeshProEditor.DrawHeader();
if (textMeshPros.Length > 1)
{
textMeshProEditor.DrawDefaultInspector();
}
else
{
textMeshProEditor.OnInspectorGUI();
}
}
}
else
{
// Text Mesh Pro
if (previousEditor != 2)
{
if (textMeshProEditor != null)
{
Object.DestroyImmediate(textMeshProEditor);
}
TextMeshProUGUI[] tmps = new TextMeshProUGUI[damageNumbers.Length];
for(int i = 0; i < damageNumbers.Length; i++)
{
TMP_Text tmpText = damageNumbers[i].GetTextMesh();
if(tmpText.GetType() == typeof(TextMeshProUGUI))
{
tmps[i] = (TextMeshProUGUI)tmpText;
}
else
{
return;
}
}
textMeshProEditor = Editor.CreateEditor(tmps, null);
}
// Editor
if (textMeshProEditor != null)
{
textMeshProEditor.DrawHeader();
if (textMeshPros.Length > 1)
{
textMeshProEditor.DrawDefaultInspector();
}
else
{
textMeshProEditor.OnInspectorGUI();
}
// Match both TMPs
foreach(DamageNumber dn in damageNumbers)
{
TMP_Text[] tmps = dn.GetTextMeshs();
if(tmps.Length > 1)
{
EditorUtility.CopySerialized(((TextMeshProUGUI)tmps[0]), ((TextMeshProUGUI)tmps[1]));
}
}
}
}
}
else
{
EditorGUILayout.Space(14);
ShowPresets(isMesh);
}
EditorGUILayout.EndVertical();
GUI.backgroundColor = Color.white;
CloseBox(externalInspectorColor);
// Line under Tabs
GUI.color = externalInspectorColor;
DrawOutlineBox(tabRect);
tabRect.width += 3;
DrawBox(tabRect);
GUI.color = Color.white;
}
public static void ResetMaterials()
{
List<Material> allMaterials = new List<Material>();
foreach (DamageNumber dn in damageNumbers)
{
dn.GetReferencesIfNecessary();
foreach (Material mat in dn.GetSharedMaterials())
{
if (allMaterials.Contains(mat) == false)
{
allMaterials.Add(mat);
}
}
}
currentMaterials = new Material[allMaterials.Count];
for (int n = 0; n < allMaterials.Count; n++)
{
currentMaterials[n] = allMaterials[n];
}
if (materialEditor != null)
{
Object.DestroyImmediate(materialEditor);
}
materialEditor = (MaterialEditor)Editor.CreateEditor(currentMaterials);
}
static void ShowPresets(bool isMesh)
{
PresetCategory("Style", isMesh);
EditorGUILayout.Space(12);
PresetCategory("Fade In", isMesh);
EditorGUILayout.Space(12);
PresetCategory("Fade Out", isMesh);
EditorGUILayout.Space(12);
PresetCategory("Behaviour", isMesh);
}
static void PresetCategory(string category, bool isMesh)
{
GUI.color = new Color(1, 1, 1, 0.7f);
EditorGUILayout.LabelField("<size=14><b> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - " + category + " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - </b></size>", centerTextStyle);
GUI.color = Color.white;
DNPPreset[] presets = allPresets[category];
if(presets == null || presets.Length == 0)
{
GUI.color = new Color(1, 1, 1, 0.7f);
Label("Presets could not be loaded.");
Label("Maybe you deleted or moved a folder ?");
GUI.color = Color.white;
return;
}
int buttonsPerRow = 4;
if(EditorGUIUtility.currentViewWidth < 440)
{
buttonsPerRow = 3;
if(EditorGUIUtility.currentViewWidth < 375)
{
buttonsPerRow = 2;
}
}
int currentCount = 0;
foreach (DNPPreset preset in presets)
{
// Check Applied
bool isApplied = true;
foreach (DamageNumber dn in damageNumbers)
{
if(!preset.IsApplied(dn))
{
isApplied = false;
break;
}
}
if(isApplied)
{
GUI.enabled = false;
}
// Increase Count
currentCount++;
if (currentCount % buttonsPerRow == 1)
{
if(currentCount > 1)
{
EditorGUILayout.EndHorizontal();
}
EditorGUILayout.BeginHorizontal();
GUILayout.Space(5);
}
// Apply Button
if (GUILayout.Button(preset.name))
{
if(isMesh)
{
Object[] undoObjects = new Object[damageNumbers.Length + textMeshPros.Length];
for (int i = 0; i < damageNumbers.Length; i++)
{
undoObjects[i] = damageNumbers[i];
}
for (int i = 0; i < textMeshPros.Length; i++)
{
undoObjects[i + damageNumbers.Length] = textMeshPros[i];
}
Undo.RecordObjects(undoObjects, "Applied the [" + preset.name + "] " + category + " Preset.");
}
else
{
Object[] undoObjects = new Object[damageNumbers.Length * 3];
for (int i = 0; i < damageNumbers.Length; i += 3)
{
undoObjects[i] = damageNumbers[i];
undoObjects[i + 1] = damageNumbers[i].GetTextMeshs()[0];
undoObjects[i + 2] = damageNumbers[i].GetTextMeshs()[1];
}
Undo.RecordObjects(undoObjects, "Applied the [" + preset.name + "] " + category + " Preset.");
}
foreach(DamageNumber dn in damageNumbers)
{
preset.Apply(dn);
}
foreach(DamageNumber dn in damageNumbers)
{
dn.UpdateText();
}
}
// Reenable GUI
GUI.enabled = true;
}
GUI.enabled = false;
GUI.color = new Color(0, 0, 0, 0);
int modulo = currentCount % buttonsPerRow;
if(modulo > 0)
{
for (int n = 0; n < buttonsPerRow - modulo; n++)
{
GUILayout.Button("- - - - -");
}
}
GUI.color = Color.white;
GUI.enabled = true;
EditorGUILayout.EndHorizontal();
}
#endregion
#region Structure
public static bool CheckStructure(DamageNumberEditor damageNumberEditor)
{
// Type
bool isMesh = damageNumbers[0].IsMesh(); ;
// Check if structure is flawed
bool isStructureFlawed = false;
bool isOutdated = false;
if(isMesh)
{
for (int n = 0; n < damageNumbers.Length; n++)
{
DamageNumber dn = damageNumbers[n];
TextMeshPro tmp = textMeshPros[n];
Transform meshA = meshAs[n];
Transform meshB = meshBs[n];
if (tmp == null || meshA == null || meshB == null)
{
isStructureFlawed = true;
if (dn.transform.Find("TextA") != null)
{
isOutdated = true;
}
break;
}
}
}
else
{
for (int n = 0; n < damageNumbers.Length; n++)
{
DamageNumber dn = damageNumbers[n];
if (dn.transform.Find("TMPA") == null || dn.transform.Find("TMPB") == null)
{
isStructureFlawed = true;
break;
}
}
}
// Create button to fix structure
if (isStructureFlawed)
{
// Start Box
StartBox(new Color(1, 1, 0.8f));
// Structure Build Button
GUI.color = new Color(1, 1, 0.8f);
if (GUILayout.Button(isOutdated ? "Upgrade Structure" : "Build Structure", GUILayout.Width(140)))
{
if(isMesh)
{
foreach (DamageNumber dn in damageNumbers)
{
PrepareMeshStructure(dn.gameObject);
}
}
else
{
foreach (DamageNumber dn in damageNumbers)
{
PrepareGUIStructure(dn.gameObject);
}
}
PrepareInspector(damageNumberEditor);
}
// Text
GUI.color = new Color(1, 1, 1, 0.7f);
if (isOutdated)
{
EditorGUILayout.LabelField("Version 4.0 has changed the structure of damage numbers.", labelStyle);
EditorGUILayout.LabelField("Click the button above to <b>upgrade</b> this damage number.", labelStyle);
}
else
{
EditorGUILayout.LabelField("Important components are missing.", labelStyle);
EditorGUILayout.LabelField("Click the button above to <b>prepare</b> this damage number.", labelStyle);
}
// Close Box
CloseBox(new Color(1, 1, 0.7f));
EditorGUILayout.Space();
return true;
}
else
{
return false;
}
}
public static void PrepareMeshStructure(GameObject go)
{
// Add Sorting Group
if (go.GetComponent<SortingGroup>() == null)
{
go.AddComponent<SortingGroup>().sortingOrder = 1000;
}
// Rename TextA to TMP
Transform textA = go.transform.Find("TextA");
if (textA != null)
{
textA.gameObject.name = "TMP";
}
// Destroy TextB
if (go.transform.Find("TextB"))
{
MonoBehaviour.DestroyImmediate(go.transform.Find("TextB").gameObject, true);
}
// Create TMP
if (go.transform.Find("TMP") == null)
{
NewTextMesh("TMP", go.transform);
}
// Create MeshA
if (go.transform.Find("MeshA") == null)
{
DamageNumber.NewMesh("MeshA", go.transform);
}
// Create MeshB
if (go.transform.Find("MeshB") == null)
{
DamageNumber.NewMesh("MeshB", go.transform);
}
// Undo
Undo.RegisterCreatedObjectUndo(go, "Create new Damage Number (Mesh).");
}
public static void PrepareGUIStructure(GameObject go)
{
// Create TMP
if (go.transform.Find("TMPA") == null)
{
NewTextGUI("TMPA", go.transform);
}
if (go.transform.Find("TMPB") == null)
{
NewTextGUI("TMPB", go.transform);
}
// Add Rect Component
if(go.GetComponent<RectTransform>() == null)
{
go.AddComponent<RectTransform>();
}
// Undo
Undo.RegisterCreatedObjectUndo(go, "Create new Damage Number (GUI).");
}
public static GameObject NewTextMesh(string tmName, Transform parent)
{
// GameObject
GameObject newTM = new GameObject();
newTM.name = tmName;
// TextMeshPro
TextMeshPro tmp = newTM.AddComponent<TextMeshPro>();
tmp.fontSize = 5;
tmp.verticalAlignment = VerticalAlignmentOptions.Middle;
tmp.horizontalAlignment = HorizontalAlignmentOptions.Center;
tmp.text = "1";
tmp.textWrappingMode = TextWrappingModes.NoWrap;
tmp.font = Resources.Load<DNPPreset>("DNP/Style/Basic/Basic Default").fontAsset;
// Size Delta
RectTransform rectTransform = tmp.GetComponent<RectTransform>();
if (rectTransform != null)
{
rectTransform.sizeDelta = new Vector2(4, 2);
}
// Transform
newTM.transform.SetParent(parent, true);
newTM.transform.localPosition = Vector3.zero;
newTM.transform.localScale = Vector3.one;
newTM.transform.localEulerAngles = Vector3.zero;
return newTM;
}
public static GameObject NewTextGUI(string tmName, Transform parent)
{
// GameObject
GameObject newTM = new GameObject();
newTM.name = tmName;
// TextMeshPro
TextMeshProUGUI tmp = newTM.AddComponent<TextMeshProUGUI>();
tmp.fontSize = 30;
tmp.verticalAlignment = VerticalAlignmentOptions.Middle;
tmp.horizontalAlignment = HorizontalAlignmentOptions.Center;
tmp.text = "1";
tmp.textWrappingMode = TextWrappingModes.NoWrap;
tmp.raycastTarget = false;
// Size Delta
RectTransform rectTransform = tmp.GetComponent<RectTransform>();
if (rectTransform != null)
{
rectTransform.sizeDelta = new Vector2(4, 2);
}
// Transform
newTM.transform.SetParent(parent, true);
newTM.transform.localPosition = Vector3.zero;
newTM.transform.localScale = Vector3.one;
newTM.transform.localEulerAngles = Vector3.zero;
return newTM;
}
public static void FixTextMeshPro()
{
bool destroyedSomething = false;
foreach (TextMeshPro textMesh in textMeshPros)
{
Transform tmp = textMesh.transform;
tmp.localPosition = Vector3.zero;
tmp.gameObject.SetActive(true);
for (int n = 0; n < tmp.childCount; n++)
{
DestroyOrDisable(tmp.GetChild(n).gameObject);
destroyedSomething = true;
}
tmp.gameObject.SetActive(false);
}
foreach(Transform meshA in meshAs)
{
for(int n = 0; n < meshA.childCount; n++)
{
Transform child = meshA.GetChild(n);
if(child.GetComponent<MeshRenderer>() != null)
{
destroyedSomething = true;
DestroyOrDisable(child.gameObject);
}
}
}
foreach (Transform meshB in meshBs)
{
for (int n = 0; n < meshB.childCount; n++)
{
Transform child = meshB.GetChild(n);
if (child.GetComponent<MeshRenderer>() != null)
{
destroyedSomething = true;
DestroyOrDisable(child.gameObject);
}
}
}
if(destroyedSomething)
{
foreach(DamageNumber dn in damageNumbers)
{
dn.GetReferences();
}
}
}
private static void DestroyOrDisable(GameObject go)
{
if (PrefabUtility.IsPartOfNonAssetPrefabInstance(go))
{
go.SetActive(false);
}
else
{
Object.DestroyImmediate(go);
}
}
#endregion
#region Miscellaneous
public static void BeginInspector()
{
EditorGUILayout.BeginHorizontal();
EditorGUILayout.BeginVertical();
}
public static void EndInspector()
{
EditorGUILayout.EndVertical();
EditorGUILayout.Space(2);
EditorGUILayout.EndHorizontal();
}
static void PrepareStyles()
{
if(generatedGUIStyles)
{
return;
}
// Label
labelStyle = new GUIStyle(GUI.skin.label);
labelStyle.richText = true;
// Button
buttonStyle = new GUIStyle(GUI.skin.button);
buttonStyle.richText = true;
buttonStyle.alignment = TextAnchor.MiddleCenter;
// Right Anchor
rightTextStyle = new GUIStyle(labelStyle);
rightTextStyle.alignment = TextAnchor.MiddleRight;
// Center Anchor
centerTextStyle = new GUIStyle(labelStyle);
centerTextStyle.alignment = TextAnchor.MiddleCenter;
// Bottom Right Anchor
bottomRightTextStyle = new GUIStyle(labelStyle);
bottomRightTextStyle.alignment = TextAnchor.LowerRight;
// Top Right Anchor
topRightTextStyle = new GUIStyle(labelStyle);
topRightTextStyle.alignment = TextAnchor.UpperRight;
// White Box
whiteBoxStyle = new GUIStyle(GUI.skin.box);
whiteBoxStyle.normal.background = whiteBoxStyle.onNormal.background = whiteBoxStyle.active.background =
whiteBoxStyle.onActive.background = whiteBoxStyle.focused.background = whiteBoxStyle.onFocused.background =
whiteBoxStyle.hover.background = whiteBoxStyle.onHover.background = whiteBoxTexture;
// Rich Everything
for(int n = 0; n < GUI.skin.customStyles.Length; n++)
{
if(GUI.skin.customStyles[n] != null)
{
GUI.skin.customStyles[n].richText = true;
}
}
// Finish
generatedGUIStyles = true;
}
public static bool HintButton(string category)
{
bool toggled = hints.Contains(category);
string buttonName = toggled ? "<size=8> </size><b>?</b>" : "?";
if (GUILayout.Button(buttonName, buttonStyle, GUILayout.Width(21)))
{
if (hints.Contains(category))
{
hints.Remove(category);
}
else
{
hints.Add(category);
}
toggled = !toggled;
}
if (toggled)
{
GUI.color = new Color(1, 1, 1, 0.8f);
GUI.Toolbar(GUILayoutUtility.GetLastRect(), 0, new string[] { buttonName }, buttonStyle);
GUI.color = new Color(1, 1, 1, 1f);
}
return toggled;
}
public static void RepaintInspector()
{
repaintViews = true;
GUI.FocusControl("");
}
public static bool EditingPrefabPreview(Object target)
{
return EditorUtility.IsPersistent(target) && PrefabStageUtility.GetCurrentPrefabStage() == null;
}
public static void OpenPrefabButton(Object target)
{
GUI.color = Color.white;
if (GUILayout.Button("Click here to open the prefab."))
{
try
{
PrefabStageUtility.OpenPrefab(AssetDatabase.GetAssetPath(target));
}
catch
{
EditorUtility.DisplayDialog("Something went wrong.", "Please open the prefab manually, by double-clicking it in the project window.", "Okay");
}
}
}
#endregion
#region Label Utility
public static void Lines()
{
GUI.color = new Color(1, 1, 1, 0.5f);
EditorGUILayout.LabelField(" ", GUILayout.Height(7f));
GUI.color = new Color(1, 1, 1, 1f);
}
public static void Label(string text)
{
EditorGUILayout.LabelField(text, labelStyle);
}
public static void ScalingLabel(string text, float scaleWidth)
{
int size = Mathf.FloorToInt(Mathf.Clamp(12 * Mathf.Pow(DNPEditorInternal.currentWidth / scaleWidth, 1.525f), 9, 12));
Label("<size=" + size + ">" + text + "</size>");
}
public static string CheckmarkString(bool state)
{
if(EditorGUIUtility.isProSkin)
{
return state ? "<size=15><b><color=#00FF00>✓</color></b></size>" : "<size=16><b><color=#FF0000>✗</color></b></size>";
}
else
{
return state ? "<size=15><b><color=#00BB00>✓</color></b></size>" : "<size=16><b><color=#BB0000>✗</color></b></size>";
}
}
#endregion
#region Box Utility
public static void StartBox(Color color, bool isActivated = true)
{
GUI.color = color;
StartBox(isActivated);
GUI.color = Color.white;
}
public static void StartBox(bool isActivated = true)
{
// Start Box
if (EditorGUIUtility.isProSkin)
{
if (isActivated)
{
GUI.backgroundColor = new Color(0.3f, 0.3f, 0.3f, 1);
}
else
{
GUI.backgroundColor = new Color(0.25f, 0.25f, 0.25f, 1);
}
}
else
{
if (isActivated)
{
GUI.backgroundColor = new Color(0.68f, 0.68f, 0.68f, 1);
}
else
{
GUI.backgroundColor = new Color(0.72f, 0.72f, 0.72f, 1);
}
}
GUILayout.BeginHorizontal(whiteBoxStyle);
GUILayout.Space(5);
GUILayout.BeginVertical();
GUILayout.Space(5);
GUI.backgroundColor = Color.white;
}
public static void CloseBox(Color color, bool isActivated = true)
{
GUI.color = color;
CloseBox(isActivated);
GUI.color = Color.white;
}
public static void CloseBox(bool isActivated = true)
{
GUILayout.Space(5);
EditorGUILayout.EndVertical();
GUILayout.Space(5);
EditorGUILayout.EndHorizontal();
Rect lastRect = GUILayoutUtility.GetLastRect();
lastRect.width -= 2;
BoxLastRect(isActivated);
}
static void BoxLastRect(bool isActivated = true)
{
Rect lastRect = GUILayoutUtility.GetLastRect();
BoxRect(lastRect, isActivated);
}
static void BoxRect(Rect targetRect, bool isActivated = true, bool withTop = true)
{
Rect leftBar = new Rect(targetRect);
leftBar.width = 3;
Rect rightBar = new Rect(targetRect);
rightBar.x += rightBar.width - 3;
rightBar.width = 3;
Rect topBar = new Rect(targetRect);
topBar.height = 3;
topBar.x += 3;
topBar.width -= 6;
Rect bottomBar = new Rect(targetRect);
bottomBar.y += bottomBar.height - 3;
bottomBar.height = 3;
bottomBar.x += 3;
bottomBar.width -= 6;
DrawOutlineBox(leftBar, isActivated);
DrawOutlineBox(rightBar, isActivated);
DrawOutlineBox(bottomBar, isActivated);
if (withTop)
{
DrawOutlineBox(topBar, isActivated);
}
DrawBox(leftBar, isActivated);
DrawBox(rightBar, isActivated);
DrawBox(bottomBar, isActivated);
if (withTop)
{
DrawBox(topBar, isActivated);
}
}
static void DrawBox(Rect rectPosition, bool isActivated = true)
{
Color boxColor = default;
if (EditorGUIUtility.isProSkin)
{
if (isActivated)
{
boxColor = new Color(0.66f, 0.66f, 0.66f, 1);
}
else
{
boxColor = new Color(0.38f, 0.38f, 0.38f, 1);
}
}
else
{
if (isActivated)
{
boxColor = new Color(0.55f, 0.55f, 0.55f, 1);
}
else
{
boxColor = new Color(0.67f, 0.67f, 0.67f, 1);
}
}
DrawBox(rectPosition, boxColor);
}
static void DrawBox(Rect rectPosition, Color boxColor)
{
GUI.backgroundColor = boxColor;
GUI.Box(rectPosition, "", whiteBoxStyle);
GUI.backgroundColor = Color.white;
}
static void DrawOutlineBox(Rect rectPosition, bool isActivated = true)
{
// Adjust Position
rectPosition.width += 2;
rectPosition.height += 2;
// Draw Box
if (EditorGUIUtility.isProSkin)
{
if (isActivated)
{
DrawBox(rectPosition, new Color(0.24f, 0.24f, 0.24f, 1));
}
else
{
DrawBox(rectPosition, new Color(0.21f, 0.21f, 0.21f, 1));
}
}
else
{
if (isActivated)
{
DrawBox(rectPosition, new Color(0.35f, 0.35f, 0.35f, 1));
}
else
{
DrawBox(rectPosition, new Color(0.5f, 0.5f, 0.5f, 1));
}
}
}
#endregion
}
}
#endif