드디어 유니티로 진입!
이번 개인과제는 Zep을 모방하는 것이다.
역시 유니티는 하면 할 수록 모르는 것들 투성이라는걸 다시 한 번 깨닫게 되는 순간이었다.
InputField
InputField 는 유니티 내에서 제공해주는 문자열을 입력할 수 있는 UI 이다.
문제는 여기서 내가 입력을 했을 때 어떤 이벤트를 발생 시키고 싶었고
정확힌 내가 적은 문자열이 무엇인지 확인 후, 그에 맞게 이벤트를 발생 시켜야 했다.
그것을 알 수 있는 방법이 다양했는데 내가 선택한 방법은 두가지이다.
InputField의 OnEndEdit 활용
InputField 컴포넌트 자체에서 제공해주는 이벤트 가운데 OnEndEdit가 있는데 이것은 Return 또는 Enter 입력시
리스너가 있을 때 호출되는 방식이다.
그럼 호출되는 것 까진 좋다 이건데... 내가 입력한 string 값은 어떻게 받아내는걸까?
찾아본 결과 다음과 같이 할 수 있었다.
[SerializeField] TMP_InputField _nameInput;
private void Start()
{
_nameInput.onEndEdit.AddListener(EnterName);
}
private void EnterName(string value)
{
if (value.Length >= 2 && value.Length <= 8)
GameManager.Instance.GoMainScene(value);
}
위 코드는 InputField를 인스펙터 창에서 드래그드롭으로 할당하기위해 SerializeField Attribute를 썻고,
TMP 를 사용하였기 때문에 타입이 TMP_InputField 이다.
_nameInput 의 여러 이벤트 중 onEndEdit 에 접근하여 리스너를 추가해주고 [ .AddListener() ]
※ onEndEdit 자체가 string을 매개변수로 받는 함수만 추가할 수 있다.
이 때 매개변수의 값이 내가 입력한 문자열이다.
추가할 함수는 EnterName으로 내용은 입력한 문자열 길이가 2 ~ 8 일 때,
입력한 값을 가지고 메인씬으로 넘어가는 것이다.
그렇다면 다른 방법은 무엇일까?
과제 요구사항에선 버튼을 클릭했을 때 이벤트가 발생하는 형식이었다.
일단 추가해보자.
보다시피 Button 컴포넌트에도 OnClick 이라는 이벤트가 있다.
클릭 하면 리스너가 있을 때 호출되는 방식이다.
역시 마찬가지로 코드에서 수정하도록 하자.
[SerializeField] TMP_InputField _nameInput;
[SerializeField] Button _applyButton;
private void Start()
{
_nameInput.onEndEdit.AddListener(EnterName);
_applyButton.onClick.AddListener(OnApplyBtn);
}
private void OnApplyBtn()
{
string inputValue = _nameInput.text;
EnterName(inputValue);
}
private void EnterName(string value)
{
if (value.Length >= 2 && value.Length <= 8)
GameManager.Instance.GoMainScene(value);
}
_applyButton 의 onClick 에 AddListener를 해주는데 이번엔 OnApplyBtn을 해준다.
다만 매개변수가 없는 함수를 할당해야 하고,
클릭을 했을 때 어떠한 이벤트가 일어날 뿐 InputField의 입력값이 뭔지는 자동으로 알지 못한다.
그렇기 때문에 OnApplyBtn 메서드로
string inputValue 에 _nameInput.text 값을 할당한다.
무언가 입력이 돼있다면 정상적으로 값이 할당되고,
EnterName에 그 입력값을 넘겨주면 나머지는 마찬가지로 입력값을 가지고 메인씬으로 넘어간다.
Name UI 컴포넌트에 해당 타입의 오브젝트를 잘 할당 해주고 실행을 해보자.
그 전에 아닐 경우엔 잘못된 입력이라고 출력해주고 틀린 값을 입력해보자.
[SerializeField] TMP_InputField _nameInput;
[SerializeField] Button _applyButton;
[SerializeField] TextMeshProUGUI _noticeText;
private bool _isAlerting = false;
private void Start()
{
_nameInput.onEndEdit.AddListener(EnterName);
_applyButton.onClick.AddListener(OnApplyBtn);
}
private void OnApplyBtn()
{
string inputValue = _nameInput.text;
EnterName(inputValue);
}
private void EnterName(string value)
{
if (value.Length >= 2 && value.Length <= 8)
GameManager.Instance.GoMainScene(value);
else
StartCoroutine(NoticeTextRoutine());
}
private IEnumerator NoticeTextRoutine()
{
if (_isAlerting)
yield break;
_isAlerting = true;
_noticeText.gameObject.SetActive(true);
_nameInput.text = "";
yield return new WaitForSeconds(1);
_noticeText.gameObject.SetActive(false);
_isAlerting = false;
}
EnterName의 else 문에 코루틴을 시작해
1초간 딜레이를 줘 연속 입력을 방지하며
네임인풋을 초기화, 경고문을 출력하자.
잘된다!
'스파르타 내배캠' 카테고리의 다른 글
스파르타 내배캠 Unity 3기 21일차 (2) | 2024.01.22 |
---|---|
스파르타 내배캠 Unity 3기 20일차 (0) | 2024.01.19 |
스파르타 내배캠 Unity 3기 18일차 (0) | 2024.01.17 |
스파르타 내배캠 Unity 3기 17일차 (0) | 2024.01.16 |
스파르타 내배캠 Unity 3기 16일차 (0) | 2024.01.15 |