오큘러스 환경에서 유니티로 작업하기 위해서 오큘러스 SDK를 활용한다.
여기선 Integration SDK v57.0을 활용하여 작업을 하였다.
먼저 기존에 있던 메인카메라를 삭제하고 OVRCameraRig를 검색하여 가져 온다.
그 다음엔 OVRCameraRig에 LeftHandAnchor를 찾아서 OVRHandPrefab을 추가한다. 그리고 OVR Hand와 OVR Skeleton을 제외한 나머지 스크립트를 비활성화 한다.
RightHand에도 똑같이 적용한다. 이때 OVR Hand의 Hand Type과 OVR Skeleton의 Skeleton타입은 각각 Left Right로 설정한다.
그리고 OVRInteraction을 검색해서 OVRCameraRig의 자식으로 추가한다.
이제 물건을 집기 위한 손을 추가해주어야 한다.
여기서 세가지로 나뉘는데 손을 사용하겠다면 OVRHands, 컨트롤러를 손으로 사용하겠다면 OVRControllerHands 컨트롤러를 사용하겠다면 OVRControllers를 추가해주면 된다.
나는 OVRHands와 OVRControllerHands를 추가해주었다.
그리고 오브젝트간에 grab상호 작용을 하려면 집기위한 OVRInteraction과 집는 대상이 되는 오브젝트에 스크립트를 추가해주어야 한다. 먼저 OVRInteraction의 OVRHands와 OVRControllerHands에 스크립트를 추가해주자.
먼저 OVRHands의 아래의 LeftHand아래에 있는 HandInteractorsLeft에 HandGrabInteractor를 검색해서 넣어주자.
그 다음 HandInteractorsLeft를 눌러서 Interactors에 HandGrabInteractor를 추가해준다.
마찬가지로 좌우, OVRControllerHands에 똑같이 추가해주면 된다.
그리고 이제 집는 대상이 되는 물건에도 스크립트를 추가해주어야 한다.
나는 사과와 폭탄을 만들어서 집는 대상이 되는 오브젝트로 사용하였다.
이때 사과와 폭탄에 Rigidbody를 추가해주어야한다. 땅에 떨어지면 곤란하기 때문에 UseGravity는 언체크하였다.
집는 대상이 되는 오브젝트에는 Grabbable스크립트와 Grab Interactable스크립트를 추가해주면 되는데 집는 오브젝트가 손이나 컨트롤러를 손으로 쓰는 경우라면 Grab Interactable대신에 Hand Grab Interactable을
컨트롤러라면 Grab Interactable을 추가해주면 된다.
보통은 Grabbable을 추가하고 Hand Grab Interactable 스크립트를 추가하면 Pointable Element에 자동으로 스크립트가 들어가지만 아닐 경우 Grabbable을 추가하고 직접 넣어 주자.
폭탄에도 마찬가지로 적용해준다.
여기까지 했다면 사과와 폭탄을 집는 것 까진 문제가 없을 것이다.
이제 사과를 집으면 Apple을 폭탄을 집으면 Bomb를 출력되게 해보겠다.
오큘러스SDK에는 오브젝트와 상호작용할때 이벤트를 받는 스크립트가 있다. 사과와 폭탄에 Pointable Unity Event Wrapper 스크립트를 추가하면 오브젝트를 집을때마다 스크립트의 메서드를 호출하는 이벤트를 등록할 수 있다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Cube02 : MonoBehaviour
{
public void OnSelectedApple()
{
Debug.Log("apple");
}
public void OnSelectedBomb()
{
Debug.Log("bomb");
}
사과에 폭탄에 각각 When Select에 이벤트를 등록하였다. 이제 오브젝트가 Grab되면 Debug를 호출 할 것이다.
물론 유니티에서 출력한 Debug는 VR에서 눈으로 볼 수 없다. 그래서
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using TMPro;
using UnityEngine;
public class Test02Main : MonoBehaviour
{
[SerializeField]
private TMP_Text text;
private StringBuilder sb = new StringBuilder();
// Start is called before the first frame update
private void OnEnable()
{
Application.logMessageReceived += this.OnLogMessageReceived;
}
private void OnDisable()
{
Application.logMessageReceived += this.OnLogMessageReceived;
}
private void OnLogMessageReceived(string condition, string stackTrace, LogType type)
{
sb.Append(string.Format("{0},{1}", type, condition));
if (type == LogType.Error)
sb.Append(stackTrace);
sb.AppendLine();
if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger))
{
sb.Clear();
}
this.text.text = sb.ToString();
}
}
캔버스를 만든다음 캔버스에 Text를 추가해주어서 Text에 디버그 메시지를 넣어줄 예정이다 코드는 위처럼 유니티 로그 콜백을 이용하여 작성하였다.
이제 사과와 폭탄을 던질 수 있게 만들어 보자
집는 것 까지 헀다면 사과와 폭탄에 Physics Grabbable스크립트를 추가해주면 된다. 마찬가지로 Grabbable과 Rigidbody는 자동으로 추가되지만 추가되지 않았다면 직접 넣어주면 된다.
그리고 (Hand) Grab Interactable의 Optional의 Physics Grabbable 부분에 던질 오브젝트를 넣어 준다.
던질 때 속도를 계산해서 전달해줘야하기 때문에 OVRInteraction에도 프리펩을 추가해주어야 한다.
LeftHand밑에 HandVelocityCaculator를 검색해서 추가해주자
마찬가지로 RIghtHand와 OVRControllerHands에도 추가해주면 된다.
그리고 HandGrabInteractor의 Hand Grab Interactor스크립트의 Optional에 Velocity Calculator를 추가해준다.
여기까지 했다면 사과와 폭탄을 잡아서 던질 수 있다!
마지막으로 총을 추가해서 총을 잡았을때 핸드트리거를 당기면 총을 쏠 수 있게 할 것이다.
총은 에셋스토어의 무료에셋 Bit Gun을 사용하였다.
스크립트는 다음과 같이 작성하였고,
총에도 아까 사과와 폭탄에 해준 것 처럼 Physics Grabbable을 제외한 스크립트를 달아 주었다.
총알은 간단하게 Sphere를 만든 다음 사이즈를 줄여서 사용하였다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Gun : MonoBehaviour
{
[SerializeField]
private GameObject bullet;
[SerializeField]
private Transform firePos;
void Update()
{
if(OVRInput.Get(OVRInput.Button.SecondaryIndexTrigger)){
if (OVRInput.GetDown(OVRInput.Button.SecondaryHandTrigger))
{
Instantiate(bullet, this.firePos.position, this.firePos.rotation);
}
}
}
}
좀 흐리지만 총알에 발사되는 것을 볼 수 있다.
'VR 콘텐츠 제작' 카테고리의 다른 글
디스크 골프 [#1] - 프리스비 운동 R&D (0) | 2023.11.08 |
---|---|
[Unity VR]애니메이션을 이용해서 커스텀 핸드포즈 만들기 (0) | 2023.11.02 |
[Unity VR]오큘러스 개발을 위한 초기 설정 (0) | 2023.10.26 |
[Unity VR]오큘러스에서 DistanceGrab / GhostReticle 만들기 (0) | 2023.10.25 |
[Unity VR]오큘러스 OVRCameraRig의 Tracking Origin Type 매개변수의 차이 (0) | 2023.10.23 |