Unity/Dev

[Unity] 물 속에서 grab하면 물 구체가 잡히는 interaction 구현하기 (1)

_GyC_ 2023. 1. 16. 16:42

XREAL 학회에서 진행 중인 Morphai 프로젝트에서 제목의 내용의 퍼즐 구현을 맡았다.

이번에 구현하려는 interaction은 다음과 같이 개발하려고 한다.

 

1. 컨트롤러가 물 collider에 enter하면 물이 grab가능한 상태.

2. 물 collider에 enter한 채로 grab을 하면 deactivate되어 있던 물 구체가 activate되어 grab됨.

(실제로 grab하지 않았는데 물 구체가 grab되도록 할 수 있을까..? -- 리서칭 필요)


오늘은 일단 이 두단계를 완성시키는 것이 목표,

 

일단 허접(?)하게 플레이어와 물 배치.

쭈구려서 테스트하기 싫기 때문에 위쪽에 배치했다.

물 cube는 collider만 부착된 상태.


A. 컨트롤러가 물 cube collider에 enter한 것을 감지하기 

일단 당연히 ColliderEnter 함수를 사용해서 스크립트를 작성하자. 스크립트는 물 cube에 붙인다.

 

대략적인 코드는 아래와 같다.

Water Cube는 trigger이고

ControllerGrabLocation도 trigger이면서 rigidbody가 부착되어 있다.

 

grabbable이 컨트롤러가 물에 들어가있는지 아닌지를 알려준다.

 

!중요!

OnTriggerEnter 또는 OnCollisionEnter를 사용하려면 둘 중 하나는 rigidbody가 있어야한다.

 

*다시 생각해보니 스크립트는 controller에 붙여야 할 것 같다.

컨트롤러는 Left and Right 두 개이기도 하고 trigger enter 상태에서 grab을 했는지 안했는지도 체크해야하기 때문에 컨트롤러에 붙여야 더 편리할 것 같음.


B. 컨트롤러로 그랩 중인지 아닌지 감지하기

그랩을 갑지하기 위해서는 먼저 [InputOVR>Controllers>Left/RightController>ControllerInteractors>ControllerGrabInteractor] 컴포넌트를 확인해야했다.

'Controller Selector'라는 스크립트가 있었고 쭉 정독한 결과 'selected'와 '_selected' boolean이 grab button을 누르고 있는지 아닌지 알려줬다.

 

즉, selected = true이면 grab button을 누른 상태이고, selected = false이면 grab button을 누르지 않은 상태이다.

 

이렇게 간단히 디버깅해보면서 확인했다.

이제, 이 'selected'라는 boolean을 이요하여 물속에서 grab button을 눌렀을 때를 감지하면 된다.


C. 물에 컨트롤러를 넣은 상태로 그랩 버튼을 눌렀는지 감지

A의 'grabbable'과 B의 'selected'를 조합하여 알 수 있다.

즉,. grabbable = true이고 selected = true일 때 컨트롤러가 물 속에 있을 때 그랩 버튼을 눌렀다는 뜻이다.


아쉽게도.. B에서 쓰려고 했던 ControllerGrabInteractor는 프로젝트에서 안쓰기로 했기 때문에, 다른 방법을 찾아서 2편을 써야할 듯 싶다.. 그래도 B에서 찾은 스크립트로 Grab Button 눌렸는지 여부를 알 수 있다는 것을 찾아낸 것만으로도 다음에 유용하게 쓰일듯 싶다. 2편에서는 B만 조금 수정하면 진행하려던대로 진행할 수 있을 것이다.

 

그럼 눈물을 머금고 글을 마친다..


2편 보기:

https://gycblog.tistory.com/12