유니티

유니티 전체폰트 바꾸는 스크립트

작성자 정보

  • 마스터 작성
  • 작성일

컨텐츠 정보

본문

1.전체코드

using UnityEngine;

using UnityEngine.UI;

using UnityEditor;


public class FontManager : MonoBehaviour

{

    //싱글톤 패턴

    public static FontManager instance = null;


    //폰트 string 배열로 추가 하기 텍스트를 계속 추가하면 됨

    public string[] Fonts = {

        "Assets/Fonts/Ansungtangmyun-ESG.ttf",   //0.안성탕면ESG   

        "Assets/Fonts/BMHANNA_11yrs_ttf.ttf",    //1.BM한나

        "Assets/Fonts/ChosunCentennial_ttf.ttf", //2.조선센티널

        "Assets/Fonts/ChosunSm.TTF",             //3.조선SM

        "Assets/Fonts/CookieRun Black.ttf",      //4.쿠키런 블랙

        "Assets/Fonts/CookieRun Bold.ttf",       //5.쿠키런 볼드    

        "Assets/Fonts/CookieRun Regular.ttf",    //6.쿠키런 레쥴러

        "Assets/Fonts/Dovemayo_gothic.ttf",      //7.도베마요고딕

        "Assets/Fonts/Sejong hospital Bold.ttf", //8.세종호텔 볼드

        "Assets/Fonts/Sejong hospital Light.ttf" //9.세종호텔 라이트

    };

    public void Awake()

    {

        //싱글톤

        if (instance == null)

        {

            instance = this;

            DontDestroyOnLoad(this.gameObject);

        }

        else

        {

            if (instance != this)

            {

                Destroy(this.gameObject);

            }

        }

    }


    

    //모든 폰트 바꾸기

    public void ChangeAllFonts(int num)

    {

        var allTextObjects = Resources.FindObjectsOfTypeAll(typeof(Text));


        foreach (Text t in allTextObjects)

        {

            t.font = AssetDatabase.LoadAssetAtPath<Font>(Fonts[num]); 

        }

    }

}

 

 

2.코드 설명

2-1폰트 매니저에 있는 코드를 어디서든 접근 할 수 있게 싱글톤으로 생성, 및 싱글톤 awake로 깨우기

public static FontManager instance = null;

 

 public void Awake()

 {

     //싱글톤

     if (instance == null)

     {

         instance = this;

         DontDestroyOnLoad(this.gameObject);

     }

     else

     {

         if (instance != this)

         {

             Destroy(this.gameObject);

         }

     }

 }

2-2 폰트 매니저가 씬을 넘어가도 파괴되지 않도록 DontDestroyOnLoad를 설정함

 

DontDestroyOnLoad(this.gameObject);

 

2-3 폰트의 경로 값을 담을 string배열을 설정, 배열에 폰트를 추가하면 Fonts의 길이가 증가하여 원하는 만큼 담을 수 있다.

//폰트 string 배열로 추가 하기 텍스트를 계속 추가하면 됨

public string[] Fonts = {

    "Assets/Fonts/Ansungtangmyun-ESG.ttf",   //0.안성탕면ESG   

    "Assets/Fonts/BMHANNA_11yrs_ttf.ttf",    //1.BM한나

    "Assets/Fonts/ChosunCentennial_ttf.ttf", //2.조선센티널

    "Assets/Fonts/ChosunSm.TTF",             //3.조선SM

    "Assets/Fonts/CookieRun Black.ttf",      //4.쿠키런 블랙

    "Assets/Fonts/CookieRun Bold.ttf",       //5.쿠키런 볼드    

    "Assets/Fonts/CookieRun Regular.ttf",    //6.쿠키런 레쥴러

    "Assets/Fonts/Dovemayo_gothic.ttf",      //7.도베마요고딕

    "Assets/Fonts/Sejong hospital Bold.ttf", //8.세종호텔 볼드

    "Assets/Fonts/Sejong hospital Light.ttf" //9.세종호텔 라이트

};

 

 2-4  모든 오브젝트를 찾아서 폰트 바꿔주기

public void ChangeAllFonts(int num)

{

    var allTextObjects = Resources.FindObjectsOfTypeAll(typeof(Text));


    foreach (Text t in allTextObjects)

    {

        t.font = AssetDatabase.LoadAssetAtPath<Font>(Fonts[num]); 

    }

}

폰트매니저에서 사용할 것이 아니기 때문에 public으로 생성하였습니다.

 

2-4 1) Resources.FindObjectsOfTypeAll를 사용하여 Text를 가진 모든 오브젝트를 찾습니다.

FindObjectsOfType과 달리 비활성된 오브젝트를 포함하여 모든 오브젝트를 찾습니다.

FindObjectsOfType는 활성화된 오브젝트만 찾습니다.

 

2-4 2) AssetDatabase.LoadAssetAtPath를 사용하여 Text를 해당 경로에 있는 폰트로 바꿉니다.

foreach문을 사용하여 돌렸기 때문에 2-4 1)에서 찾은 모든 오브젝트를 찾아서 바꾸게 됩니다.

AssetDatabase.LoadAssetAtPath(string assetPath, Type type)가 기본값입니다. 

type의 경우 <Font>로 선언하였으며 assetPath는 Fonts[num]로 

2-3에서 설정한 배열에 매개변수 (int num)의 값을 받아서 해당하는 폰트로 바꿔 줍니다. 

 

 

3 주의사항

매개변수 사용시 매개변수에 해당하는 변수를 따로 설정하여 

매개변수의 크기가 Fonts.Length보다 클경우 0으로 바꿔주는 코드를 추천합니다.

삼항 연산자를 사용하여 코드를 구성하시면 손쉽게 짤 수 있습니다.

int num = 0;

num = num > FontManager.instance.Fonts.Length ? 0 : num;

FontManager.instance.ChangeAllFonts(num);

 

 

 

 

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.
알림 0