일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 최종프로젝트
- 마크다운
- string배열과 char
- Action
- 스탠다드
- 유니티
- 내주말
- 피셔예이츠
- 알아볼것
- 스파르타
- 내일배움캠프
- Til
- 텍스트게임
- Input Field
- 코딩테스트
- 코테
- 스파르타부트캠프
- 스파르타내배캠til
- 스파르타내일배움캠프TIL
- 프로그래머스
- 백준
- projectl
- 티스토리챌린지
- input system
- 분반별
- 스파르타내일배움캠프
- 오블완
- 코테풀기
- 내배캠
- 분반별학습
- Today
- Total
Ottoman
내일배움캠프 4주 일요일 TIL - Unity Input Field, TMP, 게임오브젝트캐싱 본문
개인과제에서 유니티 실행중 텍스트를 입력하고 입력한 텍스트를 플레이어네임으로 플레이어게임오브젝트 머리 위에 띄우는 과제가 있다.
콘솔에서였다면 Console.ReadLine()을 실행하고 그 스트링을 출력하면 됐을거다.
이걸 그대로 Unity 스크립트에 넣고 해봤는데 실행되지 않았다.
그래서 검색을 통해 Unity에서 Input Field라는 컴포넌트를 제공하는걸 알았다.
입력 필드 - Unity 매뉴얼 (unity3d.com)
입력 필드 - Unity 매뉴얼
입력 필드(Input Field) 를 통해 텍스트 컨트롤의 텍스트를 수정할 수 있습니다. 다른 상호작용하는 컨트롤과 비슷하게, 그 자체로는 시각적 UI 요소가 아니므로 한 개 이상의 시각적 UI 요소와 결합
docs.unity3d.com
[Unity 기초]인풋필드 (Input field) (tistory.com)
[Unity 기초]인풋필드 (Input field)
*본 게시글은 유튜브 '케이디'님 강좌를 바탕으로 적었습니다 :) *Input field 생성법 그럼 요로코롬 자식객체 3개를 가진 InputField와 EventSystem이 세트로 생긴다...! 그리고 게임을 실행시키면 커서가
flowersayo.tistory.com
// Input Field를 만드는 법
일반 게임오브젝트에 컴포넌트를 넣는 식으로도 만들 수 있다.
InputField (TMP)에는 Canvas Renderer, Image, Input Field 컴포넌트가 들어간다.
Text Area에는 Rect Transform과 Rect Mask 2D가 있다.
Placeholder는 유저가 텍스트를 입력하기 전에 화면에 출력되는 텍스트다.
Text에 유저가 입력하는 텍스트가 들어간다.
TMP FONT asset
// TMP를 쓰려면 알아야한다.
[UNITY] TextMesh Pro 간단 사용법 — HYEOKJUN (tistory.com)
[UNITY] TextMesh Pro 간단 사용법
https://docs.unity3d.com/Packages/com.unity.textmeshpro@3.0 TextMesh Pro User Guide | TextMeshPro | 3.0.6 TextMesh Pro User Guide Overview This User Guide was designed to provide first time users of TextMesh Pro with a basic overview of the features and fu
hyeokjunjjang.tistory.com
- TMP형식의 Text를 만들었다면 스크립트에서 Text 형식이 아닌 TextMeshProUGUI를 써야한다.
// 생각
처음엔 이것도 이벤트 방식으로 처리해보려 했는데 현재 프로그램에서 이벤트로 처리되는것은 Input Actiond에서 WASD를 PlayerInputController : EventHub에서 InputValue로 받고있는데 Call...Event()하려면 EventHub클래스를 상속받아야했다. 키보드 엔터입력을 감지한다면 좋은 일이겠지만 아직 정리가 안됐다.
아래에 버튼을 누르는 행위가 이벤트란 생각이 들어서 버튼에 입력완료 실행코드를 넣기로 했다.
UI로 초록 바탕을 깔고 가운데 Image로 하얀상자와 그 안에 조금 작은 초록상자를 배치했다.
그 안에 InputField를 만들고 아래에는 입력완료함수를 넣은 버튼을 만들었다.
영문을 입력하면 UI로 플레이어 위에 출력되도록 했다.
// 나의 코드
public class Login : MonoBehaviour
{
private GameObject loginPanel;
[SerializeField] private PlayerInfo playerInfo; // 인스펙터에서 캐싱
[SerializeField] private TextMeshProUGUI nameTxt; // 여기에 InputField에서 입력한 txt를 인스펙터에 캐싱하기
private void Awake()
{
loginPanel = gameObject;
}
void Start()
{
Time.timeScale = 0f;
}
private void InputName()
{
PlayerInfo.Name = nameTxt.text;
playerInfo.NameUpdate();
}
public void ClickEnterButton()
{
InputName();
loginPanel.SetActive(false);
Time.timeScale = 1f;
}
}
public class PlayerInfo : MonoBehaviour
{
[SerializeField] private TextMeshProUGUI TxtplayerName;
public static string Name;
public void NameUpdate()
{
TxtplayerName.text = Name;
}
}
// 작업하면서 찾은 문제점
InputField에서 한글을 입력하려하면 ㅁㅁ 처럼 네모만 써진다. 다음과 같은 오류가 함께뜬다
The character with Unicode value \uB9C8 was not found in the [LiberationSans SDF] font asset or any potential fallbacks. It was replaced by Unicode character \u25A1 in text object [Text]. UnityEngine.Debug:LogWarning (object,UnityEngine.Object)
[LiberationSans SDF] 글꼴 자산이나 잠재적인 폴백에서 유니코드 값이 \uB9C8인 문자를 찾을 수 없습니다. 텍스트 개체 [Text]에서 유니코드 문자 \u25A1로 대체되었습니다. UnityEngine.Debug:LogWarning(object,UnityEngine.Object)
폰트에서 한글을 지원하지 않는것 같아서 바꾸려고 했는데 일반폰트는 안들어가고 특정유형만 받고있다.
// 한글 TMP폰트
[팁] 유니티 TextMeshPro TMP 폰트 만들기 : 네이버 블로그 (naver.com)
[팁] 유니티 TextMeshPro TMP 폰트 만들기
안녕하세요. 골드메탈입니다. 예전부터 사용해왔던 UI의 Text는 이제 Legacy로 빠진 상태입니다. 유니...
blog.naver.com
위 링크에서 한글 TMP폰트를 만드는 법이 있다. 여태 강의에서 괜히 TMP를 안쓰던게 아니었다!
User : 유니티에서 서로 다른 게임오브젝트에 같은 스크립트를 캐싱하면 스크립트에 있는 변수는 static이 아니면 게임오브젝트마다 서로 다른거지?
ChatGPT : 맞아요! 유니티에서 같은 스크립트를 서로 다른 게임 오브젝트에 캐싱하면, 그 스크립트의 변수들은 각 게임 오브젝트마다 별개로 존재합니다. 이 변수들이 static으로 선언되지 않았다면, 각 게임 오브젝트 인스턴스는 자신만의 인스턴스 변수를 가질 것입니다. 이 말은 즉, 각 게임 오브젝트가 스크립트의 인스턴스를 별도로 가지고 있고, 그 인스턴스 내부의 변수들은 서로 영향을 주지 않는다는 뜻입니다.
// 게임오브젝트를 캐싱하는 방법
어떤 수정을 가하면 스크립트에 게임오브젝트를 캐싱한게 모두 풀려있곤 해서 이를 방지하는 방법으로 스크립트 안에서 모두 캐싱해놓을수 없을까하는 부분에서 시작했다.
- 코드를 통해 캐싱한다면 런타임에서 코드를 읽는 시간이 더 걸리고 인스펙터를 통해 드래그앤드롭으로 캐싱하는 방법이 성능적으로 제일 우수하다(?).
- Inspector에서 직접 할당하기 : 이 방법은 런타임 시간에 즉각적으로 GameObject를 찾는 대신, Inspector에서 설정을 완료하기 때문에 더 효율적입니다.
- GameObject.Find("게임오브젝트이름") : 이름이 " 게임오브젝트이름 "인 게임 오브젝트를 찾는다. 이것은 해당 이름을 가진 첫 번째 게임 오브젝트를 반환합니다. 그러나 게임이 크거나 복잡한 경우, Find 함수는 매우 비효율적일 수 있으므로 사용에 주의해야 합니다
- GameObject.FindWithTag("찾는태그") : 게임 오브젝트에 고유한 태그를 부여해서 쓴다. 이 경우 " 찾는태그 " 태그가 지정된 첫 번째 게임 오브젝트가 반환됩니다.
- GameObject.FindGameObjectWithTag ("찾는태그") : 위와 같다.
// 캐싱과 할당
User : 캐싱한다와 할당한다는 같은말인가?
ChatGPT : 캐싱과 할당은 비슷한 의미를 가지지만 약간의 차이가 있습니다. 할당은 변수에 값을 넣는 것을 의미합니다. 이는 변수에 값을 할당하거나 변수를 초기화하는 것을 말합니다. 변수에 값을 할당할 때는 해당 값을 변수에 저장하는 것입니다. 캐싱은 일반적으로 데이터나 결과를 임시 저장하고 나중에 재사용하기 위해 메모리에 저장하는 것을 의미합니다. 주로 데이터나 결과를 반복적으로 계산하지 않고 저장하여 성능을 향상시키는 데 사용됩니다. 할당은 보통 변수에 값을 넣는 작업을 의미하며, 캐싱은 일반적으로 값이나 결과를 임시로 저장하는 작업을 의미합니다. 하지만 맥락에 따라서 두 용어를 상황에 맞게 사용할 수 있습니다.
'TIL' 카테고리의 다른 글
내일배움캠프 5주 2일차(21) TIL - 유니티 스크립트 주의사항... (1) | 2024.05.14 |
---|---|
내일배움캠프 5주 1일차(20) TIL (0) | 2024.05.13 |
내일배움캠프 4주 토요일 TIL - 싱글톤 (1) | 2024.05.11 |
내일배움캠프 4주 4일차(19) TIL 유니티2D개인프로젝트 이벤트기반프로그래밍 (0) | 2024.05.10 |
내일배움캠프 4주 3일차(18) -2- TIL (0) | 2024.05.10 |