DevLog/유니티 프로젝트

TMPTextStyle.ApplyTo 참고자료 업로드 + DataStorage Tool 구상안

뽀또치즈맛 2025. 5. 13. 18:07

 https://github.com/kwon1232/HDProject

GitHub - kwon1232/HDProject

Contribute to kwon1232/HDProject development by creating an account on GitHub.

github.com


 
TMPTextStyle의 ApplyTo 머티리얼의 설정 값을 머티리얼에 적용하는 함수이다.
참고한 클래스는 TextMeshPro의 ShaderUtilities와 ScriptableObject 클래스를 참고했다.
 
 
TMPStyleApplier 클래스에서 
이미 오리지널 머티리얼(다운로드된 머티리얼)이 없으면 새로 머티리얼을 할당 후 만들어준다.
 
 
에디터 머티리얼 할당 관련 코드

#if UNITY_EDITOR
    private bool validateScheduled = false;

    private void OnValidate()
    {
        if (validateScheduled) return;
        validateScheduled = true;

        EditorApplication.delayCall += () =>
        {
            validateScheduled = false;

            if (this == null) return;
            InitializeMaterial();
            Apply();
        };
    }

    private void Reset()
    {
        if (this == null) return;
        InitializeMaterial();
        Apply();
    }

    private void InitializeMaterial()
    {
        if (targetText == null)
            targetText = GetComponent<TextMeshProUGUI>();

        if (originalMaterial == null && targetText.fontSharedMaterial != null)
        {
            originalMaterial = targetText.fontSharedMaterial;
            sharedMaterialInstance = originalMaterial;
        }
        if (targetText != null && sharedMaterialInstance == null && targetText.fontSharedMaterial != null)
        {
            sharedMaterialInstance = new Material(targetText.fontSharedMaterial);
            targetText.fontSharedMaterial = sharedMaterialInstance;
        }
    }
#endif

 
 
플레이 화면 머티리얼 할당 코드

    private void Awake()
    {
        if (targetText == null)
        {
            targetText = GetComponent<TextMeshProUGUI>();
        }
        if (style == null)
        {
            style = ScriptableObject.CreateInstance<TMPTextStyle>();
        }

        if (originalMaterial == null)
            originalMaterial = targetText.fontMaterial; 

        if (sharedMaterialInstance == null)
        {
            sharedMaterialInstance = new Material(targetText.fontMaterial);
            targetText.fontMaterial = sharedMaterialInstance;
        }
    }

 
 
한 번 할당된 머티리얼로 계속 해서 사용되는 것을 볼 수 있다.
이렇게 되면 머티리얼 마다 각각 하나의 머티리얼을 가지는 것이 아닌,
하나의 머티리얼을 재사용하는 방향으로 변경했다.
즉 공유하는 기본 머티리얼 하나라면, 동적 머티리얼을 생성하여 사용만
제작한 동적 머티리얼이라면 해당 머티리얼을 기반으로 돌아가게끔 함.

 
이거는 천천히 드로우콜 어떻게 줄일지 차근차근 생각하면서
어떻게 하면 최적화할 수 있을지
어떻게 하면 버그 없이 잘 돌릴 수 있을 지 생각하기

++
지금 메모리 할당되는 로직 좀 바꿨더니 
버그가 생겨, 다시 롤백시키긴 했다.
 
일단 게임플레이 기능 구현 하면서 차차 생각해보자.

+++

자려고 누워 있으면서 생각해보니,
original 머티리얼을 에디터 툴로 로드하면 할당되는 걸로 하거나
asset / resources / 현재 파일 경로 / 로 경로를 바꿔주면 되지 않을까?
낼 해봐야겠다.

original 머티리얼은 초기에 딱 한 번 할당된다.
그 머티리얼의 경로 추적을 통해 경로 받아오기가 될까?
경로 string에 지정 경로 특정 string 전문이 포함된 경우
해당 머티리얼을 바꿔야할까?
아니면 해당 파일을 추적후 해당 머티리얼 이름의 에셋 있는지 확인하는 건?
전부 시도해봐야겠다.

에디터 수정할 때 UI 설정창 닫아놓으면
해당 머티리얼들은 드로우콜이 내려갈까?
그렇다면 지금 구조는 괜찮을 것 같다.

지금 구조에서
1. 업데이트 버그 제대로 고치기
2. 머티리얼 파일 경로 추적 기능 추가
특정 경로 포함된 애셋이라면
자동 세이브 기능 제작
3. UI 제작 및 설정창 닫으면 드로우콜 내려가는지 확인하기

이렇게 하면 사용가능한 에디터툴이 될 수 있을듯.
해당 에디터 툴 손보고 data storage 툴 제작하기


data storage 툴 제작 구상


전반 구상
1. 에디터에서 값 할당 사용 & 코드상에서 사용 둘 다 사용 가능하게

저장 공간 및 업데이트 방법
2. 업데이트는 엔진 실행 시 마다 구글 스프레드시트 자동 정보 업데이트
수동 업데이트 에디터에서 만들어주기

에디터 상세 사용법
3.DataTable  툴에 오브젝트 넣어주고
툴에서 타입 설정해주면,
인터페이스로 관련 변수 할당해주기

코드 상세 사용법
4. Dictionary 사용해서 키값 별 벨류 찾기 적용
관련 함수 제작

기반 구현
5. Base는 구글 스프레드 시트
url로 접속후 svn으로 정보 가져오기.