Warudo에서는 정말로 다양한 일을 할 수 있습니다. 이론 상, 이건 유니티 엔진과 다를 바가 없습니다. 그 말은 곧 와루도 안에서도 게임을 만들 수 있을 거라는 얘기죠.
이번 의뢰는 아이블룸 팀의 베니 (https://ch.sooplive.co.kr/veryveny) 님으로부터, 주루마블 정기 컨텐츠를 위한 시스템 제작 건이었습니다. 이미 맵이 제작된 상태이며, 버튜버 네 명이 앉아있고, 팬 캐릭터들이 말이 되어 맵 상에서 뛰어다니고, 주사위도 굴리고, HP도 관리해야 하고, 준비된 삼행시, 초성퀴즈 등의 컨텐츠도 서브로 들어가야 하는 작업이었습니다. 주어진 시간은 한 달 남짓, 약간의 지연이 있었는지 빠듯한 일정이었습니다. 어디에서나 후반 작업이 항상 타격이 크긴 합니다.
구현된 기술
주사위 굴림

주사위는 실제로 랜덤하게 굴러갑니다. 돌면서 던져지고, 지면에 닿는 순간 랜덤 값에 따라 주사위의 눈이 나오는 방식입니다. 순서는 다음과 같습니다.
- 주사위를 굴리면, 0~5까지의 랜덤한 값을 변수에 저장합니다.
- 주사위의 최종 회전값 6개 (각 눈 마다) 를 Vector3 리스트 변수에 저장합니다.
- 주사위 프랍을 다중 앵커 구조로 만들어, 앵커마다 회전과 이동을 담당하게 만듭니다.
최종 회전값을 가리킬 주사위 프롭 - 주사위의 랜덤 회전을 담당할 Rotating Anchor - 주사위의 이동을 담당할 앵커 구조로 설계했습니다.
- 우선 Rotating Anchor의 회전 축을 (-1, -1, -1) ~ (1, 1, 1) 범위 내에서 랜덤 설정시켜, 빠르게 돌아가는 모양새를 만들어 줍니다. 그리고 회전을 활성화 시킵니다.
- 그리고 이동용 앵커를 위로 띄웠다가 떨어뜨립니다. 그러면 회전은 그대로 진행되며, 최상단에 있는 앵커의 이동에 따라 주사위가 회전하며 움직입니다.
- 떨어지는 도중, 설정되어 있는 주사위 눈 변수에 따라 최종 회전값을 참조하여 주사위 프롭의 회전값으로 결정시킵니다. 그러면서 Rotating Anchor의 회전을 중단시키고 축을 리셋시킵니다(자동으로 리셋됩니다).
- 떨어질 때의 이동은 OutBounce로 Easing 처리하여, 자연스럽게 통통 튀게끔 만들어 줍니다. 팬시함을 더하기 위해 파티클도 하나 터트려 줍니다. 이건 Delay Control Flow로 적절히 설정해 봅시다.
말의 이동

주사위를 굴리면서 나온 눈의 수를 변수로 저장한 이유가 여기에 있습니다. 말이 그만큼 이동해야 하니까요. 여기서는 변수를 잘 활용해야 합니다. 말이 얼마나 이동할지도 알 수 없고, 어느 칸으로 갈지도 알 수 없죠.
그래서 우선은 1칸을 이동하는 기능을 구현하고, 이를 반복문으로 실행하는 방식으로 설계했습니다. 모든 세부 기능들을 함수로 묶어놓고, 이것들을 최종 블루프린트에서 합쳐서 실행하면 되는 것이죠. 아래에 쓴 과정이 한 칸 씩 움직이는 기능에 대한 것들입니다.
- 우선 모든 칸의 중간점을 Vector3 변수 리스트로 저장해 놓습니다. 그렇게 해서 쉽게 참조할 수 있도록 만들었습니다. 가끔 노가다가 가장 빠른 길인 작업들이 있는데, 이것도 그런 작업 중 하나였습니다.
- 그리고 각 말의 현재 위치값을 변수로 만들고, 0~23 범위 내에서 움직이도록 합니다. 이건 Integer Greater Than Or Equal 노드 같은 것으로 숫자를 비교하여 24 이상이면 강제로 0으로 세팅 (= 한 바퀴 돌았음) 하는 로직을 짜면 됩니다.
- 그런데 이 글을 쓰기 위해 다시 블루프린트를 살펴보니, 저는 Float Greater Than Or Equal 노드를 썼었네요. 어차피 정수는 실수집합에 포함되니까 문제는 없습니다…
- 이번에도 말이 될 프롭에게 앵커를 적용합니다. 루트 앵커가 게임판 상에서의 위치를 결정하고, 프롭에 이동 중 방방 뛰는 모션을 부여합니다.