From 014ecb0ae59e4517f278793217a1414e6746fdcf Mon Sep 17 00:00:00 2001 From: wsycarlos Date: Sun, 11 Jan 2026 21:44:32 +0800 Subject: [PATCH] Initial Version of Textmesh Pro Extension --- .gitignore | 106 + .../Editor Resources.meta | 8 + .../Editor Resources/Gizmos.meta | 8 + .../Gizmos/TMP - Text Component Icon.psd | Bin 0 -> 89826 bytes .../Gizmos/TMP - Text Component Icon.psd.meta | 140 + .../Editor.meta | 8 + .../Editor/TextMeshPro.Byway.Editor.asmdef | 20 + .../TextMeshPro.Byway.Editor.asmdef.meta | 7 + .../Editor/TextMeshProBywayUIInspector.cs | 161 + .../TextMeshProBywayUIInspector.cs.meta | 11 + .../Fonts & Materials.meta | 8 + .../Fonts & Materials/CN.asset | 41260 ++++++++++++++++ .../Fonts & Materials/CN.asset.meta | 8 + .../Fonts & Materials/Default.asset | 295 + .../Fonts & Materials/Default.asset.meta | 8 + .../Fonts & Materials/EN.asset | 2691 + .../Fonts & Materials/EN.asset.meta | 8 + .../Fonts & Materials/PO.asset | 3028 ++ .../Fonts & Materials/PO.asset.meta | 8 + .../Fonts & Materials/Source.meta | 8 + .../Source/MaokenAssortedSans.ttf | Bin 0 -> 12302296 bytes .../Source/MaokenAssortedSans.ttf.meta | 21 + .../Source/PoetsenOne-Regular.otf | Bin 0 -> 73272 bytes .../Source/PoetsenOne-Regular.otf.meta | 21 + .../Runtime.meta | 8 + .../Runtime/TextMeshPro.Byway.asmdef | 16 + .../Runtime/TextMeshPro.Byway.asmdef.meta | 7 + .../Runtime/TextMeshProBywayUI.cs | 194 + .../Runtime/TextMeshProBywayUI.cs.meta | 11 + .../TextMeshProBywayUIRuntimeHelper.cs | 86 + .../TextMeshProBywayUIRuntimeHelper.cs.meta | 11 + .../package.json | 9 + .../package.json.meta | 7 + Packages/manifest.json | 48 + Packages/packages-lock.json | 395 + ProjectSettings/AudioManager.asset | 19 + ProjectSettings/ClusterInputManager.asset | 6 + ProjectSettings/DynamicsManager.asset | 34 + ProjectSettings/EditorBuildSettings.asset | 8 + ProjectSettings/EditorSettings.asset | 30 + ProjectSettings/GraphicsSettings.asset | 63 + ProjectSettings/InputManager.asset | 295 + ProjectSettings/MemorySettings.asset | 35 + ProjectSettings/NavMeshAreas.asset | 91 + ProjectSettings/PackageManagerSettings.asset | 35 + .../Settings.json | 5 + ProjectSettings/Physics2DSettings.asset | 56 + ProjectSettings/PresetManager.asset | 7 + ProjectSettings/ProjectSettings.asset | 961 + ProjectSettings/ProjectVersion.txt | 2 + ProjectSettings/QualitySettings.asset | 234 + ProjectSettings/SceneTemplateSettings.json | 121 + ProjectSettings/TagManager.asset | 43 + ProjectSettings/TimeManager.asset | 9 + ProjectSettings/UnityConnectSettings.asset | 36 + ProjectSettings/VFXManager.asset | 12 + ProjectSettings/VersionControlSettings.asset | 8 + ProjectSettings/XRSettings.asset | 10 + 58 files changed, 50745 insertions(+) create mode 100644 .gitignore create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Editor Resources.meta create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Editor Resources/Gizmos.meta create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Editor Resources/Gizmos/TMP - Text Component Icon.psd create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Editor Resources/Gizmos/TMP - Text Component Icon.psd.meta create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Editor.meta create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Editor/TextMeshPro.Byway.Editor.asmdef create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Editor/TextMeshPro.Byway.Editor.asmdef.meta create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Editor/TextMeshProBywayUIInspector.cs create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Editor/TextMeshProBywayUIInspector.cs.meta create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Fonts & Materials.meta create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Fonts & Materials/CN.asset create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Fonts & Materials/CN.asset.meta create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Fonts & Materials/Default.asset create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Fonts & Materials/Default.asset.meta create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Fonts & Materials/EN.asset create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Fonts & Materials/EN.asset.meta create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Fonts & Materials/PO.asset create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Fonts & Materials/PO.asset.meta create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Fonts & Materials/Source.meta create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Fonts & Materials/Source/MaokenAssortedSans.ttf create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Fonts & Materials/Source/MaokenAssortedSans.ttf.meta create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Fonts & Materials/Source/PoetsenOne-Regular.otf create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Fonts & Materials/Source/PoetsenOne-Regular.otf.meta create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Runtime.meta create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Runtime/TextMeshPro.Byway.asmdef create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Runtime/TextMeshPro.Byway.asmdef.meta create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Runtime/TextMeshProBywayUI.cs create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Runtime/TextMeshProBywayUI.cs.meta create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Runtime/TextMeshProBywayUIRuntimeHelper.cs create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/Runtime/TextMeshProBywayUIRuntimeHelper.cs.meta create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/package.json create mode 100644 Packages/com.bywaystudios.textmeshpro.ext/package.json.meta create mode 100644 Packages/manifest.json create mode 100644 Packages/packages-lock.json create mode 100644 ProjectSettings/AudioManager.asset create mode 100644 ProjectSettings/ClusterInputManager.asset create mode 100644 ProjectSettings/DynamicsManager.asset create mode 100644 ProjectSettings/EditorBuildSettings.asset create mode 100644 ProjectSettings/EditorSettings.asset create mode 100644 ProjectSettings/GraphicsSettings.asset create mode 100644 ProjectSettings/InputManager.asset create mode 100644 ProjectSettings/MemorySettings.asset create mode 100644 ProjectSettings/NavMeshAreas.asset create mode 100644 ProjectSettings/PackageManagerSettings.asset create mode 100644 ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json create mode 100644 ProjectSettings/Physics2DSettings.asset create mode 100644 ProjectSettings/PresetManager.asset create mode 100644 ProjectSettings/ProjectSettings.asset create mode 100644 ProjectSettings/ProjectVersion.txt create mode 100644 ProjectSettings/QualitySettings.asset create mode 100644 ProjectSettings/SceneTemplateSettings.json create mode 100644 ProjectSettings/TagManager.asset create mode 100644 ProjectSettings/TimeManager.asset create mode 100644 ProjectSettings/UnityConnectSettings.asset create mode 100644 ProjectSettings/VFXManager.asset create mode 100644 ProjectSettings/VersionControlSettings.asset create mode 100644 ProjectSettings/XRSettings.asset diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ff03d40 --- /dev/null +++ b/.gitignore @@ -0,0 +1,106 @@ +# This .gitignore file should be placed at the root of your Unity project directory +# +# Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore +# +.utmp/ +/[Ll]ibrary/ +/[Tt]emp/ +/[Oo]bj/ +/[Bb]uild/ +/[Bb]uilds/ +/[Ll]ogs/ +/[Uu]ser[Ss]ettings/ +*.log + +# By default unity supports Blender asset imports, *.blend1 blender files do not need to be commited to version control. +*.blend1 +*.blend1.meta + +# MemoryCaptures can get excessive in size. +# They also could contain extremely sensitive data +/[Mm]emoryCaptures/ + +# Recordings can get excessive in size +/[Rr]ecordings/ + +# Uncomment this line if you wish to ignore the asset store tools plugin +# /[Aa]ssets/AssetStoreTools* + +# Autogenerated Jetbrains Rider plugin +/[Aa]ssets/Plugins/Editor/JetBrains* +# Jetbrains Rider personal-layer settings +*.DotSettings.user + +# Visual Studio cache directory +.vs/ + +# Gradle cache directory +.gradle/ + +# Autogenerated VS/MD/Consulo solution and project files +ExportedObj/ +.consulo/ +*.csproj +*.unityproj +*.sln +*.suo +*.tmp +*.user +*.userprefs +*.pidb +*.booproj +*.svd +*.pdb +*.mdb +*.opendb +*.VC.db + +# Unity3D generated meta files +*.pidb.meta +*.pdb.meta +*.mdb.meta + +# Unity3D generated file on crash reports +sysinfo.txt + +# Mono auto generated files +mono_crash.* + +# Builds +*.apk +*.aab +*.unitypackage +*.unitypackage.meta + +# Crashlytics generated file +crashlytics-build.properties + +# TestRunner generated files +InitTestScene*.unity* + +# Addressables default ignores, before user customizations +/ServerData +/[Aa]ssets/StreamingAssets/aa* +/[Aa]ssets/AddressableAssetsData/link.xml* +/[Aa]ssets/Addressables_Temp* +# By default, Addressables content builds will generate addressables_content_state.bin +# files in platform-specific subfolders, for example: +# /Assets/AddressableAssetsData/OSX/addressables_content_state.bin +/[Aa]ssets/AddressableAssetsData/*/*.bin* + +# Visual Scripting auto-generated files +/[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Flow/UnitOptions.db +/[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Flow/UnitOptions.db.meta +/[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Core/Property Providers +/[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Core/Property Providers.meta + +# Auto-generated scenes by play mode tests +/[Aa]ssets/[Ii]nit[Tt]est[Ss]cene*.unity* + +.vsconfig + +Logs/ +[Aa]ssets/ +[Pp]ublish/ +.vscode/settings.json +*.dat \ No newline at end of file diff --git a/Packages/com.bywaystudios.textmeshpro.ext/Editor Resources.meta b/Packages/com.bywaystudios.textmeshpro.ext/Editor Resources.meta new file mode 100644 index 0000000..9294694 --- /dev/null +++ b/Packages/com.bywaystudios.textmeshpro.ext/Editor Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 80d5d45340562d1408069ec6dec1439e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.bywaystudios.textmeshpro.ext/Editor Resources/Gizmos.meta b/Packages/com.bywaystudios.textmeshpro.ext/Editor Resources/Gizmos.meta new file mode 100644 index 0000000..755bd76 --- /dev/null +++ b/Packages/com.bywaystudios.textmeshpro.ext/Editor Resources/Gizmos.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f3f9d42a43b798f4d8c8b4a736aa4a5b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.bywaystudios.textmeshpro.ext/Editor Resources/Gizmos/TMP - Text Component Icon.psd b/Packages/com.bywaystudios.textmeshpro.ext/Editor Resources/Gizmos/TMP - Text Component Icon.psd new file mode 100644 index 0000000000000000000000000000000000000000..3cc41630a761fd8ff6f789a03b443350be9970c4 GIT binary patch literal 89826 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 LwR(Acqmuj|^O?dr literal 0 HcmV?d00001 diff --git a/Packages/com.bywaystudios.textmeshpro.ext/Editor Resources/Gizmos/TMP - Text Component Icon.psd.meta b/Packages/com.bywaystudios.textmeshpro.ext/Editor Resources/Gizmos/TMP - Text Component Icon.psd.meta new file mode 100644 index 0000000..4eac6ea --- /dev/null +++ b/Packages/com.bywaystudios.textmeshpro.ext/Editor Resources/Gizmos/TMP - Text Component Icon.psd.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 86c8fd0881466f24ea8af0460b86fb88 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 128 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.bywaystudios.textmeshpro.ext/Editor.meta b/Packages/com.bywaystudios.textmeshpro.ext/Editor.meta new file mode 100644 index 0000000..ba5bb18 --- /dev/null +++ b/Packages/com.bywaystudios.textmeshpro.ext/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d02e84ef0c00e38469ead73e03993d9c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.bywaystudios.textmeshpro.ext/Editor/TextMeshPro.Byway.Editor.asmdef b/Packages/com.bywaystudios.textmeshpro.ext/Editor/TextMeshPro.Byway.Editor.asmdef new file mode 100644 index 0000000..ef096f7 --- /dev/null +++ b/Packages/com.bywaystudios.textmeshpro.ext/Editor/TextMeshPro.Byway.Editor.asmdef @@ -0,0 +1,20 @@ +{ + "name": "TextMeshPro.Byway.Editor", + "rootNamespace": "", + "references": [ + "TextMeshPro.Byway", + "Unity.TextMeshPro.Editor", + "Unity.TextMeshPro" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/com.bywaystudios.textmeshpro.ext/Editor/TextMeshPro.Byway.Editor.asmdef.meta b/Packages/com.bywaystudios.textmeshpro.ext/Editor/TextMeshPro.Byway.Editor.asmdef.meta new file mode 100644 index 0000000..fdf6a8f --- /dev/null +++ b/Packages/com.bywaystudios.textmeshpro.ext/Editor/TextMeshPro.Byway.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8699fe47a17306541be9885639baedad +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/com.bywaystudios.textmeshpro.ext/Editor/TextMeshProBywayUIInspector.cs b/Packages/com.bywaystudios.textmeshpro.ext/Editor/TextMeshProBywayUIInspector.cs new file mode 100644 index 0000000..31a9b48 --- /dev/null +++ b/Packages/com.bywaystudios.textmeshpro.ext/Editor/TextMeshProBywayUIInspector.cs @@ -0,0 +1,161 @@ +using TMPro; +using TMPro.EditorUtilities; +using UnityEditor; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +namespace Byway.TMP +{ + [CustomEditor(typeof(TextMeshProBywayUI))] + public class TextMeshProBywayUIInspector : TMP_EditorPanelUI + { + static readonly GUIContent k_HasOutlineLabel = new GUIContent("Outline", "Should the text Contains the outline."); + static readonly GUIContent k_OutlineColorLabel = new GUIContent("Outline Color", "The outline color of the text."); + static readonly GUIContent k_OutlineWidthLabel = new GUIContent("Outline Width", "The outline width of the text."); + static readonly GUIContent k_HasUnderlayLabel = new GUIContent("Underlay", "Should the text Contains the underlay."); + static readonly GUIContent k_UnderlayColorLabel = new GUIContent("Underlay Color", "The underlay color of the text."); + static readonly GUIContent k_UnderlayOffsetXLabel = new GUIContent("Underlay Offset X", "The underlay offset X of the text."); + static readonly GUIContent k_UnderlayOffsetYLabel = new GUIContent("Underlay Offset Y", "The underlay offset Y of the text."); + + protected SerializedProperty m_FontHasOutlineProp; + protected SerializedProperty m_FontOutlineColorProp; + protected SerializedProperty m_FontOutlineWidthProp; + protected SerializedProperty m_FontHasUnderlayProp; + protected SerializedProperty m_FontUnderlayColorProp; + protected SerializedProperty m_FontUnderlayOffsetXProp; + protected SerializedProperty m_FontUnderlayOffsetYProp; + + protected override void OnEnable() + { + m_FontHasOutlineProp = serializedObject.FindProperty("m_OverrideHasOutline"); + m_FontOutlineColorProp = serializedObject.FindProperty("m_OverrideOutlineColor"); + m_FontOutlineWidthProp = serializedObject.FindProperty("m_OverrideOutlineWidth"); + m_FontHasUnderlayProp = serializedObject.FindProperty("m_OverrideHasUnderlay"); + m_FontUnderlayColorProp = serializedObject.FindProperty("m_OverrideUnderlayColor"); + m_FontUnderlayOffsetXProp = serializedObject.FindProperty("m_OverrideUnderlayOffsetX"); + m_FontUnderlayOffsetYProp = serializedObject.FindProperty("m_OverrideUnderlayOffsetY"); + + base.OnEnable(); + } + + protected override void DrawExtraSettings() + { + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.PropertyField(m_FontHasOutlineProp, k_HasOutlineLabel); + + if (m_FontHasOutlineProp.boolValue) + { + EditorGUI.indentLevel += 1; + + EditorGUILayout.PropertyField(m_FontOutlineColorProp, k_OutlineColorLabel); + + EditorGUILayout.PropertyField(m_FontOutlineWidthProp, k_OutlineWidthLabel); + + EditorGUI.indentLevel -= 1; + } + + EditorGUILayout.PropertyField(m_FontHasUnderlayProp, k_HasUnderlayLabel); + + if (m_FontHasUnderlayProp.boolValue) + { + EditorGUI.indentLevel += 1; + + EditorGUILayout.PropertyField(m_FontUnderlayColorProp, k_UnderlayColorLabel); + + EditorGUILayout.PropertyField(m_FontUnderlayOffsetXProp, k_UnderlayOffsetXLabel); + + EditorGUILayout.PropertyField(m_FontUnderlayOffsetYProp, k_UnderlayOffsetYLabel); + + EditorGUI.indentLevel -= 1; + } + + if (EditorGUI.EndChangeCheck()) + { + serializedObject.ApplyModifiedProperties(); + (target as TextMeshProBywayUI).NotifyHelper(); + } + + base.DrawExtraSettings(); + } + + [MenuItem("GameObject/UI/Text - Textmesh Pro - Byway", false, 30)] + private static void CreateTextmeshProByway(MenuCommand command) + { + + // Check if there is a Canvas in the scene + Canvas canvas = Object.FindObjectOfType(); + if (canvas == null) + { + // Create new Canvas since none exists in the scene. + GameObject canvasObject = new GameObject("Canvas"); + canvas = canvasObject.AddComponent(); + canvas.renderMode = RenderMode.ScreenSpaceOverlay; + + // Add a Graphic Raycaster Component as well + canvas.gameObject.AddComponent(); + + Undo.RegisterCreatedObjectUndo(canvasObject, "Create " + canvasObject.name); + } + + GameObject go = new GameObject("Text(Byway)"); + RectTransform goRectTransform = go.AddComponent(); + + Undo.RegisterCreatedObjectUndo((Object)go, "Create " + go.name); + + // Check if object is being create with left or right click + GameObject contextObject = command.context as GameObject; + if (contextObject == null) + { + GameObjectUtility.SetParentAndAlign(go, canvas.gameObject); + + TextMeshProUGUI textMeshPro = go.AddComponent(); + go.AddComponent(); + textMeshPro.text = "New Text"; + textMeshPro.alignment = TextAlignmentOptions.TopLeft; + } + else + { + if (contextObject.GetComponent