이번에는 메타 퀘스트 2를 이용하여 오브젝트와 상호작용을 통해 씬을 이동하는 것을 구현해보도록 하겠습니다!
https://newkimjiwon.tistory.com/203
https://newkimjiwon.tistory.com/221
기본적으로 메타 퀘스트를 이용하여 프로젝트를 구축을 하셔야 이 작업을 진행할 수 있습니다
목표
그림에서 보이는 것처럼 씬에 나와있는 카메라 박스(Main Camera)부분에서 레이캐스트를 쏴서 저기 공중에 있는 Plane(3D 오브젝트)와 부딪치면 씬이 이동하도록 설정할 예정입니다.
XR Origin 설정
우선 전에 구축했던 VR 프로젝트 구축-2에서 가져온 OVR Manager를 가져와서 컴포넌트를 XR Origin에 추가 해줍시다. 이걸 안해주시면 컨트롤러가 키 입력을 인식 못하니깐 꼭 해주셔야 합니다.
우선 오른쪽 컨트롤러를 눌러서
현재 이 컴포넌트를 만들어서 추가해줄 예정입니다. (아직 만들지 않아서 당연하게도 없습니다)
그럼 ovrtest라는 스크립트가 필요하므로 스크립트를 만들어보겠습니다.
저는 에셋 파일안에 Scripts라는 폴더를 만들어서 여기에 각 기능 별로 스크립트를 저장하고 있습니다.
여기서 빈 공간에 우클릭을 누르면
이러한 화면이 뜰텐데 C# Script를 생성해주도록 하겠습니다.
코드는 다음과 같습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ovrtest : MonoBehaviour
{
// Right Controller의 트랜스폼 (XR Origin의 Right Controller 참조)
public Transform ControllerTransform;
// 매 프레임 업데이트
void Update()
{
BtnDown();
}
// 버튼 입력 처리
void BtnDown()
{
// A 버튼 한 번 눌렀을 때
if (OVRInput.GetDown(OVRInput.Button.One))
{
HandleClick();
Debug.Log("A 버튼 클릭 감지"); // A 버튼 클릭 시 로그 추가
}
// B 버튼 한 번 눌렀을 때
if (OVRInput.GetDown(OVRInput.Button.Two))
{
Debug.Log("B 버튼 클릭 감지"); // B 버튼 클릭 시 로그 추가
HandleClick();
}
}
// 클릭 처리 함수 (레이캐스트를 사용해 오브젝트 클릭 감지)
void HandleClick()
{
RaycastHit hit;
// 컨트롤러의 위치에서 컨트롤러가 보는 방향으로 레이 발사
Ray ray = new Ray(ControllerTransform.position, ControllerTransform.forward);
// 레이를 시각적으로 그립니다 (길이를 1000으로 설정)
Debug.DrawRay(ControllerTransform.position, ControllerTransform.forward * 3000, Color.red, 15.0f);
// 레이가 충돌한 오브젝트 확인
if (Physics.Raycast(ray, out hit, 1000)) // Raycast의 거리도 1000으로 설정
{
Debug.Log("Hit object: " + hit.collider.name); // 충돌한 오브젝트 이름 출력
// 충돌한 오브젝트에 ObjectClick 컴포넌트가 있는지 확인
ObjectClick objectClick = hit.collider.GetComponent<ObjectClick>();
if (objectClick != null)
{
objectClick.LoadScene(); // 클릭된 오브젝트의 LoadScene 메서드 호출
}
}
}
}
A, B 버튼을 눌렀을 때 레이가 발사되도록 설정 했습니다.
그럼 이제 레이가 충돌한 오브젝트를 생성해야 하므로 작업을 이어가보겠습니다.
다시 Hierarchy로 돌아와서 3D Object-Plane를 생성하도록 하겠습니다.
이렇게 카메라에서 잘 보일 수 있도록 설정 해줍니다.
그리고 부딪쳤을 때 씬을 이동해야 하므로 이것또한 스크립트를 작성해야합니다.
Plane에 넣을 스크립트는 다음과 같습니다.
using UnityEngine;
using UnityEngine.SceneManagement;
public class ObjectClick : MonoBehaviour
{
public string sceneName; // 유니티 인스펙터에서 씬 이름을 설정할 수 있음
// 씬을 전환하는 메서드
public void LoadScene()
{
// 씬을 로드하는 코드 (예시)
UnityEngine.SceneManagement.SceneManager.LoadScene(sceneName);
}
}
Box Collider는 레이 캐스트와 충돌을 확인하기 위해서 필요합니다. 그리고 위에서 작성한 Object Click를 추가해줍시다.
마찬가지로 오른쪽 컨트롤러도 설정해주셔야합니다.
이렇게 컴포넌트를 추가하고 나면 기본적 세팅은 끝나게 됩니다.
이제 프로젝트가 다른 씬을 인식하도록 알려줘야 합니다.
File-Build Settings에 들어가서
위처럼 Scenes In Build에 씬을 추가 해줍시다. 그리고 안드로이드로 빌드 하시는 분은 Oculus SDK와 호환성을 보장하기 위해서 API 레벨이 23으로 설정되야 하므로 Player Settings...에 들어가셔서 설정해주셔야 합니다.
모든 설정이 끝났습니다. 이제 작동해보시면 구현이 되는 것을 알 수 있습니다.
구현
실제로 이렇게 잘 나가고 있다는 것을 알 수 있습니다. 만약 인식 못하시면 콘솔창에서 직접 한 번씩 확인 해보시면 됩니다.
(보실 때는 멈추고 Game -> Scene으로 넘어 가셔야 볼 수 있습니다)
이렇게 잘 이동한 모습을 볼 수 있습니다.
감사합니다!
'소프트웨어 개발 > Unity' 카테고리의 다른 글
[Unity] 유니티에서 XR(메타 퀘스트 2)에서 구글 STT(Speech To Text) 사용하기 (1) | 2024.11.15 |
---|---|
[Unity] Unity Scenes 조명 바꾸는 법 (0) | 2024.11.15 |
[Unity] Meta Quest 2 VR 프로젝트 구축-2 (2) | 2024.09.25 |
[Unity] 3D - 360도 HDRI 배경 적용하기 (2) | 2024.09.12 |
[Unity] 3D 모델 다운로드 / 이용하기 사이트 정리 (1) | 2024.09.09 |