본문 바로가기
VR/기본기

VR 가상키보드 사용하기 : VRKB

by TODAYCODE 2021. 6. 4.
반응형

PC로 게임을 할 때는 당연히 키보드가 존재하기 때문에 문자를 입력하는데 문제가 없다.

 

반면에 VR은 게임 상에서 문자 입력을 받을 수 있는 가상의 키보드를 구현해야만 한다.

 

문자 입력을 받기 위한 여러가지 방법이 있는데,

나는 유니티 에셋스토어에 판매중인 가상키보드를 사용했다.

 

VRKB:Virtual Reality Keyboard 라는 이름의 에셋으로

현재 10달러에 판매중이다.

키보드를 처음부터 만들어낼 사람은 직접 만들어서 돈 아끼면 되고,

키보드를 직접 만드는 게 생각보다 굉장히 번거로울 것 같은 사람이면

그냥 10달러를 내고 사는 걸 추천한다.

 

 

아무튼 에셋을 구매했다고해서 그냥 곧장 사용할 수 있는 것은 아니다.

본인이 작업하고 있는 환경에 맞게 커스텀해야 한다.

 


해당 에셋을 유니티로 가져오면 데모씬을 볼 수 있다.

Prefabs 폴더에 존재하는 Prefab들을 사용해도 되고,

데모씬에서 곧장 들고가도 된다.

 

키보드프리팹을 살펴보면

Keyboard Behaviour라는 스크립트가 붙어있다.

인스펙터창에서 Keyboard Behaviour 스크립트를 잘 보면

Event Callbacks라는 부분이 존재하고 펼쳐보면 위 사진처럼 쫙 나열된다.

 

이름 그대로,

On Key Press / On Cancel / On Confirm 에 적당한 함수를 등록해서

키가 눌릴 때, 취소할 때, 엔터를 칠 때 동작할 명령어들을 입력할 수 있다.

 

가상키보드를 두드리면 키보드 바로 위에 있는

미리보기 창에 입력한 텍스트가 표시된다.

여기서 엔터(초록색체크표시버튼)을 누르면

On confirm에 등록된 명령어가 동작한다.

 

그리고 그 명령어가 미리보기에 표시된 텍스트를

진짜 입력해야할 곳으로 보내주는 역할이다.

 

데모씬에서는 그 역할을

On confirm에 연결되어있는

HelloCanvasBehaviour.SetName 함수가 수행하고 있으므로

해당 스크립트를 열어서 확인해보자

 

해당 부분은 대충 이런식으로 되어있다


public void SetName(string name)
    {
        if (name == null || name.Length == 0)
            name = "<blank>";

        TextMeshProUGUI textField = GetComponentInChildren<TextMeshProUGUI>();
        textField.text = string.Format("Hello, {0}!", name);
    }

데모씬을 같이 살펴보면 어떤 식으로 텍스트가 뜨는지 더 직관적으로 볼 수 있다.


이걸 사용하거나 참고해서 코드를 만들어주면 된다.

 

 

나는 이전에 VR 마우스로 UI 상호작용을 하는 스크립트에 위의 함수를 추가해줬다.

2021.06.03 - [VR] - VR 마우스 구현 - UI와 상호작용하기

위 글에 전문 코드가 존재한다.

 

 

1. 텍스트를 입력 받아야할 InputField에 Collider를 넣었다

그래야만 VR이 ray를 쐈을 때 오브젝트를 인식할 수 있다.

인식하는 기본적인 방법은

바로 위에 링크해 둔 이전글을 확인하자.

그리고 아래 2번 항목을 참고해서 커스텀한다.

 

 

2. InputField가 VR에서 인식되도록 만들어준다

 

VR에서 버튼을 인식했을 때처럼

inputfield인식을 만들어준다.


inputtext = hit.transform.GetComponent<InputField>();
   if (inputtext != null)
     {   
      keyboard.SetActive(true);
     }

InputField inputtext로 선언해서 전역변수로 선언한다.

vr에서 ray를 쏴서 hit된 오브젝트를 inputtext에 담아준다.

이러면 여러개의 인풋필드 중 내가 선택한 인풋필드가 담기게 된다.

 

그리고 나서 inputtext가 null 아니라면,

(  = inputtext가 존재한다면 = 내가 선택한 것이 inputtext라면 )

키보드를 활성화 해준다.

 

키보드는 public써서 유니티에서 키보드 프리팹을 넣어줬다.

실제로는 키보드를 VR상에서 타이핑할 수 있는 MalletPrefab도 활성화해줬다.

 

이러면 VR로 인풋필드를 선택하는 순간

입력하기 위한 키보드가 나타나게 된다.

 

 

3. 키보드에서 입력한 텍스트가 입력되는 함수를 만든다

 

2번에서 작성하는 스크립트에 다음 코드를 추가해준다.


public void SetText(string t)
    {
        if(inputtext != null)
        {
            inputtext.text = t;
        }
    }

inputtext는 아까 선언해준 녀석이다.

만약 vr로 inputfield를 잘 받아왔다면 null이 아니게 된다.

null이 아니라면 inputtext의 text에 t를 넣어준다.

t는 string 값으로 입력받을 수 있게 만들어준다.

 

따라서,

SetText(입력할 텍스트 내용);

이렇게 할 경우

선택된 인풋필드에 '입력할 텍스트 내용'이 기입되게 된다.

 

그리고 이전 글을 봤다면 알겠지만,

해당 스크립트를 싱글톤으로 설정한다고 했다.

그러므로 다른 스크립트에서도 SetText 함수를 불러와서 사용할 수 있게 된다.

 

 

4. 키보드에 넣어줄 스크립트를 생성한다.

거의 다 됐다.

이제 키보드프리팹에 넣어줄 스크립트를 만들어준다.

여기 스크립트에는 엔터를 치거나 취소를 했을 때 이뤄져야할 작업들을 코드로 만들어줘야한다.


    public void SetText(string text)
    {
        VRUIRay.instance.SetText(text);
      
    }
    public void InputEnd()
    {
        keyboard.SetActive(false);
    }

해당 스크립트에 이런 코드들을 적어줬다.

SetText 함수를 보자면,

이제 이 함수를 맨처음에 봤었던 On Confirm 부분에 연결할 것이다.

함수 안에는 싱글톤으로 만들어줬었던 스크립트에서

아까 만든 SetText 함수를 실행시킨다.

그럼 자연스럽게 인풋필드에 타이핑했던 텍스트들이 옮겨져 오게 된다.

 

InputEnd함수는 키보드를 끄는 내용을 적어준다.

나는 엔터를 쳤을 때 이 함수를 실행하도록 했다.

그러면 텍스트가 입력되면서 키보드도 꺼지게 된다.

 

함수들의 입력이 끝났으면,

아까 맨처음 OnConfirm 부분에 함수들을 연결해준다.

다른 부분들에 연결하고싶거나

다른 기능을 추가하고 싶다면

본인 상황에 맞게 적절히 적용해주면 된다.

반응형

'VR > 기본기' 카테고리의 다른 글

VR 마우스 구현 - UI와 상호작용하기  (0) 2021.06.03
유니티에서 오큘러스 VR 세팅하기  (2) 2021.05.31

댓글