[Unity] password input field 에 대한 고찰 (IME 사용법)

2022. 2. 24. 13:35

log in UI 부분은 개발하고 손뗀지 오래되었는데, QA 에서 다시한번 검토해 달라는 요청이 왔다. id 쪽은 문제 없는데... password가 문제. inputFiled 세팅을 잘못해 주었는지 한글이 마구 들어가는 것이다.... 비밀번호는 보통 한글이 입력되지 않아야하는게 일반적인데, 심지어 왜인지 한글 한글자만 넣어도 *이 무한증식....

정책이 명확하지 않아 네이버의 로그인 방식을 참고하여 리팩토링하기로 결정!

 

1. 네이버 로그인 작동 방식 확인하기

 

<네이버 로그인 입력창 정책>
ID : 한글 / 영문 / 숫자특수기호 입력가능
Password : 영문 / 숫자특수기호 입력가능

 

아이디를 입력시에는 IME 가 작동한다 ( 한영변환키 사용가능 )

 

비밀번호 입력시에는 IME 가 작동하지 않는다. 

 

이렇게 어떤 입력창에 포커스가 맞냐에 따라 다르게 작동하는 것을 볼 수 있다.

여기서 잠깐 IME 에 대해 설명하자면

입력기 또는 입력 방식 편집기(input method editor, IME)는 한글, 한자처럼 컴퓨터 자판에 있는 글자보다 수가 더 많은 문자를 계산하거나 조합하여 입력해 주는 시스템 소프트웨어이다. <위키피디아 입력기>

 

즉 우리가 한글이나 히라가나 등 조합하여 쓰는 일반적이지 않은 키를 입력할 수 있도록 돕는 소프트웨어이다. 이 IME를 컨트롤 해주면 될 것 같다.

 

2. Unity 에서 IME 컨트롤하기

 

Input.imeCompositionMode

https://docs.unity3d.com/kr/530/ScriptReference/Input-imeCompositionMode.html

https://docs.unity3d.com/ScriptReference/Input-imeCompositionMode.html

 

Unity - 스크립팅 API: Input.imeCompositionMode

일부 언어들은 문자를 삽입하기 위해 창을 여는 기능을 포함한 여러 복잡한 입력 메소드를 이용합니다. 전형적으로 게임을 플레이 하는 동안에는 사용자의 키 입력이 텍스트가 아닌, 게임에 대

docs.unity3d.com

라는 메소드가 있다. 글을 읽어보면 알겠지만, 게임 플레이중에는 키보드 입력이 텍스트 (우리입장에서는 한글 같은 텍스트...)를 의도하는 것이 아니기 때문에 unity 에서 자동으로 IME 기능을 비활성화한다. 이게 디폴트인 Auto 모드다. 실제로 도큐먼트를 읽어보고 내 프로젝트를 실행해보니, inputFiled에 포커스가 맞을 때만 IME가 활성화되지 그 외에는 비활성화 된다...(신기방기)

IMECompositionMode.Auto -> Inputfield 에서만 IME 활성화
IMECompositionMode.Off / IMECompositionMode.On -> 명시적으로  IME 기능 비활성화 / 활성화

 

3. 적용하기

이벤트 콜백함수로 구현도 가능하지만... 나는 우선 릴리즈를 위해 & 기존 작업자가 구현해 둔 코드 구조 등등 여러가지 문제로 인해 TMP_inputField 객체의 isFoucused 프로퍼티를 사용했다. 

 

 

https://docs.unity3d.com/Packages/com.unity.textmeshpro@1.3/api/TMPro.TMP_InputField.html

 

 

Class TMP_InputField | TextMesh Pro | 1.3.0

Class TMP_InputField Editable text input field. Inheritance TMP_InputField Namespace: TMPro Assembly : solution.dll Syntax public class TMP_InputField : Selectable, IUpdateSelectedHandler, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerClickHand

docs.unity3d.com

public TMP_InputField pwInputField;
void Update() {
    if (pwInputField.isFocused) // password 에 포커스가 되어있을때
    {
        Input.imeCompositionMode = IMECompositionMode.Off;
    }
    else 
    {
        Input.imeCompositionMode = IMECompositionMode.Auto;
    }
} // 편의를 위해 축약하여 기재합니다.

 

구현 결과는 위와 같다. 지속적으로 프로퍼티 값을 확인해 줘야하기 때문에 Update문에 넣어줬다.

 

4. 마치면서

 

원래... 내 담당파트가 아니고 이번에 넘겨 받게 된부분이라... 처음 작업을 했는데 이것저것 inputFiled에 대한 이벤트가 많이 달려있었는데 죄다 Update에서 체크하고 있다... 이전 작업자도 사정이 있어 Update문에 다 넣은거겠지... 지금이라도 알게되었으니! 슬슬 시간 될 때마다 콜백으로 바꿔줘야지! (콜백러버 신난다! 야호!)

 

이벤트가 이렇게 잔뜩 있는데 왜 쓰질 못하니 왜!!!!