VR 방탈출 프로젝트 (2) 기초 기능 구현

최재영·2024년 5월 12일
0

Unity VR

목록 보기
2/2

지난 포스트

VR을 활용한 방탈출 프로젝트 개발내용을 정리한 내용입니다.

Interaction Toolkit 의 버전은 2.4.3 버전을 사용했습니다.

이번 VR 방탈출의 요구사항 은 다음과 같았다

  • 캐릭터 이동
  • 맵 이동 텔레포트 (메인방 - 방1 - 방2 - 방3)
  • 대사 창 출력
  • 키패드 입력

기본 세팅

기본 세팅

캐릭터 이동

요구사항 : VR로 움직일 수 있는 1인칭 플레이어 구현
아이디어 : Locomotion, Continuous Turn Provider 활용

  • XR origin 에 Locomotion, Continuous Turn Provider 추가

맵 텔레포트 이동

요구사항 : 각 맵을 이동하는 텔레포트 기능 구현
아이디어 : Teleportation Provider 를 활용하거나, ColliderTransform 이동으로 구현

  • XR origin 에 Teleportation Provider 추가

  • XR > Teleportation Anchor 또는 Teleportation Area 생성

대사창 출력

요구사항 : 대화가 아닌 대사만 존재하는 UI를 출력하는 기능을 만들기
아이디어 : XR Simple Interactable 에 있는 Gaze Hover 기능 사용하기

  1. 컨트롤러로 대상을 지정하고 있을 때, UI를 띄워줄 오브젝트에 XR Simple Interactable 를 추가
  2. Gaze Configuration 항목의 Allow Gaze Interaction 체크
  3. Interactable EventsFirst Hover Entered 에 띄울 오브젝트를 넣고 SetActive를 true, Last Hover Exited 에 같은 오브젝트를 넣고 SetActive를 false

키패드 입력

  • 간단하게 키패드 모양을 만들어주고 Keypad 스크립트를 추가했다.

  • 각 Button에는 XRSimpleInteractable를 추가하고, Select Entered에 Keypad의 InputCode를 넣어주었다. (파라미터는 각 숫자값)

  • 지우기 버튼에는 EraseCode, OK버튼에는 ConfirmCode를 연결해서 비밀번호 맞춤여부를 확인하도록 작성했다.

Keypad.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class Keypad : MonoBehaviour
{
    public TextMeshProUGUI code;
    string codeTextDefault = "____";
    string codeTextAnswer = "1234";
    bool isDone = false;
    public List<string> codeList = new List<string>();

    public void InputCode(int code)
    {
        if (isDone) return;
        if (codeList.Count >= 4)
        {
            return;
        }
        else
        {
            codeList.Add(code.ToString());
            UpdateCode();
        }
    }

    public void UpdateCode()
    {
        code.text = "";
        for (int i = 0; i < codeList.Count; i++)
        {
            code.text += codeList[i];

        }
        for (int i = codeList.Count; i < 4; i++)
        {
            code.text += "_";
        }
    }

    public void ConfirmCode()
    {
        if (isDone) return;
        if (code.text == codeTextAnswer)
        {
            isDone = true;
            // 정답처리 기능
            code.text = "PASS";
        }
        else
        {
            code.text = codeTextDefault;
            codeList = new List<string>();
        }
    }

    public void EraseCode()
    {
        if (isDone) return;
        if (codeList.Count >= 1)
        {
            codeList.RemoveAt(codeList.Count - 1);
            UpdateCode();
        }
    }
}

결과

profile
게임 개발자

0개의 댓글