「Unity/EditorWindow/TextMeshProUGUIのAutoSizeをonに変更」の版間の差分
提供: 初心者エンジニアの簡易メモ
(ページの作成:「==TextMeshProUGUIのAutoSizeをonに変更するツール== <pre> using UnityEditor; using UnityEngine; using UnityEditor.SceneManagement; using UnityEngine.SceneManageme...」) |
(→TextMeshProUGUIのAutoSizeをonに変更するツール) |
||
(同じ利用者による、間の2版が非表示) | |||
行1: | 行1: | ||
==TextMeshProUGUIのAutoSizeをonに変更するツール== | ==TextMeshProUGUIのAutoSizeをonに変更するツール== | ||
+ | 全てのシーンとPrefabについて、TextMeshProUGUIのAutoSizeをonに変更するツールで、 | ||
+ | 現在のFontSizeをMaxサイズにし、Maxの1/10をMinサイズとする。Minは整数化する。 | ||
+ | |||
<pre> | <pre> | ||
using UnityEditor; | using UnityEditor; | ||
行10: | 行13: | ||
public class ReplaceTextAutoSize : EditorWindow | public class ReplaceTextAutoSize : EditorWindow | ||
{ | { | ||
− | private string | + | private string directoryPathScenes = "Assets/Scenes"; // シーンのデフォルトパス |
+ | private string directoryPathPrefabs = "Assets/Prefabs"; // プレハブのデフォルトパス | ||
+ | private bool processScenes = true; // シーン処理のチェックボックス | ||
+ | private bool processPrefabs = true; // プレハブ処理のチェックボックス | ||
[MenuItem("Tools/AutoSize TextMeshProUGUI")] | [MenuItem("Tools/AutoSize TextMeshProUGUI")] | ||
行21: | 行27: | ||
{ | { | ||
GUILayout.Label("Directory Settings", EditorStyles.boldLabel); | GUILayout.Label("Directory Settings", EditorStyles.boldLabel); | ||
− | |||
− | + | // シーンのパス入力とチェックボックス | |
+ | processScenes = EditorGUILayout.Toggle("Process Scenes", processScenes); | ||
+ | if (processScenes) | ||
{ | { | ||
− | + | directoryPathScenes = EditorGUILayout.TextField("Scenes Directory Path", directoryPathScenes); | |
+ | } | ||
+ | |||
+ | // プレハブのパス入力とチェックボックス | ||
+ | processPrefabs = EditorGUILayout.Toggle("Process Prefabs", processPrefabs); | ||
+ | if (processPrefabs) | ||
+ | { | ||
+ | directoryPathPrefabs = EditorGUILayout.TextField("Prefabs Directory Path", directoryPathPrefabs); | ||
+ | } | ||
+ | |||
+ | if (GUILayout.Button("Enable AutoSize in Selected Items")) | ||
+ | { | ||
+ | EnableAutoSizeInScenesAndPrefabs(); | ||
} | } | ||
} | } | ||
− | private void | + | private void EnableAutoSizeInScenesAndPrefabs() |
{ | { | ||
− | if (string.IsNullOrEmpty( | + | if (processScenes && string.IsNullOrEmpty(directoryPathScenes)) |
{ | { | ||
− | Debug.LogError("Please specify the directory path."); | + | Debug.LogError("Please specify the scenes directory path."); |
+ | return; | ||
+ | } | ||
+ | |||
+ | if (processPrefabs && string.IsNullOrEmpty(directoryPathPrefabs)) | ||
+ | { | ||
+ | Debug.LogError("Please specify the prefabs directory path."); | ||
return; | return; | ||
} | } | ||
行46: | 行71: | ||
} | } | ||
+ | // シーンの処理 | ||
+ | if (processScenes) | ||
+ | { | ||
+ | ProcessScenes(); | ||
+ | } | ||
+ | |||
+ | // プレハブの処理 | ||
+ | if (processPrefabs) | ||
+ | { | ||
+ | ProcessPrefabs(); | ||
+ | } | ||
+ | |||
+ | // 最後に元のシーンを再度開く | ||
+ | if (!string.IsNullOrEmpty(currentScenePath)) | ||
+ | { | ||
+ | EditorSceneManager.OpenScene(currentScenePath); | ||
+ | } | ||
+ | |||
+ | Debug.Log("Finished enabling AutoSize for TextMeshProUGUI in all selected items."); | ||
+ | } | ||
+ | |||
+ | private void ProcessScenes() | ||
+ | { | ||
// ディレクトリ内のすべてのシーンファイルを取得 | // ディレクトリ内のすべてのシーンファイルを取得 | ||
− | string[] sceneFiles = Directory.GetFiles( | + | string[] sceneFiles = Directory.GetFiles(directoryPathScenes, "*.unity", SearchOption.AllDirectories); |
foreach (string scenePath in sceneFiles) | foreach (string scenePath in sceneFiles) | ||
行64: | 行112: | ||
foreach (var textMesh in textMeshObjects) | foreach (var textMesh in textMeshObjects) | ||
{ | { | ||
− | // AutoSize | + | // AutoSize が無効のときのみ処理 |
− | textMesh.enableAutoSizing = true; | + | if (!textMesh.enableAutoSizing) |
− | + | { | |
− | + | textMesh.enableAutoSizing = true; | |
− | + | textMesh.fontSizeMax = textMesh.fontSize; // 現在のフォントサイズを最大値に設定 | |
− | + | // 最小サイズを最大サイズの1/10に設定(整数に丸める) | |
+ | textMesh.fontSizeMin = Mathf.RoundToInt(textMesh.fontSizeMax / 10); | ||
+ | Debug.Log($"Enabled AutoSize on: {textMesh.gameObject.name} in scene: {scenePath} with max size: {textMesh.fontSizeMax} and min size: {textMesh.fontSizeMin}"); | ||
+ | } | ||
} | } | ||
行76: | 行127: | ||
EditorSceneManager.SaveScene(scene); | EditorSceneManager.SaveScene(scene); | ||
} | } | ||
+ | } | ||
− | // | + | private void ProcessPrefabs() |
− | + | { | |
+ | // ディレクトリ内のすべてのプレハブファイルを取得 | ||
+ | string[] prefabFiles = Directory.GetFiles(directoryPathPrefabs, "*.prefab", SearchOption.AllDirectories); | ||
+ | |||
+ | foreach (string prefabPath in prefabFiles) | ||
{ | { | ||
− | + | GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(prefabPath); | |
− | + | if (prefab == null) | |
+ | { | ||
+ | Debug.LogError($"Invalid prefab path: {prefabPath}"); | ||
+ | continue; | ||
+ | } | ||
− | + | // プレハブ内のすべての TextMeshProUGUI オブジェクトを探す | |
+ | TextMeshProUGUI[] textMeshObjects = prefab.GetComponentsInChildren<TextMeshProUGUI>(true); | ||
+ | |||
+ | foreach (var textMesh in textMeshObjects) | ||
+ | { | ||
+ | // AutoSize が無効のときのみ処理 | ||
+ | if (!textMesh.enableAutoSizing) | ||
+ | { | ||
+ | textMesh.enableAutoSizing = true; | ||
+ | textMesh.fontSizeMax = textMesh.fontSize; // 現在のフォントサイズを最大値に設定 | ||
+ | // 最小サイズを最大サイズの1/10に設定(整数に丸める) | ||
+ | textMesh.fontSizeMin = Mathf.RoundToInt(textMesh.fontSizeMax / 10); | ||
+ | Debug.Log($"Enabled AutoSize on: {textMesh.gameObject.name} in prefab: {prefabPath} with max size: {textMesh.fontSizeMax} and min size: {textMesh.fontSizeMin}"); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // プレハブを保存する | ||
+ | PrefabUtility.SavePrefabAsset(prefab); | ||
+ | } | ||
} | } | ||
} | } | ||
</pre> | </pre> |
2024年9月22日 (日) 09:24時点における最新版
TextMeshProUGUIのAutoSizeをonに変更するツール
全てのシーンとPrefabについて、TextMeshProUGUIのAutoSizeをonに変更するツールで、 現在のFontSizeをMaxサイズにし、Maxの1/10をMinサイズとする。Minは整数化する。
using UnityEditor; using UnityEngine; using UnityEditor.SceneManagement; using UnityEngine.SceneManagement; using TMPro; using System.IO; public class ReplaceTextAutoSize : EditorWindow { private string directoryPathScenes = "Assets/Scenes"; // シーンのデフォルトパス private string directoryPathPrefabs = "Assets/Prefabs"; // プレハブのデフォルトパス private bool processScenes = true; // シーン処理のチェックボックス private bool processPrefabs = true; // プレハブ処理のチェックボックス [MenuItem("Tools/AutoSize TextMeshProUGUI")] public static void ShowWindow() { GetWindow<ReplaceTextAutoSize>("AutoSize TextMeshProUGUI"); } private void OnGUI() { GUILayout.Label("Directory Settings", EditorStyles.boldLabel); // シーンのパス入力とチェックボックス processScenes = EditorGUILayout.Toggle("Process Scenes", processScenes); if (processScenes) { directoryPathScenes = EditorGUILayout.TextField("Scenes Directory Path", directoryPathScenes); } // プレハブのパス入力とチェックボックス processPrefabs = EditorGUILayout.Toggle("Process Prefabs", processPrefabs); if (processPrefabs) { directoryPathPrefabs = EditorGUILayout.TextField("Prefabs Directory Path", directoryPathPrefabs); } if (GUILayout.Button("Enable AutoSize in Selected Items")) { EnableAutoSizeInScenesAndPrefabs(); } } private void EnableAutoSizeInScenesAndPrefabs() { if (processScenes && string.IsNullOrEmpty(directoryPathScenes)) { Debug.LogError("Please specify the scenes directory path."); return; } if (processPrefabs && string.IsNullOrEmpty(directoryPathPrefabs)) { Debug.LogError("Please specify the prefabs directory path."); return; } // 現在のシーンを保存し、そのパスを記録 Scene currentScene = EditorSceneManager.GetActiveScene(); string currentScenePath = currentScene.path; if (currentScene.isDirty) { EditorSceneManager.SaveScene(currentScene); } // シーンの処理 if (processScenes) { ProcessScenes(); } // プレハブの処理 if (processPrefabs) { ProcessPrefabs(); } // 最後に元のシーンを再度開く if (!string.IsNullOrEmpty(currentScenePath)) { EditorSceneManager.OpenScene(currentScenePath); } Debug.Log("Finished enabling AutoSize for TextMeshProUGUI in all selected items."); } private void ProcessScenes() { // ディレクトリ内のすべてのシーンファイルを取得 string[] sceneFiles = Directory.GetFiles(directoryPathScenes, "*.unity", SearchOption.AllDirectories); foreach (string scenePath in sceneFiles) { // シーンを開く Scene scene = EditorSceneManager.OpenScene(scenePath); if (!scene.IsValid()) { Debug.LogError($"Invalid scene path: {scenePath}"); continue; } // シーン内のすべての TextMeshProUGUI オブジェクトを探す TextMeshProUGUI[] textMeshObjects = GameObject.FindObjectsOfType<TextMeshProUGUI>(); foreach (var textMesh in textMeshObjects) { // AutoSize が無効のときのみ処理 if (!textMesh.enableAutoSizing) { textMesh.enableAutoSizing = true; textMesh.fontSizeMax = textMesh.fontSize; // 現在のフォントサイズを最大値に設定 // 最小サイズを最大サイズの1/10に設定(整数に丸める) textMesh.fontSizeMin = Mathf.RoundToInt(textMesh.fontSizeMax / 10); Debug.Log($"Enabled AutoSize on: {textMesh.gameObject.name} in scene: {scenePath} with max size: {textMesh.fontSizeMax} and min size: {textMesh.fontSizeMin}"); } } // シーンをダーティーにして保存 EditorSceneManager.MarkSceneDirty(scene); EditorSceneManager.SaveScene(scene); } } private void ProcessPrefabs() { // ディレクトリ内のすべてのプレハブファイルを取得 string[] prefabFiles = Directory.GetFiles(directoryPathPrefabs, "*.prefab", SearchOption.AllDirectories); foreach (string prefabPath in prefabFiles) { GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(prefabPath); if (prefab == null) { Debug.LogError($"Invalid prefab path: {prefabPath}"); continue; } // プレハブ内のすべての TextMeshProUGUI オブジェクトを探す TextMeshProUGUI[] textMeshObjects = prefab.GetComponentsInChildren<TextMeshProUGUI>(true); foreach (var textMesh in textMeshObjects) { // AutoSize が無効のときのみ処理 if (!textMesh.enableAutoSizing) { textMesh.enableAutoSizing = true; textMesh.fontSizeMax = textMesh.fontSize; // 現在のフォントサイズを最大値に設定 // 最小サイズを最大サイズの1/10に設定(整数に丸める) textMesh.fontSizeMin = Mathf.RoundToInt(textMesh.fontSizeMax / 10); Debug.Log($"Enabled AutoSize on: {textMesh.gameObject.name} in prefab: {prefabPath} with max size: {textMesh.fontSizeMax} and min size: {textMesh.fontSizeMin}"); } } // プレハブを保存する PrefabUtility.SavePrefabAsset(prefab); } } }