본문 바로가기

[unity] UI 텍스트 폰트 일괄 교체하는 방법

앤디가이 2022. 6. 24.

Unity에서 Scene 내 모든 UI Text  및 TextMeshProUGUI Text의 폰트를 일괄 교체하는 방법에 대해 알아보자.

 

프로젝트 중에 디자이너의 요청에 따라, 메인 폰트가 변경되는 상황이 발생하였다.

물론 Scene에 들어가서 구성한 UI의 Text 컴포넌트를 찾아가며 하나씩 바꿔줄 수도 있지만, 만약 Scene과 UI 수량이 많다면, 상당히 귀찮은 작업이 아닐 수 없다!

 

자동화 개념을 생각하여 에디터클래스로 스크립트를 만들어 클릭 한 번으로 일괄 교체하는 방법에 대해 알아보자.

 

1. 폰트 교체용 EditorClass 제작

프로젝트 내 Editor 폴더를 만든 후 UITextFontSetter 클래스를 만들어 보자.

유니티에서 제공하는 Text의 경우 유니티의 기본 UGUI인 UIText가 있고, TextMeshPro를 통해서 제공되는 TextMeshProUGUI가 있다. 컴포넌트가 다르기 때문에, 이 두 가지를 모두 변경할 수 있도록 구성해야 한다.

스크립트 작성은 아래 코드와 같다.

using UnityEditor;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using TMPro;

namespace Modules.Util
{
    public class UITextFontSetter
    {
        //폰트 경로 설정.
        public const string PATH_FONT_UITEXT_JALNAN = "Assets/Fonts/Jalnan.ttf";
        public const string PATH_FONT_TEXTMESHPRO_JALNAN = "Assets/Fonts/Jalnan SDF.asset";

        [MenuItem("CustomMenu/ChangeUITextFont(현재 Scene 내 UIText 폰트를 Jalnan 폰트로 교체함)")]
        public static void ChangeFontInUIText()
        {
            GameObject[] rootObj = GetSceneRootObjects();

            for (int i = 0; i < rootObj.Length; i++)
            {
                GameObject gbj = (GameObject)rootObj[i] as GameObject;
                Component[] com = gbj.transform.GetComponentsInChildren(typeof(Text), true);
                foreach (Text txt in com)
                {
                    txt.font = AssetDatabase.LoadAssetAtPath<Font>(PATH_FONT_UITEXT_JALNAN);
                }
            }
        }

        [MenuItem("CustomMenu/ChangeTextMeshPro(현재 Scene 내 TextMeshProUGUI 폰트를 Jalnan 폰트로 교체함)")]
        public static void ChangeFontInTextMeshPro()
        { 
            GameObject[] rootObj = GetSceneRootObjects();

            for (int i = 0; i < rootObj.Length; i++)
            {
                GameObject gbj = (GameObject)rootObj[i] as GameObject;
                Component[] com = gbj.transform.GetComponentsInChildren(typeof(TextMeshProUGUI), true);
                foreach (TextMeshProUGUI txt in com)
                {
                    txt.font = AssetDatabase.LoadAssetAtPath<TMP_FontAsset>(PATH_FONT_TEXTMESHPRO_JALNAN);
                }
            }
        }

        /// <summary>
        /// 모든 최상위 Root의 GameObject를 받아옴.
        /// </summary>
        /// <returns></returns>
        private static GameObject[] GetSceneRootObjects()
        {
            Scene currentScene = SceneManager.GetActiveScene();

            return currentScene.GetRootGameObjects();
        }
    }
}

 

폰트 경로는 본인이 바꾸고 싶은 폰트의 경로를 지정해 주면 된다.

여기서는 Assets/Fonts/ 내에 Jalnan 폰트 교체로 세팅하였다.(본인이 사용하는 폰트 및 경로를 넣어주면 된다.)

 

ChangeFontInUIText() 함수는 유니티 기본 UGUI Text의 폰트를 변경하는 함수이며,

ChagneFontInTextMeshPro() 함수는 TextMeshProUGUI Text 폰트를 변경하는 함수이다.

 

폰트를 넣어주는 방식이 서로 다르니, 코드를 참고해보면 좋다.

 

 

2. 결과 화면

코드 컴파일 후 유니티 상단 메뉴에 보면 CustomMenu라는 항목이 생기고, 두가지 클릭 메뉴를 제공한다.

각 메뉴를 클릭하여 현재 Scene에 있는 모든 폰트를 교체해 볼 수 있다.

텍스트 폰트 교체 결과 영상

댓글