using System; using System.IO; using System.Linq; using System.Text; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; using UnityEngine.UI; using Object = UnityEngine.Object; namespace MPUIKIT.Editor { public static class MPEditorUtility { [MenuItem("GameObject/UI/MPImage")] public static void AddMPImageObject() { GameObject g = new GameObject {name = "MPImage"}; Transform parent = GetParentTransform(); g.transform.SetParent(parent, false); g.AddComponent(); Selection.activeGameObject = g; Undo.RegisterCreatedObjectUndo(g, "MPImage Created"); EditorUtility.SetDirty(g); } [MenuItem("GameObject/UI/MPImage Basic")] public static void AddMPImageBasicObject() { GameObject g = new GameObject {name = "MPImageBasic"}; Transform parent = GetParentTransform(); g.transform.SetParent(parent, false); g.AddComponent(); Selection.activeGameObject = g; Undo.RegisterCreatedObjectUndo(g, "MPImage Basic Created"); EditorUtility.SetDirty(g); } private static Transform GetParentTransform() { Transform parent; if (Selection.activeGameObject != null && Selection.activeGameObject.GetComponentInParent() != null) { parent = Selection.activeGameObject.transform; } else { Canvas c = GetCanvas(); AddAdditionalShaderChannelsToCanvas(c); parent = c.transform; } return parent; } private static Canvas GetCanvas() { StageHandle handle = StageUtility.GetCurrentStageHandle(); if (!handle.FindComponentOfType()) { EditorApplication.ExecuteMenuItem("GameObject/UI/Canvas"); } Canvas c = handle.FindComponentOfType(); return c; } [MenuItem("CONTEXT/Image/Replace with MPImage")] public static void ReplaceWithMPImage(MenuCommand command) { if(command.context is MPImage) return; if (command.context is MPImageBasic) { // Convert MPImageBasic to MPImage MPImageBasic img = (MPImageBasic) command.context; GameObject obj = img.gameObject; Object.DestroyImmediate(img); obj.AddComponent(); EditorUtility.SetDirty(obj); } else { Image img = (Image) command.context; GameObject obj = img.gameObject; Object.DestroyImmediate(img); obj.AddComponent(); EditorUtility.SetDirty(obj); } } [MenuItem("CONTEXT/Image/Replace with MPImage Basic")] public static void ReplaceWithMPImageBasic(MenuCommand command) { if(command.context is MPImageBasic) return; if (command.context is MPImage) { // Convert MPImage to MPImageBasic MPImage img = (MPImage) command.context; GameObject obj = img.gameObject; Object.DestroyImmediate(img); obj.AddComponent(); EditorUtility.SetDirty(obj); } else { Image img = (Image) command.context; GameObject obj = img.gameObject; Object.DestroyImmediate(img); obj.AddComponent(); EditorUtility.SetDirty(obj); } } internal static void AddAdditionalShaderChannelsToCanvas(Canvas c) { AdditionalCanvasShaderChannels additionalShaderChannels = c.additionalShaderChannels; additionalShaderChannels |= AdditionalCanvasShaderChannels.TexCoord1; additionalShaderChannels |= AdditionalCanvasShaderChannels.TexCoord2; c.additionalShaderChannels = additionalShaderChannels; } internal static bool HasAdditionalShaderChannels(Canvas c) { AdditionalCanvasShaderChannels asc = c.additionalShaderChannels; return (asc & AdditionalCanvasShaderChannels.TexCoord1) != 0 && (asc & AdditionalCanvasShaderChannels.TexCoord2) != 0; } public static void CornerRadiusModeGUI(Rect rect, ref SerializedProperty property, string[] toolBarHeading, string label = "Corner Radius") { bool boolVal = property.boolValue; Rect labelRect = new Rect(rect.x, rect.y, EditorGUIUtility.labelWidth, rect.height); Rect toolBarRect = new Rect(rect.x + EditorGUIUtility.labelWidth, rect.y, rect.width - EditorGUIUtility.labelWidth, rect.height); EditorGUI.BeginChangeCheck(); { EditorGUI.showMixedValue = property.hasMultipleDifferentValues; EditorGUI.LabelField(labelRect, label); boolVal = GUI.Toolbar(toolBarRect, boolVal ? 1 : 0, toolBarHeading) == 1; EditorGUI.showMixedValue = false; } if (EditorGUI.EndChangeCheck()) { property.boolValue = boolVal; } } private static Sprite _emptySprite; internal static Sprite EmptySprite { get { if (_emptySprite == null) { _emptySprite = Resources.Load("mpui_default_empty_sprite"); } return _emptySprite; } } internal static string FindMPUIKitRootDirectory() { string guid = AssetDatabase.FindAssets("MPImage t:Shader").FirstOrDefault(); string path = AssetDatabase.GUIDToAssetPath(guid); if(string.IsNullOrEmpty(path)) return String.Empty; string[] directories = path.Split(new[] {Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar}); StringBuilder sb = new StringBuilder(); for (int i = 0; i < directories.Length; i++) { sb.Append(directories[i]); sb.Append(Path.DirectorySeparatorChar); if(directories[i].Equals("MPUIKit", StringComparison.OrdinalIgnoreCase)) break; } return sb.ToString(); } } }