본문 바로가기
IT

[유니티/VR 콘텐츠 제작] 6. 소켓 상호작용 만들기 + 버튼 상호작용 만들기

by 배애앰이 좋아 2024. 2. 6.
반응형

 

목표 : 유니티 VR 콘텐츠 제작하는 방법에 대해 알아봅시다.

 

https://www.youtube.com/watch?v=pm9W7r9BGiA&list=PLpEoiloH-4eM-fykn_3_QcJ-A_MIJF5B9&index=3

영상을 기반으로 작성된 글입니다.

사용한 유니티 버전 : 2022.3.16f
사용한 VR 기기 : meta quest 3

 

 

1. 소켓 상호작용 만들기

 

아래 주소 폴더에 있는 소켓 오브젝트를 함선 내에 추가해줍니다.

 

상호작용했을 때 뜨는 물체에 대해 알아볼 수 있도록 material 를 다음과 같이 생성하여 설정해줍니다.

 

새롭게 socket interaction 오브젝트를 만든 후 위치는 소켓 위치로 맞춰주고 위에서 만든 material 를 넣어주고 collider를 추가해줍니다. 아래 사진에서는 크기를 0.01로 했는데 원래 0.1입니다.

 

그 다음 위에서 만든 오브젝트의 크기를 유지해주기 위해서 위에 소켓 오브젝트 바로 집어넣지 않고 Energy Analyzer 라는 오브젝트를 만들고 소켓 오브젝트와 socket interaction 를 하위 객체로 둡니다.

 

다시 아래처럼 socket interaction 의 오브젝트 위치와 크기를 조정해줍니다.

 

이 다음에 테스트해보면 잘 되는 것을 확인할 수 있습니다. 

다만 현재 모든 오브젝트가 되기 때문에 저희는 돌에서 나온 energy만 가능할 수 있도록 바꿔줍니다.

 

먼저 돌에서 나오는 energy 의 태그를 아래처럼 바꿔주고

 

아래 스크립트를 새롭게 생성해줍니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;

public class XRSocketTagInteraction : XRSocketInteractor
{
    public string targetTag;

    public override bool CanHover(IXRHoverInteractable interactable)
    {
        return base.CanHover(interactable) && interactable.transform.tag == targetTag;
    }

    public override bool CanSelect(IXRSelectInteractable interactable)
    {
        return base.CanSelect(interactable) && interactable.transform.tag == targetTag;
    }
}

 

socket interaction 에서 기존 스크립트를 지워주고 위에 새롭게 생성한 스크립트를 붙이면 아래와 같이 뜨게 됩니다. 그 이유는 XRSocketInteractor 상속받고 오버라이딩 했기 때문입니다. 추가적으로 tag 에 energy 를 적어줍니다.

 

테스트 결과, energy 만 반응해서 잘 작동하는 것을 확인할 수 있습니다.

 

 

2. 버튼 상호작용 만들기 

 

아래와 같이 큐브와 아래 주소 버튼을 이용해서 버튼을 누를 수 있는 대를 생성해줍니다.

 

그 다음 poke interaction 할 때 반응하기 하기 위해, 왼쪽 컨트롤러에 아래와 같이 새롭게 interaction 을 추가한 후 설정 해줍니다. 여기서 attach transform 누르는 위치로 저희는 검지 끝 쪽을 잡아주었습니다.

 

마찬가지로 반대 쪽도 똑같이 설정 후 위치만 바꿔줍니다.

 

다시 버튼으로 돌아와서 아래와 같이 컴포넌트 설정을 해줍니다.

 

버튼을 누르면 문을 열리게 하고 싶기 때문에 문 오브젝트를 파악해서 애니메이션을 확인합니다.

 

원래는 사용자가 근처 있을 때 열리도록 설정했지만 저희는 이름을 Open 으로 바꿔주고 bool 열리도록 작동해줍니다.

 

아래와 같이 새로운 스크립트를 생성해줍니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.Interaction.Toolkit;

public class buttonPushOpenDoor : MonoBehaviour
{
    public Animator animator;
    public string boolName = "Open";

    void Start(){
        GetComponent<XRSimpleInteractable>().selectEntered.AddListener(x => ToogleDoorOpen());
    }

    public void ToogleDoorOpen(){
        bool isOpen = animator.GetBool(boolName);
        animator.SetBool(boolName, !isOpen);
    }
}

 

해당 스크립트를 버튼에 붙여준 후 아까 전에 찾은 문 animator 과 연결해줍니다.

 

추가적으로 해당 버튼은 현재 어떤 동작이던 간에 상호작용하게 되어 있는데 사용자 poke 동작을 했을 때만 반응하게 하고 싶다면 아래와 같이 바꿔줍니다.

 

또한, 위에서 추가했던 poke interactor 또한 layer mask 를 바꿔줍니다.

 

테스트 결과, 버튼을 누르면 잘 열리는 것을 확인할 수 있습니다!

반응형

댓글