Unity/VR

STEAM VR LinearDrive.cs 완벽 이해

공훈이 2023. 7. 2. 18:23
반응형

Unity 3D에서 SteamVR을 사용하여 가상현실 콘텐츠를 구현하기 위해서는 SteamVR에 제공되는 플러그인을 활용하여 가상 오브젝트를 제어할 수 있는 콘텐츠를 구현할 수 있습니다.  

준비

AssetsStore - SteamVR Plugin

LinearDrive.cs

사용자의 손(컨트롤러)의 선형 이동을 구현시켜 주는 클래스.

물체를 잡고 자연스러운 위치 이동(움직임)을 구현할 수 있다.

역할 

1. 사용자의 손(컨트롤러) 움직임에 따라 물체가 일관된 속도로 따라 움직이게 구현된다. 이를 통해 현실과 유사한 객체를 드는 행위를 구현할 수 있다. 

2. 사용자의 입력값(Trigger Button)을 받아 여부를 판단하고 상호작용 기능이 구현된다. 

Inspector )

StartPosition, EndPosition

객체의 움직임 범위를 정한다. 시작점과 도착점의 Transform 값을 설정해서 범위 내에 움직임을 구현한다. 

 

Linear Mapping 

LinearDrive 클래스 내부에 있는 중첩 클래스로 선형 움직임을 하는 데 있어서 입력값을 특정범위로 변환하여 원하는 출력 값으로 매핑 하는데 사용된다. 입력값을 다른 형식으로 변환하고자 할 때 사용한다.

 

RepositionGameObject

사용자 손(컨트롤러)과 움직임을 같이 할 건지 결정할 때 사용 True : 객체를 잡고 움직였을 때 손(컨트롤러)과 같이 움직이게 된다. False : 손(컨트롤러)과 별도로 해제되어 움직이게 된다.

 

MaintainMomemntum

컨트롤러움직임이 해제된 후에 사용자의 입력이 없을 때에도 잡히는 객체가 운동량을 유지해야 되는지 여부를 체크

 

MomemtumDampenRate

컨트롤러와 움직임을 진행 후 시간이 지남에 따라 얼마나 빠르게 운동량이 감소하는지를 결정한다. 값이 높아질수록 더 빨리 감속되어 운동량이 저하된다.

 

주의사항 

> 객체 위치 설정을 정확하게 설정해야 된다. 시작점(StartPosition), 도착점(EndPosition) 값이 정확해야 자연스러운 움직임이 구현된다. (시작점과 도착점 이내에 객체가 위치해 있어야 된다.)

 

> 객체의 움직임 역할이 다 끝났을 때에는 RepositionGameObject를 해지해서 입력값 관여를 안 받도록 하는 게 좋다. 

사용방법

    public LinearDrive linearDrive; // LinearDrive 클래스의 인스턴스

    private bool isInteracting = false; // 상호작용 중인지 여부를 나타내는 변수

    private void Start()
    {
        // LinearDrive 클래스의 옵션 설정
        linearDrive.RepositionGameObject = true;
        linearDrive.MaintainMomentum = true;
        linearDrive.MomentumDampenRate = 0.5f;

        // 상호작용 시작 이벤트 등록
        linearDrive.OnLinearDriveStart += OnLinearDriveStart;
        // 상호작용 종료 이벤트 등록
        linearDrive.OnLinearDriveEnd += OnLinearDriveEnd;
    }

    private void OnLinearDriveStart()
    {
        // 상호작용이 시작되면 호출되는 메서드
        isInteracting = true;
        Debug.Log("Interaction started!");
    }

    private void OnLinearDriveEnd()
    {
        // 상호작용이 종료되면 호출되는 메서드
        isInteracting = false;
        Debug.Log("Interaction ended!");
    }

    private void Update()
    {
        if (isInteracting)
        {
            // 상호작용 중에 수행할 로직을 구현
            // 예: 상호작용 중인 오브젝트의 위치나 상태를 업데이트
        }
    }

반응형