본문 바로가기
유니티 최고/유니티 구현

[Unity] 유니티 암호 입력 시스템구현에 대해서

by Lee_story_.. 2024. 11. 4.
728x90

 

이전 글에서 스토리 진행에 있어, 텍스트들을 출력할 수 있는 시스템을 만들어 보았습니다. 

 

단순한 텍스트 주르륵이 아닌,

대화의 부분들을 분리하여, 스페이스바를 이용해 대화 진행할 수 있도록 만드는 것을 목표로! 

TaskCompletionSource / Delay 등의 Task처리 방식들을 이용해서 만들어 보았습니다. 

 

 

이번에는 유사한 방식으로 암호 입력에 대해서, 간단하게 구현해보고,

 

 

 

 

또한 추가적인 방법들에 대해서도 생각한 내용들을 정리해보도록 하겠습니다!

 

 

 

그럼 시작!


먼저 암호 입력에 대해 생각해보면....

 

1. 암호 입력에 대한 이벤트 시작

2. 사용자의 암호 입력

3. 사용자의 암호입력 끝

4. 암호 확인 및 이벤트 시작

 

위와 같은 순서로 진행됩니다. 

 

여기서, 암호를 입력하는 동안 

 

카메라를 고정시켜 대기하는 느낌을 주거나,

Task처리를 통해 실제로 암호를 모두 입력할때까지 대기하게 하는 방법,

완료버튼을 따로 만들어 두는 방법 등

 

또 여러 갈래의 방법들이... 있는것 같습니다....

 

이번엔 유니티에서 암호입력에 대해서 구현하기 위한 방법들을 생각해보았습니다. 

 

1. 버튼 ui클릭  >> 입력

2. 레이캐스트를 이용한 오브젝트 클릭  >> 입력

3. 직접 입력

 

음.... 물론 더 많은 방법들이 존재하겠지만,

당장 생각나는 방법들은 3가지 정도...

 

 

 

여기까지의 내용들로,

이번글에서는 3가지 방법들을 어떻게 구현할것인지... 그리고 간단하게 코드까지 정리해보도록 하겠습니다. 

 

 


1번의 방법의 경우는 화면에 배치하거나,

아래처럼 World Space 즉 씬 자체에 캔버스를 배치하여 오브젝트마냥 상호작용 할 수 있게 만들어 구현 가능합니다.

 

 

이 방법에 대해서는 딱히...

각 버튼에 숫자나 텍스트에 대한 키를 부여하고,

 

각 버튼을 누르면 사용자의 입력칸에 텍스트가 추가되게끔 구성해주면 될 것 같습니다. 

사실상 가장 쉽거나.... 간단한! 방법인것 같습니다.  

 

 

 


 

2번의 레이캐스트 방식의 경우에는

마우스 클릭과 연계하여, 클릭한 부분에 대해서 특정 오브젝트가 있다면!   

아래처럼 특정한 함수를 발생시켜 사용할 수 있습니다. 

void Update()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Input.GetMouseButtonDown(0)){  // 마우스 왼쪽 버튼을 클릭했을 때 // 버튼 처리 
            if (Physics.Raycast(ray, out hit))
            {
                Collider collider = hit.collider;

                if (hit.collider.GetComponent<AgainBtn_Src>() != null) // 스크립 추출
                {
                    hit.collider.GetComponent<AgainBtn_Src>().BtnFun();  // 실행하고자 하는 함수!
                    StartCoroutine("WaitTime");
                }

 

이 방법또한 코드를 구성하고, 암호 입력을 생각해 보았을때 큰 문제는 없어 보입니다. 

 

단! 아래처럼 Layer가 Ignore Raycast로 설정되어 버리면 동작하지 않는다는 부분만 조심하면... 끝!

 

 

 


그리고 3번째... 직접입력 방식..

현재 진행중인 게임에선는 직접 입력 방식으로 진행해 주었는데,

위의 방법과 크게 다르지 않은 것 같습니다. 

 

암호 입력에 대한 시작 부분은 아래처럼 구성해 주었습니다. 

    private async Task Mission_input()
    {

        InputPassWord = true;

        await TextWait();
        
        InputPassWord = false;
        await passWordCheck();
        
	}

 

 

그리고 암호에 대한 Input 처리를 아래처럼 해주었습니다. 

if (Mission_Man.InputPassWord)
            {
                for (int i = 0; i <= 9; i++)
                {
                    KeyCode alphaKey = KeyCode.Alpha0 + i;       
                    KeyCode keypadKey = KeyCode.Keypad0 + i;
                    if (Input.GetKeyDown(alphaKey) || Input.GetKeyDown(keypadKey))
                    {
                        GameManager.instance.mission_man.TextInput(i.ToString());

                    }
                }

                if (Input.GetKeyDown(KeyCode.Backspace))
                {
                    GameManager.instance.mission_man.TextDel();
                }


                return;
            }

 

저는 상단의 숫자키와 우측의 키패드 숫자만을 이용해서 암호를 구성하였기에 위와 같이 구성할 수 있었고,

추가적으로, Backspace를 통해 암호를 수정할 수도 있게 구성하였습니다. 

 

그리고 마지막으로, 암호입력시 "대기" 하는 부분에 있어, 대기를 풀어주는 부분도 아래처럼 구현해 줄 수 있습니다. 

if (StageGame_Scr.ChoiceCompletionSource_Text != null && Input.GetKeyDown(KeyCode.Space)) // 텍스트 처리
        {
            StageGame_Scr.CompleteChoice_Text();
            return;
        }

 

 

이 부분에 대해서는 아래글에서 " TaskCompletionSource "에 대한 내용을 참고 해 주시면 될 것 같습니다. 

 

 

[Unity] 유니티 상호작용이 가능한 대화 시스템 구현[TaskCompletionSource를 이용한]

글들이 점점 뜸해지네요... 적을 것들은 많아지는데! 진행하는 프로젝트가 점점 길어져서.. 그래서 오늘은 끄적끄적거릴 준비 해왔습니다! 이번에 제작중인 게임은 약간의 스토리가 있는 공포

ljhyunstory.tistory.com

 

 

 

 

 

 

 

 

 

약간 설명이 아쉬운것 같지만.. .

단순히 암호입력에 대한 제 생각들과 구현방식에 대해서 정리해보았다고 생각하고, 읽어주시면 감사하겠습니다!

 

 

 

 

 

 

 

댓글