ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TextMeshPro- TMP_TextInfo ,텍스트 vertices 탐구
    Unity 2024. 12. 28. 19:16
    728x90

     

    더보기

    정보

     

    TMP_TextInfo 란?

    TMP_TextInfo는 TextMeshPro에서 텍스트의 메쉬 데이터와 관련된 정보를 저장하고 관리하는 구조체

    TextMeshPro 의 버텍스 데이터를 사용하면 여러 특정 효과를 구현할 수 있다.

     

    TextMeshPro는 텍스트를 렌더링할 때, 같은 스타일(재질)을 가진 문자를 하나의 메쉬로 묶어서 관리

    • TMP_TextInfo.meshInfo[] 배열은 텍스트에 사용된 모든 재질(Material)마다 개별 메쉬 데이터를 저장
    • **materialReferenceIndex**는 현재 문자가 어느 메쉬에 속하는지를 알려줌

    텍스트와 버텍스

    텍스트 렌더링 시스템에서는 텍스트도 메쉬로 처리가 되며,

    한 문자당 사각형 형태의 4개의 버텍스로 이루어져 있다.

    ex) Top Left (0)       Top Right (1)
            ●────────────●
             |                               |
             |                               |
            ●────────────●
       Bottom Left (2)   Bottom Right (3)

     

     

    코드 예제

    더보기

    1. textComponent.ForceMeshUpdate();
    2. TMP_CharacterInfo charInfo = textInfo.characterInfo[index];

    3. if (!charInfo.isVisible) yield break;

    4.  Vector3[] vertices = textInfo.meshInfo[charInfo.materialReferenceIndex].vertices;
    5. int vertexIndex = charInfo.vertexIndex;

     

    for (int j = 0; j < 4; j++)

    {
    6.    vertices[vertexIndex + j] += (Vector3)startOffset;

    }

     

    7. textComponent.UpdateVertexData(TMP_VertexDataUpdateFlags.Vertices);

     

    1. ForceMeshUpdate() 를 통한 텍스트 메쉬 데이터 업데이트해 데이터 최신화.

    더보기

    ForceMeshUpdate 란 텍스트의 메쉬 데이터를 다시 생성하도록 강제하는 메서드로,

    언제 사용하는가.

    • 텍스트를 동적으로 변경했는데 업데이트가 지연될때
    • 텍스트 메쉬 데이터를 사용해서 추가적인 계산(크기, 위치, 경계 등)을 수행할 때
    • 텍스트 렌더링이 제대로 이루어 지지 않거나, 초기화 상태에서 누락된 정보를 즉시 업데이트 하려고 할때

    주의.

    메쉬 데이터를 강제로 재생성하기 때문에 자주 호출하게되면 성능에 영향을 줄 수 있음.

     

    기본적으로 TextMeshPro는 변경 사항이 발생할 때마다 메쉬를 자동으로 업데이트를 하지만, 특정 상황에 즉시 결과가 필요하거나, 비활성화된 상태에서 업데이트 해야할 경우에도 사용.

    2. textInfo, 텍스트 정보 가져오기

     

    TMP_CharacterInfo charInfo = textInfo.characterInfo[index];

               → TextMeshPro 에 써진 텍스트의 특정 Index에 있는 문자 정보를 가져온다.

     

    3.선택한 문자가 화면에 보이는 상태인지(렌더링되고 있는지) 여부 확인

    charInfo.isVisible

     

    4. 메쉬 데이터에서  문자의 버텍스 배열 가져오기

    Vector3[] vertices = textInfo.meshInfo[charInfo.materialReferenceIndex].vertices;

              → 해당 문자가 어느 메쉬에 속해있는지 나타내는 materialReferenceIndex를 사용해 버텍스 배열을 정보를 가져옴

     

    5. 문자의 버텍스 인덱스 가져오기

    int vertexIndex = charInfo.vertexIndex;

              → 문자의 4개의 버텍스 중 첫 번째 버텍스 배열 인덱스를 나타냄

    메쉬 내에 다른 문자와 섞여 있는 버텍스 데이터를 다루는 경우, 직접 인덱스를 계산하지 않아도 됨.

     

    6. 문자에는 4개의 버텍스가 있음으로, 4개의 정점을 수정해 줌으로써 위치를 변화시기커가, 크기 모양 등을 수정할 수 있다

    for (int j = 0; j < 4; j++)

    {
    6.    vertices[vertexIndex + j] += (Vector3)startOffset;

    }

     

    7. 변경한 텍스트 데이터 업데이트.

    textComponent.UpdateVertexData(TMP_VertexDataUpdateFlags.Vertices);

    더보기

    UpdateVertexData() 

    TextMeshPro의 메쉬 데이터를 강제로 업데이트 하기 위해 사용. 

    내부적으로 메쉬 데이터의 변경 사항을 GPU로 바로 전송해 화면에 표시되도록 함.

     

    텍스트 위치나 회전 크기 등 작업을 수행 한 경우, 변경된 데이터를 적용하기 위해 반드시 호출해 줘야 함.

     

    TMP_VertexDataUpdateFlags 플래그를 사용하여 업데이트할 데이터의 범위를 선택할 수 있다.

     

    • Vertices: 버텍스 위치만 갱신.
    • Colors32: 색상 데이터만 갱신.
    • Uvs0/Uvs2: UV 맵 좌표만 갱신.
    • All: 모든 데이터를 갱신.

     

     

    더보기

    ForceMeshUpdate()  UpdateVertexData() 의 차이점

     

    특성 ForceMeshUpdate() UpdateVertexData()
    역할 텍스트 전체 데이터를 갱신하고 메쉬를 재생성 변경된 메쉬 데이터(Vertex, UV, 색상 등)만 갱신
    사용 시점 텍스트 변경, 레이아웃 변경 후 애니메이션 또는 특정 데이터 조작 후
    갱신 범위 텍스트 전체 (버텍스, 삼각형, 색상 등 모든 데이터) 선택적으로 Vertex, UV, Color 등 갱신
    성능 비용 높음 낮음
    주요 용도 텍스트 초기화, 텍스트 변경 애니메이션 효과, 부분 업데이트
    예제 텍스트 변경 시 버텍스 위치 조정, 색상 변경

     

    728x90
Designed by Tistory.