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
'Unity > Dev' 카테고리의 다른 글
[Unity] Light Probe로 자연스러운 빛과 실시간 그림자 연출하기 (1) | 2023.01.18 |
---|---|
[Unity] UI Scripting Automation (2) (0) | 2023.01.17 |
[Unity] UI Scripting Automation (1) (0) | 2023.01.17 |
[Unity] Player Grab Interaction with Oculus Integration SDK (0) | 2023.01.16 |
[Unity] VR Player Controller with Oculus Integration SDK (0) | 2023.01.12 |