[4Idle-Gazzlers] 플레이어 왼손 구현 -1. 아이템 그랩/사용

컨트롤러 셋팅

-Gazzlers에서 손은 컨트롤러이다. Controller As hands가 아니라 단순 컨트롤러에서 고정된 모델이며, 그랩과 같은 상호작용을 할 때 애니메이션이 플레이되는 것이다.

-따라서 컨트롤러로 기본 환경 셋팅을 하였다.

-다음과 같이 컨트롤러 설정을 해준다.

-OVR Camera Rig를 추가하고, 하위에 OVRInteraction 프리팹도 넣어준 후 unpack한다.

-OVR Interaction의 자식으로는 OVRControllers를 넣어주어야한다.

-손 모델을 사용할것이므로 각각 컨트롤러의 ControllerVisual은 비활성화시켜준다.

-Camera Rig의 자식인 TrackingSpace는 컨트롤러의 위치를 받는다. 따라서 LeftHandAnchor와 RightHandAnchor에 준비한 손모델을 넣어준다. 이때 컨트롤러의 방향에 맞게 rotation을 수정해주었다.

손 모델을 컨트롤러의 방향에 맞게 넣어준 상태

 

Oculus Input

https://developer.oculus.com/documentation/unity/unity-ovrinput/

 

Map Controllers | Oculus Developers

 

developer.oculus.com

Accessed as a Combined Controller/ Accessed as Individual Controllers

 

 

왼손의 기능

 

LT- 1. 방패 2. 아이템 사용

=>

 1. 왼손의 Index트리거를 누르는 동안 방패가 왼손 앞에 생성된다. 플레이어는 방패로 적의 공격을 막을 수 있지만, 트리거에서 손을 떼는 순간 방패는 사라진다. 방패는 체력이 있으며 사용하는 동안에는 체력이 계속 소모된다. 트리거에서 손을 떼면 방패 체력이 자동으로 점점 충전되므로 방패의 체력을 관리해가며 플레이해야한다.

 2. 아이템을 그랩한 상태(Hand Trigger를 누르고있는 상태), 즉 손에 아이템을 들고있는 상태에서 Index 트리거를 누르면 들고있는 아이템을 사용할 수 있다.

 

LG-아이템 그랩

=> 왼손의 Hand Trigger를 누르면 손에서 쏜 ray가 아이템을 인식한 상태라면 인식한 아이템을 Grab할 수 있다. 즉, grab하며 애니메이션이 실행된다.

 

 

-컨트롤러의 그랩을 먼저 구현해준다. 그랩 기능을 구현하고, 모델의 손모양 변경은 그랩이 되는 순간에 발생되도록 한다.

 

컨트롤러의 그랩 기능 구현

 

https://developer.oculus.com/documentation/unity/unity-isdk-create-distance-grab-interactions/

 

Create Distance Grab Interactions | Oculus Developers

 

developer.oculus.com

-컨트롤러의 Distance 그랩 기능은 위의 document를 참고하였다.

 

-왼손에 넣을 것이므로, OVR Interaction> LeftController> ControllerInteractors의 하위에 ControllerDistanceGrabInteractor 프리팹을 찾아 넣어준다.

-추가한 ControllerDistanceGrabInteractor를 ControllerInteractors의 Best HoverInteractor Group의 Interactors의 요소로 추가한다.

-grab 되게 하려면 그랩 당할 오브젝트는 rigidbody와 grabbable 컴포넌트가 있어야한다.

-큐브의 자식으로 빈오브젝트를 생성하고, grabInteractable이라 명명한다.

-컴포넌트로 Distance Grab Interactable을 추가하고 cube를 할당한다.

-컴포넌트로 Auto Move Towards Target Provider도 추가한다.

-Auto Move Towards Target Provider의 Travel Speed 값이 클 수록 먼 거리에 있는 물체를 가져올 수 있다.

 

=> 이제 그랩 기능 자체는 구현 되었으므로, 그랩되는 순간 손 모델이 변경되도록 해야한다.

 

모델의 손모양 변경

 

-변경될 손 모델은 미리 생성시켜두고 비활성화해둔 후, 그랩 상태가 되면 활성화시킬 것이다.

-LeftHandAnchor에 Left Hand Controller 스크립트와 box Collider를 추가한다.

-콜라이더는 Is Trigger를 체크하고, OnTriggerEnter를 통해 그랩상태인지 확인할때 쓰인다.

=> 손이 물체를 잡고있다면 충돌반응이 있을 것이기 때문이다. 따라서 Hand Trigger를 누르고 있으면서 해당 물체와 충돌반응이 있으면 그랩상태인 것으로 간주한다.

-큐브의 태그를 Cube로 설정해주었다.

 

-grabGo를 선언한 이유는 충돌체크를 해서 그랩상태인지 확인하게 하는 역할이다.

=> OnTriggerExit으로 하면 제대로 되지않아 뒤에서 코드를 수정했다. GetUp될때 this.grabGo = null; 되도록하였다.

구현결과

 

 

아이템 사용

 

-체력 회복킷을 잡고, 사용(LT)할때의 연출이 필요하다.

=> 아이템을 그랩한 상태(왼손의 Hand Trigger를 누르고있는 상태), 즉 손에 아이템을 들고있는 상태에서 왼손의 Index 트리거를 누르면 들고있는 아이템을 사용할 수 있다.

-체력 회복 포션 모델을 준비하고 파티클 이펙트를 붙여주었다.

 

 

-포션에 grabbable 컴포넌트를 추가하고 , rigidbody와 콜라이더도 넣어준다. 

-IsTrigger와 IsKinematic을 체크해준다. 또한 포션의 태그는 Item으로 해준다.

-포션의 자식으로 큐브에 해줬던 것처럼 grabInteractable을 추가한다.

 

=> 포션의 파티클은 비활성화 시켜준다.

     잡고 있지 않을 때에는 이펙트가 나오지 않고, 잡으면 파티클 이펙트가 실행되어야한다.

 

-파티클 이펙트를 껐다켰다하기위해서는 grabGo의 자식 오브젝트에 접근해야한다.

=>이를 위해 GetComponentInChildren을 사용하였다.

 

https://docs.unity3d.com/ScriptReference/Component.GetComponentsInChildren.html

 

Unity - Scripting API: Component.GetComponentsInChildren

The typical usage for this method is to call it from a MonoBehaviour script (which itself is a type of component), to find references to other Components or MonoBehaviours attached to the same GameObject as that script, or its child GameObjects. In this ca

docs.unity3d.com

GetComponentInChildren<T>(bool includInactive)는 컴포넌트를 T로 받아 자식을 찾는다.

-includeInactive 인자를 생략하면 false값이 반영된다. 즉, 비활성화된 게임오브젝트의 컴포넌트는 반환하지 않는다.

-필자는 비활성화되어있는 상태의 자식을 찾고싶었으므로 true를 넣어주었다.

-아이템을 사용하고 나면 원래의 자리로 돌려놓기 위해서 itemTrans.position을 트리거 Up되는 부분에 작성하였다.

잡으면 이펙트 실행

-이펙트와 함께 실행될 애니메이션도 넣어주었다.

이펙트 + 애니메이션 추가 결과

myoskin