Unity UI Text 표시 기초(TextMesh Pro)

수집형 오브젝트를 수집하는데, 플레이어가 몇개나 수집했는지 모르면 의미없다

 

수집한 오브젝트 수를 표시해줄 text를 화면에 나타낼 수 있다면?

 

public class PlayerController : MonoBehaviour
{
    private int count;
    
    void Start()
    {
        count = 0;
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("PickUp")) {
            other.gameObject.SetActive(false);
            count += 1;

            SetCountText();
        }
    }
}

 

 

수집한 오브젝트 수를 나타낼 private int count; 선언

 

당연히 오브젝트 수는 정수니까 정수로 선언

 

count는 0부터 시작해서, 플레이어가 오브젝트를 수집할 때마다 1씩 증가

 

count를 private로 선언하면, unity의 inspector에서 초기값을 설정할 수 없다

 

start 함수에 count = 0;으로 초기화하면, 게임 시작시에 count = 0부터 시작하게 된다

 

그리고 OnTriggerEnter 함수 내에, 오브젝트를 수집하면 count를 1씩 증가하는 코드 작성

 

-------------------------------------------------------------------------------------------------------------------------------------

 

UI와 TextMesh Pro를 사용하여 수집한 오브젝트 수를 화면에 표시할 수 있다

 

Hierarchy에서 새로 만들기 - UI - Text - TextMeshPro 선택

 

 

 

 

Import TMP Essentials로 TextMesh Pro의 필수 요소 설치

 

 

 

 

설치 후에는 Text(TMP)가 새로 생성되고, Canvas 밑에 나오고 EventSystem이라는 것도 생김

 

 

 

 

모든 UI 요소는 Canvas의 자식이어야 제대로 동작한다

 

해당 Text를 누르고 F키 누르면 Scene 뷰에서 해당 Text에 비춰짐

 

 

 

 

상단에 2D 누르면 2D뷰로 바꿀 수 있다

 

 

 

 

Text Input 쪽에 Count Text라고 바꾸면, text 내용이 바뀐다.

 

오브젝트 이름이랑 Text Input쪽의 내용이랑은 다르다

 

오브젝트 이름을 바꿔도 text 내용이 바뀌지는 않는다

 

 

 

 

Rect Transform에서 위치를 조정하거나, 해당 text를 드래그하면 위치 조정이 가능

 

 

 

 

이제 플레이어가 먹은 오브젝트 수를 표시하기 위해, script에 연결시켜야하는데

 

그러기 위해 text 오브젝트의 이름을 CountText로 변경

 

그리고 C#에서 TextMesh Pro를 다루기 위해 using TMPro;로 import

 

using TMPro;

 

 

TextMeshProUGUI 변수를 다음과 같이 선언할 수 있다

 

TextMeshPro의 text 컴포넌트를 저장할 수 있음

 

public TextMeshProUGUI countText;

 

 

countText가 참조하는 textmeshpro 오브젝트의 text값을 "Count: (value)"로 변경하는 함수

 

    void SetCountText()
    {
        countText.text = "Count: " + count.ToString();
    }

 

 

Start() 함수에서 count = 0;으로 초기화한 후에 위에서 작성한 SetCountText()를 호출하면, 게임에서 count: 0이 표시

 

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        count = 0;
        SetCountText();
    }

 

 

 

 

 

당연히 플레이어가 오브젝트를 수집할때마다, 값이 변경되어야함

 

OnTriggerEnter() 함수 내에서, 물체를 수집하면서 물체를 비활성화하고, count가 증가할때마다 

 

SetCountText() 호출하여 변경

 

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("PickUp")) {
            other.gameObject.SetActive(false);
            count += 1;

            SetCountText();
        }
    }

 

 

Player의 inspector에서 PlayerController 부분에 CountText가 None인데 CountText를 드래그해서 넣어주면

 

스크립트 내에 countText가 참조하는 오브젝트가 CountText가 된다

 

 

 

 

EventSystem에서 standalone Input Module 부분을 보면 경고가 뜨는데

 

새로운 Input system을 쓰기 때문에 그렇다

 

replace with inputsystemUIInputModule을 선택하면 된다

 

 

 

 

 

실제 테스트해보면 수집한 값에 따라 증가하고 있다

 

 

 

 

비슷하게 모든 오브젝트를 수집하고 게임을 끝내는 텍스트도 만들어볼 수 있다

 

Hierarchy에서 UI - Text-TextMeshPro를 만들고 WinText라고 이름 바꾼 다음, 내용을 You Win!으로 바꾼다

 

그리고 inspector에서 vertext color에서 글자 색을 바꿀 수도 있다

 

위에 Font Size보면 글자 크기도 조절 가능하고 Font Style에서 B는 굵게 바꿔준다

 

 

 

 

그리고 해당 텍스트 오브젝트를 참조해서, 모든 게임 오브젝트를 수집하면 활성화, 수집하지 못하면 비활성화하도록 한다

 

GameObject 변수인 winTextObject를 선언

 

public GameObject winTextObject;

 

 

Start() 함수 내에서, winTextObject.SetActive(false);로 해서, 시작할때는 해당 텍스트를 비활성화

 

    void Start()
    {
        winTextObject.SetActive(false);
    }

 

 

수집형 오브젝트 수가 12개인데, 수집한 오브젝트 수 count가 12 이상이면 winTextObject를 다시 활성화

 

    void SetCountText()
    {
        countText.text = "Count: " + count.ToString();

        if(count >= 12)
        {
            winTextObject.SetActive(true);
        }
    }

 

 

다시 Player에서 Player Controller부분에 win text object에 Win Text 오브젝트를 드래그해서 넣어주면

 

스크립트 내의 winTextObject가 WinText를 참조하게 됨

 

 

 

 

오브젝트를 모두 수집하면 텍스트가 뜬다는 것을 알 수 있다

 

 

 

 

 

TAGS.

Comments