본문 바로가기
스파르타 내배캠

스파르타 내배캠 Unity 3기 19일차

by LemongO 2024. 1. 18.

오도도도도도

 

 

 

드디어 유니티로 진입!

 

이번 개인과제는 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초간 딜레이를 줘 연속 입력을 방지하며

네임인풋을 초기화, 경고문을 출력하자.

 

잘된다!