0. 들어가기에 앞서
AR/VR을 주제로 4일동안 개인 프로젝트를 진행하게 되었다. 어느 쪽이든 익숙하지 않은 분야다 보니, 프로젝트를 진행하는 데 있어서 어려움이 꽤 있을 거라는 걱정이 있었다. 그리고 특히나 프로젝트 기간이 짧은 만큼, 최대한 작은 볼륨으로 기능의 구현에 초점을 맞춘 게임을 만들어야겠다는 생각을 했다.
AR과 VR 중에 뭘 할 거냐는 선택에는 망설임 없이 VR로 가기로 했다.
개인적으로는 둘 다 쉽지 않은 분야지만 AR 쪽이 훨씬 어려워보이기도 하고 불안정해 보였기 때문이다.
VR도 솔직히 그렇게 좋아하는 장르가 아니지만, 어찌 됐든 새로운 분야에 대한 시도를 해 보는 것에 초점을 맞추기로 했다.
이번에는 시간상 프로젝트 기획서는 간단하게 작성했다.
VR환경을 갖추고 게임을 테스트하는 것만으로도 쉽지 않은 과정이 될 것 같기 때문에 최소한의 기능만으로 사격장 시뮬레이션 느낌으로 제작하고자 한다.
(저번 칸반 프로젝트 템플릿이 불편해서 다른 걸로 바꿔보았다)
1일차의 작업량은 생각보다 많이 나가지 못했다.
프로젝트 버그 문제나 에셋 적용 이슈 등의 많은 문제가 발생했기 때문이다.
작업을 정리하면 다음과 같다.
아직 해결되지 않은 문제가 많으니 유념하도록 하자.
어제자 테스트 진행부터 빌트인으로 만든 프로젝트에서 VR이 정상적으로 작동하지 않는 문제가 있었다.
이것 때문에 프로젝트를 처음부터 VR로 만들어서 계속 진행하려고 했으나, 여기에서부터 문제가 생겼다.
VR로 프로젝트를 실행할 경우 기본 제공되는 XR Interaction Toolkit의 버전이 달라 조금 다른 형태의 XR Interaction Toolkit이 제공되는데, 이것 때문에 컨트롤러를 어떻게 사용해야 하는지 감이 잡히지 않았다.
VR로 연 프로젝트의 경우 이렇게 Interaction Toolkit에서 제공하는 프리팹의 내용이 다르다 보니 기능을 익히려면 다시 공부해야 할 판이었다. 기능을 찬찬히 살펴보는 것도 나쁘지는 않은 생각이었지만... 시간상 이미 공부한 버전으로 하는게 낫겠다고 판단했다.
그러면 버전을 내가 사용한 버전으로 업데이트 하면 되겠다, 싶어서 업데이트를 했다.
그리고 마주한 건 터져버린 프로젝트였다. 충돌 레포트를 하라며 뜬 경고문이나 이런 것들을 보고서 어쩔 수 없이 깃허브 이전 브렌치로 돌아갔다.
두 번째로 생각한 방법이 아예 해당 패키지를 지우고 다시 까는 거였다. 이 방법은 다행히도 프로젝트가 터지는 과정으로 가지는 않았다.
하지만 이 방법 또한 문제가 생겼으니, 이상하게 샘플 씬의 Material이 다 날아가고 다시 받은 Interaction Toolkit에도 문제가 발생했다.
Interaction Toolkit 프리팹을 구성하는 일부 스크립트가 날아간 것이다. 왜 해당 스크립트가 날아간 건지 이해가 되지도 않지만, 더 웃긴건 이 상태로 프로젝트를 실행시키면 막상 컨트롤러 자체는 정상작동한다.(엥???)
다만 프로젝트에서 XR Device Simulator는 아예 작동하지 않고 심지어 그냥 실행시키면 엄청 깨진 화질로 카메라가 확대되는 이상한 버그까지 발생했다.
결국 문제가 해결되지 않아 강사님께 찾아가서 해결 방법을 고민했는데, 그냥 프로젝트를 삭제하고 다시 만드는 편이 낫겠다는 진단을 받았다.(...)
그나마 다행인 건 빌트인으로 프로젝트를 만들고 VR 환경을 조성하는 데 성공했다는 것이고, 뼈저리게 느낀 건 기존 프로젝트에서 핵심적인 구성요소를 함부로 업데이트하거나 바꾸지 말자는 결론을 내렸다.
이번에 사용할 총은 이렇게 생긴 녀석이다.
(원래는 SF총 같은 걸 사용하고 싶었지만... 구한 에셋이 카트리지라던지 이런 부품별로 분리되어 있지 않아서 사용하지 못했다.)
총알을 장전하는 기능을 구현할 시간이 될지는 모르겠지만, 카트리지를 분리하고 끼우는 등의 기능을 구현하는 데 가장 적합해 보이는 총을 골랐다.
다만 이와 같은 총을 사용한다고 하면, 한손으로만 들고 쏘는 방식은 조금 이상할 것이다. 그래서 총을 잡을 때 양 손으로 잡을 수 있게 처리를 해야 한다.
이걸 구현하는 데 있어 생각보다 시행착오가 있었고, 아래와 같은 방식으로 구현했다.
이 부분에 대한 기능을 나중에 수정할 가능성도 있기야 하지만, 처음부터 잡을 수 있는 부위를 제한하는 것이 꽤 불편하게 느껴졌다.
원래는 이 Collider 부분에 충돌체를 등록하여, 해당 충돌체 부분만 잡을 수 있도록 구현하려고 했다. 하지만 이런 식으로 구성하니 총을 잡기가 굉장히 어렵다는 느낌을 받게 되어 해당 부분은 생략하고, 총을 잡았을 때의 방향만 고정하도록 하기로 했다.
총의 손잡이 부분에 GrabPoint라는 빈 오브젝트만 추가하고, 해당 부분을 총의 Attach Transform으로 수정한다.
다만 단순하게 이렇게 추가하니, 자꾸 총을 사선으로 잡는 이상한 현상이 발생하여 이걸 어떻게 해결해야 할 지 고민했었다.
그리고, 그 해결 방법은 말 그대로 노가다임을 깨닫게 되었다. GrabPoint의 Z좌표 화살표가 항하는 방향으로 총이 잡힌다는 사실을 알게 되었기 때문이다. 그래서 GrabPoint의 Rotation을 수정해서 총을 원하는 방향으로 잡도록 수정해줘야 한다.
오른손 컨트롤러만 Force Grab로 수정해준다. 양 손 다 Force Grab로 선택할 경우 양손으로 잡으려는 시도를 했을 때 모션도 이상하고 오류도 뜨는 것을 확인할 수 있었다.
오른손으로 총을 바로 가져오게 하여 마치 총을 들고 조준하고 있는 모션 같은 효과를 줄 수 있다.
총을 양손으로 잡게 하고, 겨냥을 할 수 있게 이 두 컴포넌트를 추가했다. 여기서 유의해야 할 점은 Scaling과 관련된 옵션을 전부 꺼 줘야 한다는 점이다.
이 글을 작성하던 중에 버그를 발견해서 급히 수정할 수 있었는데, 이 옵션에 체크가 되어 있는 상태가 되면 두 손으로 물건을 쥐고 크기를 마음대로 조절할 수 있게 된다.
이렇게 되지 않도록 옵션을 끈 채로 세팅하고, 이 컴포넌트로 총을 앙손으로 잡을 수 있게 된다.
이번에 2$ 할인 에셋 목록에 있었어서 큰 맘 먹고 산 에셋이 있었다.
총구 발사를 이와 같이 에셋 파티클로 처리하려는 계획이 있었는데, 이게 적용되지 않는 이슈가 있다.
(현재까지도 원인 불명으로 해결하지 못함)
에셋을 뭔가 잘못 사용한 건가 싶어서 에셋 분석도 하고 코드도 다 뜯어보고 했는데, 그렇게 복잡한 구조로 만든 코드도 아니고 그나마 모르는 것이 PostProcess 가 들어갔다는 점 정도였다.
후처리 작업 때문인지 확인해 보았지만, 이것마저도 에셋의 미적용 이슈를 해결하지 못했다. 강사님과도 같이 고민해봤지만 아무리 봐도 안 되는 이유가 없다는 답을 받아서, 이 에셋을 포기하든지 아니면 원인을 더 파헤처 보든지의 방법으로 상담을 끝냈다.
계속 발생하는 문제는 아니고 간헐적으로 발생하는 문제인데, 총을 던지다 보면 간혹 바닥으로 빠져버리는 경우가 생긴다.
총을 든 채로 왼손 컨트롤러로 이동하게 되면, 오른손에 든 총이 덜덜 떨리는 버그가 발생한다. 보기가 굉장히 안 좋아서 해결방법을 찾아야 할 것 같다.
분명 총과 총알이 충돌하지 않도록 처리하고 레이어도 다 달았는데도, 계속 총알이 총과 부딪혀 사라지는 버그가 있는 것을 발견했다. 해당 문제를 해결해야 한다.
과녁에 총알이 부딪혔을 때 점수를 올려주고, 더 나아가 과녁이 내려가는 기능을 만들고자 한다.
특정 이벤트 존에 들어가면 제한 시간이 생기고, 총으로 과녁을 맞추면 점수가 쌓이는 방식으로 게임을 만들 생각이다. 이걸 위한 시스템의 구현이 필요하다.
총구를 표시할 CrossHair과 제한 시간, 점수를 표기할 UI가 필요하다. 또한 총의 발사를 사운드로 표시해야 한다.
지금은 총알을 빨간색으로 만들기는 했어도 이것마저도 총알이 발사되는지 잘 안 보이는 경우가 많았다. 총알의 발사를 시각적으로 만들 수 있는 방법에 대한 고민 혹은, 문제로 발생했던 에셋을 활용할 수 있는 방법을 찾아야 한다.
총알을 저장할 오브젝트 풀 패턴을 만들어 최적화를 노리자. 더 나아가 총알의 장전 기능도 구현해보자.