오큘러스 퀘스트2 가상키보드 - okyulleoseu kweseuteu2 gasangkibodeu

LOU

  • 태그

프로그래밍/Unity

Lou Park 2021. 12. 11. 15:32

Oculus Integration 패키지를 임포트 한 뒤 아래 절차를 따르면 된다.

https://developer.oculus.com/documentation/unity/unity-keyboard-overlay/

저작자표시

'프로그래밍 > Unity' 카테고리의 다른 글

Unity 생명주기에 관해 알아보자  (0)2022.03.19
[Unity] 벡터의 내적 Vector2D, Vector3D  (0)2021.12.18
Unity 로그인 창 만들기 - Tab으로 Input field 이동  (0)2021.09.21
Unity UI for VR  (0)2021.09.20
Unity XR Toolkit 활용 이동(Locomotion) 구현하기  (0)2021.09.11

'프로그래밍/Unity'의 다른글

  • 이전글Unity 로그인 창 만들기 - Tab으로 Input field 이동
  • 현재글Unity에서 Oculus 기본 키보드 열기
  • 다음글[Unity] 벡터의 내적 Vector2D, Vector3D

관련글

  • Unity 생명주기에 관해 알아보자 2022.03.19

  • [Unity] 벡터의 내적 Vector2D, Vector3D 2021.12.18

  • Unity 로그인 창 만들기 - Tab으로 Input field 이동 2021.09.21

  • Unity UI for VR 2021.09.20

댓글 0

    비밀글

    마이너 갤러리 이슈박스, 최근방문 갤러리

    마이너 갤러리 소개

    부매니저

    토오오오오카(hhhmmm98) 아기단또(growtopi…) 파아딱(vrgame) LR44(kokontsi…) 씨젠(mikibug1) 오큘퀘2(gnt74111)

    갤러리 본문 영역

    [📚정보] 퀘스트에서 현실 키보드를 사용해보자 Keyboard Overlay

    브이로그

    오큘러스 퀘스트2 가상키보드 - okyulleoseu kweseuteu2 gasangkibodeu
    2020.10.29 23:14:18

    https://www.oculus.com/experiences/quest/2849273531812512/?locale=ko_KR

    퀘스트 무료앱인 immersed는 데스크탑 화면을 vr로 옮겨서 각종 작업을 할 수 있게 해준다

    말하자면 스팀vr기능이 없는 버추얼 데스크탑이라고 할 수 있는데

    무료 상태에선 기본적으로 pc 화면을 VR에서 2개까지 띄울 수 있고(추가 하드웨어가없는 추가 가상 화면)

    스카이프등에 쓸 수 있는 가상웹캠, 퍼블릭 공간에서 다른사람들과 함께 작업할 수 있는 기능등을 제공하며

    엘리트로 업그레이드 하면 가상 모니터는 5개로 늘어나고 동시에 2대 이상의 컴퓨터를 사용하거나 화이트 보드,

    4명까지와의 비공개 공간 등등에 팀으로 업그레이드하면 12명까지로 늘어나고..

    하여튼 vr로 pc와 연결하여 작업할때 유용한 유틸리티 앱이라과 할 수 있다

    https://youtu.be/vB4Sp1b_5hc

    그리고 오늘 가상 키보드 오버레이 기능을 제공하기 시작했는데

    https://youtu.be/krnuV72-b7s

    보는바와 같이 내가 사용하는 키보드에 덧입혀서 vr공간에서도 쓸 수 있게 해주는 것이다

    오큘러스에서 업데이트 예정인 인피니트 오피스의 정식 키보드 지원과는 다른 방식이지만

    경우에 따라서는 오큘러스에서 지원되는 키보드가 아닌 키보드로도 작업이 가능하니

    나름 쓸만한 기능이 아닐까 싶다

    추천 비추천

    13

    오큘러스 퀘스트2 가상키보드 - okyulleoseu kweseuteu2 gasangkibodeu
    6

    하단 갤러리 리스트 영역

    왼쪽 컨텐츠 영역

    갤러리 리스트 영역

    갤러리 내부 검색

    오른쪽 컨텐츠 영역

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

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

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

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

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

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

    오큘러스 퀘스트2 가상키보드 - okyulleoseu kweseuteu2 gasangkibodeu

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

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

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

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

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


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

    오큘러스 퀘스트2 가상키보드 - okyulleoseu kweseuteu2 gasangkibodeu

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

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

    키보드프리팹을 살펴보면

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

    오큘러스 퀘스트2 가상키보드 - okyulleoseu kweseuteu2 gasangkibodeu

    인스펙터창에서 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 부분에 함수들을 연결해준다.

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

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

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