소개
앞서 수확제 글에서 언급한 것처럼 올해 초부터 개인 졸업 작품으로 VR FPS 게임을 개발하고 있다. 장르를 굳이 정리하자면 스팀 펑크 배경, 디펜스 슬래셔 게임이라고 할 수 있을 것 같은데, 그냥 '응축과 폭발'이라는 컨셉으로 개발하고 있다는 정도만 알아두면 될 것 같다.
원래 <Breath in Winter> 프로젝트에 대한 글은 어떻게 개발해야 하는지 하나하나 작성하기가 번거로워서 따로 올리지 않았었는데, 이제라도 재미있는 시스템을 중심으로 조금씩 글을 올려보려고 한다. 다만, 모든 개발 방법에 대해서 세세히 다루지 않을 예정이니 이 점 양해 바란다. (너무 길어지는 걸.. 작성하기 힘들어..)
이런 의미로 오늘은 진행 상황을 정리할 겸 'User parameter에 반응하는 Niagara VFX'라는 주제로 글을 작성해보려고 한다.
구현 의도
언리얼 엔진에는 'Niagara'(이하 나이아가라)라고 하는 모듈형 이펙트 제작 툴이 있다. 아래와 같이 여러 모듈을 품고 있는 이미터들을 조합해서 내가 원하는 이펙트를 제작할 수 있는 툴이다.
나이아가라에는 단순히 이펙트를 만들고 재생하는 것에서 그치지 않고, user parameter(이하 파라미터)를 정의해서 해당 값에 맞게 이펙트가 변형되도록 할 수 있는데, 이를 활용하여 유저에게 강함에 대한 피드백을 줄 수 있을 것 같다는 생각을 했다.
이에 <Breath in Winter>에서 무기 업그레이드를 하며 무기의 속성이 변화할 때, 이에 따라 탄환의 이펙트가 반응하도록 하면 유저에게 확실한 피드백과 시각적인 자극을 줄 수 있을 것 같았다.
추가로, 기존에는 각 무기에 대한 탄환 이펙트를 따로 제작했었는데 이럴 필요 없이 파라미터만 조정해서 전혀 다른 무기 연출이 가능하기도 하고 말이다.
결론은 확실한 피드백과 개발 비용 절감을 위해 'User parameter에 반응하는 Niagara VFX'를 제작했다고 정리할 수 있을 것 같다.
구현 과정
구현 과정에 대해서는 간단하게만 정리하도록 하겠다.
첫 번째로, 모든 무기에 적용할 수 있도록 이펙트를 제작하고, user parameter를 설정해서 기본 형태를 만든다.
두 번째로, 테스트할 때 사용할 UI를 위해 widget blueprint를 구성하고, 이를 위에서 만든 이펙트의 user parameter와 binding한 뒤에 3d widget으로 생성해 pawn에 부착한다.
세 번째로, motion controller에 widget interaction component를 추가하고, motion controller끼리의 입력을 구분하기 위해 pointer index를 서로 다르게 설정한다.
마지막으로, input mapping context에 widget interaction을 위한 key를 등록하고, 해당 키를 입력했을 때 마우스 클릭처럼 처리하도록 설정한다.
이게 끝이다. 여러 게임 테스트 영상을 봤을 때 디버깅을 위한 UI를 만들고, 파라미터와 연결하는 게 좋아보이기는 해도 복잡해보여서 지금까지 구현해보지 않았는데, 실제로 해보니까 그리 어렵지 않게 구현할 수 있었던 것 같다.
그럼 이제 결과를 확인해보자.
결과
결과는 위와 같이 잘 진행이 된다. 이게 윈도우 기본 녹화로 기록하면 VR이라 그런지 화면 우측이 일부 잘린다.. 일단 테스트 영상이라 그리 중요한 것도 아니어서 그대로 올리긴 했는데, 추후에 한번 따로 설정해 봐야겠다.
추가로, 유튜브에는 영문으로 업로드를 했는데, 솔직히 약간 관종끼가 있어서 더 많은 사람이 내 노력을 알아봐줬으면 하는 마음에 이렇게 올려봤다 ㅋㅋㅋㅋ 아이 부끄러 🤭🤭🤭
ㅋㅋㅋㅋ 반쯤은 장난이고, 여러 사람들에게 피드백을 받고 싶어서 이렇게 올려봤다. 한 달 전쯤에 레딧이나 가마수트라 같은 해외 게임 디자인 커뮤니티를 알게 됐는데, 사람들이 실험적으로 접근하면서 그 내용을 공유하는 게 인상 깊어서 나도 이렇게 올려봤다.
아직은 뭔가 보여줄 만한 퀄리티가 아니긴 한데, 점차 이렇게 하다보면 괜찮은 퀄리티의 무언가가 나올 거라고 생각한다. 이에 더해 아래처럼 내 실험들을 기록해보고 싶기도 하고 말이다.
아무튼 결론은 뭐다? 테스트는 잘 끝났다~
포스트모템
짤막한 테스트에 포스트모템을 하는 것도 웃기긴 한데, 그냥 개인적인 아쉬운 점과 개선점을 정리해보고 싶어서 이렇게 따로 항목으로 분리해봤다. 그럼 같이 살펴보도록 하자.
- Damage가 Linear Color에 미치는 영향을 정리할 수식이 필요하다.
현재는 단순하게 R 값은 고정해두고 'Map Range Clamped'로 데미지 범위에 따라 G, B 값만 변형했는데, Damage가 극단으로 치닫지 않는 이상 색상 구분이 확실하지 않아 피드백이 느껴지지 않는다. - 범용적으로 모든 무기에 대해 테스트할 수 있도록 수정해야 한다.
현재는 임시로 오른쪽 BP_MachineGun에 대해서만 적용되도록 설정했는데, 차차 C++로 변환하면서 모든 무기 타입에 적용되도록 구조를 설계할 필요가 있다. (겸사겸사 각 속성 범위도 지정해놓고..) - 레이저 무기 처리 방식에 대해서 고민이 필요하다.
머신 건과 미사일 런처, 스나이퍼는 파티클 형태이기에 위의 방식으로도 표현이 가능하다. 그러나 레이저의 경우에는 위의 방식대로 빔의 형태를 표현하기에 적합하지 않다. 따로 방법을 고민할 필요가 있다. - 충돌 시 이펙트가 소멸하도록 수정해야 된다.
구현 가능한 지 확인만 한다고 이렇게 만들었는데, 실제로 구현할 때는 충돌 시 이펙트가 소멸하면서 데미지 처리를 하도록 구현해야 한다.
후기
사실 한 달 전부터 '만들어야지.. 만들어야지..' 하면서 손이 안 가서 지금까지 방치해 왔다. 이렇게 하나둘 방치하다 보니 막막해져서 프로젝트에 아예 손을 떼기도 했고 말이다. 사실상 근 한 달간은 이것 빼고 새로 개발한 게 없는 것 같다.
그래도.. 다시 시작해야 되지 않겠나. 이에 '왜 손이 가지 않았나?'를 고민해 보면, 이유는 딱 하나인 것 같다.
잘 모르니까.
이번에 나는 무언가에 대해 모른다는 감각을 싫어한다는 걸 알게 됐다(어쩌면 모든 사람이 그럴 수도 있지만..). 이게 참.. 애매한데, 보기에 쉬워보이는 게 있으면 금방금방 배우고 잘하면서도, 어려워보이는 게 있으면 아예 손을 안 대려고 하는 경향이 있다.
그럼 어떻게 해야 되는가?
그냥 DO DIVE다.
나는 정체(停滯)가 길어지는 순간 침몰한다.. 나아가야 한다.
사실 문제를 분해해서 조금씩 하나하나 하다 보면 그리 어려운 것도 아니다. 어쩔 때는 생각보다 훨씬 쉬워서 바로 되기도 하고 말이다. 그냥 하면 되는데.. 어쩌면 단기간에 성과를 내고 싶어하는 내 조급함이 만든 오류가 아닐까라는 생각이 든다.
아몰랑 그냥 하자! 계속 글 기록하면서 조만간 또 찾아오도록 하겠다. 글이 길어지는 것 같아서 여기서 마무리 짓겠다. (이미 길어졌는데..?)
아디아디 아디오스!