구현 과정

  1. 플레이어 이름 입력 받기 구현
    1. 어디서 받을 것인가?
      • 인트로 컷신 중에서?
      • 새로하기 버튼 클릭 후 바로?
    2. UI 구현하기
      • [x] panel 생성

      • [x] input field & 버튼 만들고 적절한 안내 text 넣기

        • 버튼 그냥 없앰.. 마지막 한글 씹히는거랑 inputfield deselect 될 때 이상하게 처리돼서…
      • [x] input field 글자수에 따른 button 활/비활성화 구현

        • 버튼 그냥 없애서 구현한거 삭제함
      • [x] input field 소리 & 버튼 클릭 소리

        → 무료 에셋으로 임시로 넣어둠

      • [x] 이름 입력 panel ui 순서 설정

      • [ ] 이름 저장

        • [x] 임시로 playerprefs에 저장
        • [ ] data manager 구현 후 json 파일 저장으로 변경
      • [x] 이름 입력 후 intro scene으로 전환 때리기

        • [x] fade out 처리

Problem, Cause & Solution

Problem

TMP_InputField로 플레이어의 닉네임을 입력받고, 바로 옆 Button UI를 통해 입력 받은 닉네임을 넘겨처리하고자함. 문제는 inputfield에서 한글로 입력하고 바로 Button을 마우스로 클릭하게되면 마지막 글자가 제대로 넘어가지 않고 버퍼에 남아있게 됨. 그래서 다른 inputfield나 string 입력창을 누르게 되면 버퍼에 남아있는 글자가 잘못 전달되는 오류가 발생함

Cause

Unity의 InputField(또는 TMP_InputField)에서 한글 입력 관련 문제가 발생하는 원인은 한글 입력기가 사용 중일 때 입력 완료 처리와 Unity의 이벤트 처리 순서가 맞지 않아서입니다. 특히, 입력 중인 한글 조합 상태에서 마우스 클릭 이벤트가 발생하거나 다른 입력창으로 전환되면 아래와 같은 문제가 발생할 수 있습니다:

  1. 입력 완료 타이밍 문제

    한글은 조합 중인 글자가 완성된 후에야 최종적으로 입력됩니다. 그러나 Unity는 조합이 완료되기 전에 onEndEdit 또는 onValueChanged 이벤트를 호출하여 입력 완료 처리를 시도합니다. 이로 인해 마지막 글자가 제대로 처리되지 않을 수 있습니다.

  2. 버퍼 문제

    입력기(IMF, Input Method Framework)와 Unity 간의 동기화가 완료되지 않아 이전에 입력하던 글자가 버퍼에 남아 있을 수 있습니다.

    예를 들어, 한글 조합이 끝나지 않은 상태에서 입력창을 전환하면 버퍼에 남아 있던 글자가 다른 InputField에 잘못 전달될 수 있습니다.

Solution

문제를 해결하기 위해 다음과 같은 방법을 적용할 수 있습니다:


1. onSubmit이나 onEndEdit 이벤트 호출 순서 확인

코드 예제:

using UnityEngine;
using TMPro;
using System.Collections;

public class KoreanInputHandler : MonoBehaviour
{
    public TMP_InputField inputField;
    public GameObject submitButton;

    private void Start()
    {
        inputField.onValueChanged.AddListener(OnInputValueChanged);
        inputField.onEndEdit.AddListener(OnInputEndEdit);
    }

    private void OnDestroy()
    {
        inputField.onValueChanged.RemoveListener(OnInputValueChanged);
        inputField.onEndEdit.RemoveListener(OnInputEndEdit);
    }

    private void OnInputValueChanged(string text)
    {
        // 입력된 텍스트가 비어 있지 않을 때 버튼 활성화
        submitButton.SetActive(!string.IsNullOrEmpty(text));
    }

    private void OnInputEndEdit(string text)
    {
        // 한글 조합 완료를 기다리기 위해 Coroutine 실행
        StartCoroutine(HandleEndEditAfterDelay());
    }

    private IEnumerator HandleEndEditAfterDelay()
    {
        yield return null; // 다음 프레임까지 기다림 (한글 조합 완료)
        Debug.Log($"최종 입력된 텍스트: {inputField.text}");
    }
}