Last active
January 9, 2021 06:30
-
-
Save esperecyan/c62b5dbb06e7b70383dd255bf106a2e2 to your computer and use it in GitHub Desktop.
『ReplaceToTextMeshPro.cs』VCI用にTextコンポートをTextMeshProコンポーネントへ簡易的に置き換えます。シーン内のオブジェクトを選択してからコンテキストメニューの UnityEditorScripts メニュー内から使用できます。 https://pokemori.booth.pm/items/2662865
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Linq; | |
using System.Text.RegularExpressions; | |
using UnityEngine; | |
using UnityEngine.UI; | |
using UnityEditor; | |
using TMPro; | |
namespace Esperecyan.Unity.ReplaceToTextMeshPro | |
{ | |
/// <summary> | |
/// VCI用にTextコンポートをTextMeshProコンポーネントへ簡易的に置き換えます。 | |
/// </summary> | |
/// <remarks> | |
/// 動作確認バージョン: Unity 2018.4.20f1, TextMesh Pro 1.4.1 | |
/// SPDX-License-Identifier: MPL-2.0 | |
/// (Mozilla Public License 2.0) <https://spdx.org/licenses/MPL-2.0.html> | |
/// Author: 100の人 | |
/// 配布元: <https://gist.github.com/esperecyan/> | |
/// </remarks> | |
public class ReplaceToTextMeshPro | |
{ | |
/// <summary> | |
/// VCIで使用される「Assets/Fonts/NotoSansCJK-Bold_SDF.asset」のGUID。 | |
/// </summary> | |
/// <remarks> | |
/// フォントに関して | VCI Text (TextMeshPro) | バーチャルキャスト公式Wiki | |
/// https://virtualcast.jp/wiki/doku.php?id=vci:sdk:text:introduction#%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6 | |
/// </remarks> | |
private static readonly string VCIFontAssetGUID = "9da32abc4280dd3488ba8ae9c73d2fcc"; | |
/// <summary> | |
/// 追加するメニューアイテムの、「UnityEditorScripts」メニュー内の位置。 | |
/// </summary> | |
private const int Priority = 22; | |
[MenuItem("GameObject/UnityEditorScripts/オブジェクト内のTextコンポーネントをText Mesh Proへ置換する", false, ReplaceToTextMeshPro.Priority)] | |
private static void Replace() | |
{ | |
var font = AssetDatabase | |
.LoadAssetAtPath<TMP_FontAsset>(AssetDatabase.GUIDToAssetPath(ReplaceToTextMeshPro.VCIFontAssetGUID)); | |
foreach (var text | |
in Selection.transforms.SelectMany(transform => transform.GetComponentsInChildren<Text>(true))) | |
{ | |
var tmpText = Object.Instantiate(text); | |
var gameObject = text.gameObject; | |
Undo.DestroyObjectImmediate(text); | |
var textMeshPro = Undo.AddComponent<TextMeshPro>(gameObject); | |
try | |
{ | |
textMeshPro.font = font; | |
} | |
catch (System.NullReferenceException) | |
{ | |
// 原因不明の例外を抑制 | |
} | |
textMeshPro.text = tmpText.text; | |
textMeshPro.fontStyle = ReplaceToTextMeshPro.ToFontStyles(tmpText.fontStyle); | |
textMeshPro.enableAutoSizing = tmpText.resizeTextForBestFit; | |
textMeshPro.color = tmpText.color; | |
textMeshPro.alignment = ReplaceToTextMeshPro.ToTextAlignmentOptions(tmpText.alignment); | |
textMeshPro.enableWordWrapping = tmpText.horizontalOverflow == HorizontalWrapMode.Wrap; | |
textMeshPro.richText = tmpText.supportRichText; | |
// 拡大/縮小のリセット | |
var globalScaleX = gameObject.transform.lossyScale.x; | |
gameObject.transform.localScale = new Vector3(1 / globalScaleX, 1 / globalScaleX, 1 / globalScaleX); | |
textMeshPro.rectTransform.sizeDelta = tmpText.rectTransform.sizeDelta * globalScaleX; | |
textMeshPro.fontSize = 1; | |
if (textMeshPro.richText) | |
{ | |
textMeshPro.text = Regex.Replace(textMeshPro.text, "<size=[0-9]+>", "<size=1>"); | |
} | |
EditorUtility.SetDirty(textMeshPro); | |
Object.DestroyImmediate(tmpText.gameObject); | |
} | |
} | |
private static FontStyles ToFontStyles(FontStyle fontStyle) | |
{ | |
switch (fontStyle) | |
{ | |
case FontStyle.Bold: | |
return FontStyles.Bold; | |
case FontStyle.Italic: | |
return FontStyles.Italic; | |
case FontStyle.BoldAndItalic: | |
return FontStyles.Bold | FontStyles.Italic; | |
default: | |
return FontStyles.Normal; | |
} | |
} | |
private static TextAlignmentOptions ToTextAlignmentOptions(TextAnchor textAnchor) | |
{ | |
switch (textAnchor) | |
{ | |
case TextAnchor.UpperCenter: | |
return TextAlignmentOptions.Top; | |
case TextAnchor.UpperRight: | |
return TextAlignmentOptions.TopRight; | |
case TextAnchor.MiddleLeft: | |
return TextAlignmentOptions.MidlineLeft; | |
case TextAnchor.MiddleCenter: | |
return TextAlignmentOptions.Midline; | |
case TextAnchor.MiddleRight: | |
return TextAlignmentOptions.MidlineRight; | |
case TextAnchor.LowerLeft: | |
return TextAlignmentOptions.BottomLeft; | |
case TextAnchor.LowerCenter: | |
return TextAlignmentOptions.Bottom; | |
case TextAnchor.LowerRight: | |
return TextAlignmentOptions.BottomRight; | |
default: | |
return TextAlignmentOptions.TopLeft; | |
} | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
fileFormatVersion: 2 | |
guid: 54b1487a6e22dc1438bf5447afc5aa41 | |
MonoImporter: | |
externalObjects: {} | |
serializedVersion: 2 | |
defaultReferences: [] | |
executionOrder: 0 | |
icon: {instanceID: 0} | |
userData: | |
assetBundleName: | |
assetBundleVariant: |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment