유니티/2D

유니티 2D - 캐릭터 이름 구현 (WorldSpace 와 InputField - TextMeshPro)

근본넘치는개발자 2024. 10. 11. 21:50

오늘은 캐릭터 이름 표시 기능? 을 만들면서 놓쳤었던 부분을 기록하고자 합니다.

지금 보니 다 간단한 거였는데 왜 그랬을까요;;;

 

일단 처음 구상한 아이디어는 이름을 입력받고 머리 위에 띄우는 것이었습니다.

 

원했던 결과물 / 완성본

 

UI를 통해 TextMeshPro를 넣어주면 간단하게 해결될 줄 알았습니다.

그런데 문제가 발생했습니다.

 

시네머신 카메라를 이용해 플레이어의 움직임을 따라가도록 했더니 

UI의 위치랑 플레이어의 위치랑 차이가 나는 것이었습니다.

 

 

canvas를 player 아래에 하나 더 만들어서 그런가? 

일단 여기서 1차 얼타기 시작.

 

해결 방법은 의외로 간단했습니다. 
 

 

canvas는 기본으로 ScreenSpace-Overlay로 설정되어 있는데,

이를 WorldSpace로 바꿔서 해결했습니다.

 

그래서 이게 뭔데? 싶은 사람이 있을 수도 있어서(그게 나야...)

아래 각 기능을 설명하겠습니다.

 

 

RenderMode는 3가지로 구분됩니다.

 

ScreenSpace - Overlay 

ScreenSpace - Camera

WolrdSpace 

 

ScreenSpace - Overlay 

UI 요소가 화면에서 씬의 위에 렌더링됩니다.

스크린의 크기가 조절되거나 해상도가 변경되면

캔버스는 여기에 맞춰 자동으로 크기를 변경합니다.

 

ScreenSpace - Camera

Canvas 가 지정된 Camera 앞에 주어진 거리만큼 배치됩니다 .

UI 요소는 이 카메라에 의해 렌더링되므로 Camera 설정이 UI의 모양에 영향을 미칩니다.

 

Camera 가 Perspective 로 설정된 경우 UI 요소는 원근법으로 렌더링되고,

원근 왜곡의 양은 Camera Field of View 로 제어할 수 있습니다 .

 

화면 크기가 조정되거나 해상도가 변경되거나 카메라 프러스텀이 변경되면

Canvas 도 자동으로 일치하도록 크기가 변경됩니다.

 

WolrdSpace 

씬에 있는 다른 오브젝트처럼 동작합니다.

캔버스의 크기는 사각 트랜스폼을 사용하여 수동으로 설정할 수 있으며

UI 요소는 3D 배치에 기반하여 씬의 다른 오브젝트의 앞 또는 뒤에 렌더링됩니다.

 

 

처음 구상한 방식대로 하기 위해선 WorldSpace로 설정해 주면

간단하게 구현할 수 있는 상황이었습니다.;;;

 

 

https://docs.unity3d.com/kr/530/Manual/UICanvas.html

 

캔버스 - Unity 매뉴얼

모든 UI 요소는 Canvas 안에 위치해야 합니다. 캔버스는 Canvas 컴포넌트가 있는 게임 오브젝트이며 모든 UI 요소는 반드시 어떤 캔버스의 자식이어야 합니다.

docs.unity3d.com

 

 

아직 끝이 아닙니다. 

따라다니는 건 해결 됬으니 이제 이름을 입력해야겠죠.

 

텍스트를 입력받는 거니까 TMP_Text 써서 받으면 되겠지, 하고서 

진행해 보니 아무 반응이 없었습니다.

 

여기서 2차 얼타기 시작.

 

당연히 안된 이유는 InputField라는 컴포넌트가 따로 있었기 때문이죠 ! 

구글링 한 번에 찾았지만 이걸 몰랐다는 사실이 참;;;

(더 놀라웠던 건 그동안 입력 받는 작업을 한 번도 안 해봤다는 사실. 어떻게 그랬지? ;;; ) 

 

 

이렇게 TMP_InputField로 inputText를 만들어 입력을 받았습니다. 

여기까지만 하면 재미없죠.

 

TMP_InputField의 각 기능들에 대해서 자세하게 찾아봤습니다.

TMP_InputField를 생성하고 Hierarchy에서 보면 다음과 같은 걸 확인 할 수 있습니다.

 

 

각 역할에 대해 간략하게 설명하겠습니다.

 

TextArea

네모 이미지 칸입니다.

 

Placeholder

기본 세팅으로 만들면 다음과 같은 글자를 보셨을 겁니다.

 

이게 Placeholder에 담겨 있습니다.

연한 회색으로 되어있어서 간단한 설명 문구를 넣을 수 있습니다.

Text로 되어있으니 꾸미는 것도 가능하겠죠?

 

 

Text

 

Text는 입력받은 글자를 보여줍니다. 

자세히 보시면 글자 색이 약간 더 진한 걸 확인 하실 수 있습니다.

 

InputField

InputField엔 유용한 기능이 많이 있습니다.

먼저 자세히 보시면 Placeholder와 Text가 연동되어 있는 걸 확인할 수 있습니다.

이제 어떻게 동작하시는지 감이 오시나요?

 

 

여기서 눈 여겨 봐야 할 건 Character Limit입니다.

글자수 제한을 걸 수 있다는 사실 알고 계셨나요.

저는 처음 알았습니다.;;

 

Content Type을 살펴보면 아래와 같이 다양한 유형의 타입들이 있습니다.

문자 외에도 여러 가지 형식을 입력할 수 있습니다.

 

 

Pin 타입 예시 - 위처럼 * 로 표시된다.

 

 

Line Type에서 여러 줄 입력이 가능하게 설정을 변경할 수 있습니다.

 

그 외에도

 

Caret Blink Rate - 글자를 입력할 때 옆에 | 이런 식으로 줄이 깜빡거리는 걸 보셨을 텐데,

이 속도를 조절 할 수 있습니다.

 

Width는 | 선의 굵기 조절이였구요

 

ESC키를 누르면 기본 상태로 돌아가는 기능도 있습니다.

 

Rich Text는 태그들을 통해 글에 효과를 줄 수 있도록 설정하는 기능입니다.

예로 <b>를 글자 앞에 입력하면 굵은 글씨로 나옵니다.

 

 

아래는 인풋 상태에 따라 다른 이벤트를 발생시키는 내용입니다.

 

 

On Value Change : 값 변경 시 이벤트 발생

 

On End Edit : 편집 종료 시 이벤트 발생

 

On Select : 선택 시 이벤트 발생

 

On DeSelect : 선택 취소 시 이벤트 발생 

 

 

여기에서 해당하는 이벤트를 걸어 처리해 줄 수 있습니다.

 

 

https://docs.unity3d.com/kr/2023.2/Manual/script-InputField.html

 

입력 필드 - Unity 매뉴얼

입력 필드(Input Field) 를 통해 텍스트 컨트롤의 텍스트를 수정할 수 있습니다. 다른 상호작용하는 컨트롤과 비슷하게, 그 자체로는 시각적 UI 요소가 아니므로 한 개 이상의 시각적 UI 요소와 결합

docs.unity3d.com

 

 

 

어려운 건 없었습니다만

얼타서 생각보다 시간이 좀 더 걸렸었네요.

 

금방 해결은 했지만, 이 간단한 걸 놓쳤다니.

분명 전에 본 것들인데 말이죠.

 

다시는 잊어먹지 말아야지.

 

참고한(혹은 하면 좋을) 자료

 

https://youtu.be/0p8Vvyrxn-Q?si=V3-Fgh2iH5rh9mhE

https://youtu.be/zahrwl1125k?si=B6AdCNZgevZVQJ_E