안녕하세요 지나가던 언리얼엔진 사용자 1인입니다. 오늘도 바쁜 여러분을 붙잡고 TMI 가득한 이야기를 좀 해볼까 생각합니다. 거절한다구요? 거절은 거절합니다. 이야기 상대 좀 해주세요.
최근 들어 꽤나 바쁜 나날을 보내고 있습니다. 일은 일대로 하고 있고, 언리얼 인강도 만들어 올렸고, 길고 길었던 책 원고도 마무리하고 편집 작업 중에 있습니다. 얼마 전에는 정말 감사하게도 사용기 게시판에서 인연이 닿아서 한국에 계신 팀과 협업도 했습니다. 그렇게 하루하루 보내고 있는 사이에 에픽게임스에서 또 새로운 엔진 버전을 공개했습니다. 5.1 나온지 얼마나 됐다고 벌써 또 5.2가 나왔습니다. 사실 아직 프리뷰 버전이긴 하지만 Github 언리얼엔진 페이지에 Preview 가 안붙은 그냥 5.2 버전 (정식?) 이 올라와 있는 것으로 보아 5.2 정식 출시도 얼마 남지 않은 것 같습니다. 정식 출시라고 해도 문제점들이 없는 것은 아니지만요. 어차피 회사에서 작업하고 있는 게임 프로젝트 같은 경우에는 엔진 버전을 기민하게 바꿀 수가 없어서 새로운 버전이 나와도 새로운 기능을 바로바로 적용 시킨다던가 할 수가 없습니다. 하지만 아무래도 언리얼엔진 사용자로서 새 버전에 눈을 끄는 새로운 기능이 나오면 써보고 싶기 마련입니다.
밈 조상님 오랜만에 소환 해봅니다
GDC에서 공개된 마법같은 PCG
이번에 에픽이 GDC에서 새로 발표한 것들에는 포트나이트 에디터, Verse 라는 새로운 프로그래밍 언어, 섭스트레이트 머테리얼, 크리에이터 이코노미 등 놀라운 것들이 많았지만 레벨/환경 디자이너로 일하고 있는 제 눈에는 아무래도 절차적 콘텐츠 생성 툴 (Procedural Content Generation Tool) 이라는 것이 제일 눈을 끌었습니다. Procedure 라는 단어를 직역하면 한글로 절차, 순서 쯤이 되는데, 이 맥락에서의 Procedural Content Generation 라는 말은 ‘정해진 룰에 따라 자동으로 생성하는 콘텐츠’에 가까울 것 같습니다. 물론 제가 절차적이라는 표현에 익숙하지 않아서 그런 것일 수도 있겠습니다. 어쨌든 사용자가 정하는 룰과 시스템에 따라 3D 공간에 3D 모델들을 자동으로 채워주는 시스템이라고 생각할 수 있을 것 같습니다.
5.2 데모에서 에픽이 보여준 PCG 시스템의 사용 예제입니다. 이것만 봤을 때는 사실 딱히 특별할게 없죠. 그런데 여기까지 트럭을 운전해서 가는 모습을 보여주더니
갑자기 길이 없다고 중간에 있는 큰 절벽을 치워버립니다. ??? 이걸 클릭한번, 드래그 한번에 합니다. ???????
그러더니 다시 원래대로 옮기고 블루프린트 하나 끌어와서 절벽 모양을 바꿔버립니다. 이렇게 클릭 한두번으로
환경을 바꾸는데 바닥의 모양, 경사면에 굴러다니는 돌멩이들, 땅을 뚫고 보이는 뿌리들, 절벽 위에 자라는 수풀, 나무 등 모두 자연스럽게 업데이트 됩니다.
그리고선 갑자기 줌아웃 하더니 엄청나게 방대한 스케일을 보여주면서 사실 이거 다 PCG야 를 시전합니다. 이 정도까지 스마트한 오토메이션이 가능하려면 얼마나 복잡한 시스템을 짰을지 상상이 안갑니다. 원래 에픽에서 대대적으로 홍보하는 데모는 시연 이후에 프로젝트 파일을 공개적으로 공유 한 전례가 많아서, 이 프로젝트도 곧 공유 해줄 것으로 많은 사람들이 기대하고 있습니다.
원래 3D 환경이란게 껍데기를 만드는 작업입니다. 속까지 채우고 안보이는 부분까지 다 만들어 놓기에는 현실적으로 퍼포먼스에도 좋지 않고 작업하는데에도 비효율적입니다. 그렇기 때문에 ‘보이는 부분만 만든다’ 가 대전제라고 할 수 있습니다. 이렇기 때문에 완성된 프로젝트를 열고 에디터에서 모델들을 이리저리 치우고 임의로 이것저것 움직이면 텅빈 공간이나 3D 모델의 끄트머리 부분이라던가 이런 보기 싫은 부분들이 보이기 마련입니다. 이런 부분들은 미관상 좋지 않을 뿐더러 플레이어나 시청자의 몰입을 방해하는 버그이기 때문에 무조건 가리는게 맞습니다. 그래서 보통은 이런 환경에서 저런 큰 절벽을 움직이거나 지형을 바꾸는 대형 작업을 할 때에는 그에 걸맞는 작업량과 시간을 예상하고 시작합니다. 그런데 이 PCG 시스템을 사용하면 수작업으로 일일히 만져주고 편집해줬어야 하는 부분들을 자동화 할 수 있기 때문에 잘만 쓰면 작업시간을 획기적으로 단축 할 수 있을 것 같습니다.
PCG 배우기 위해 구독!
5.2 GDC 데모를 공개한 시점에서 아직 저는 책 원고를 쓰고 있었는데, 공개 이후에 관련된 뉴스를 다룬 비디오들은 물론이고 각종 튜토리얼까지 유튜브에 쏟아져 나왔습니다. 지금은 한풀 꺾였지만 툴이 더 개발 됨에 따라 관련 콘텐츠도 더 많아질 것으로 예상됩니다. 원고는 끝내야겠고, PCG 빨리 안배우면 뒤쳐질 것 같고, 솔직히 조바심이 나서 죽는줄 알았습니다. 그러면서 가증스럽게도 책 원고 말미에 조바심 내는 것을 조심해야 한다고 위선적인 내용을 적었던 것 같습니다. 셀프 관찰, 관조에서 오는 생생한 중계였던 것을 읽는 분들이 알아차리실지 모르겠습니다.
그래서 데모를 보자마자…… 는 아니고 책 원고 끝내자 마자 에픽게임스 론쳐에서 5.2 프리뷰 버전을 받았습니다. 원고 마감전에 받지 않아서 정말 다행이라고 생각합니다. 받자마자 PCG 플러그인 켜고, 튜토리얼 보고 따라 해보고 한참 빠져서 놀았습니다. 참고로 Adrien Logut 이라는 분이 이 PCG 개발팀에 계신 개발자이신 것 같은데 처음에 이 분이 올려주시는 튜토리얼 보고 따라 하면서 기본 개념이라던가, 사용 방법이라던가 많이 배웠습니다.
그리고 PCG 튜토리얼이라고 유튜브에 올라온 것들 거의 다 훑어 보았는데 FreetimeCoder 라는 분의 채널에 올라온 영상들이 다른 영상들보다 훨씬 자세히 진득하게 여러가지를 다루어서 좋았던 것 같습니다. 아주 개인적인 생각으로, 가십거리나 얕은 내용만 단발적으로 자주 올리는 채널보다는 이런 분들이 더 잘 되셨으면 하는 바람이 있습니다. 물론 더 큰 대중에게 어필해야하는 유튜브의 특성상 그러기가 쉽지가 않겠지만요. 그래도 최근에 올리신 PCG 강의 시리즈 덕분인지 제가 처음 봤을 때 보다 두배 이상으로 구독자가 느셨네요. (부…부럽)
나도 빨리 비디오 만들어 올려야지
그래서 이 분들 비디오에서 배운 것들을 토대로 무엇을 할 수 있을까 생각을 했는데, 수풀이나 나무 같은 것을 PCG에 적용해서 사용하는 것은 이미 비디오가 많이 올라와 있고, 했던 것을 또 하는 것은 별로일 것 같았습니다. 그래서 생각한 것이 돌덩이, 바위 등에 덩굴이 자라는 모습을 PCG 시스템으로 만들어보면 딱일 것 같다는 생각이 들었습니다. 그리고 덩굴도 풀데기의 일종이긴 하지만 자라는 방향이나 방식이 다른 풀데기랑은 좀 다르기 때문에 원래 환경 디자인을 할 때 좀 특별히 더 성가시기도 한 녀석이라 이 놈을 자동화 시키면 좋을 것 같았습니다.
튜토리얼 영상 다 만들고 고심 끝에 언리얼엔진에서 만든 썸네일입니다. 사무실에서 마주칠 때마다 음담패설을 즐겨하던 전 직장동료가 이걸 보자마자 또 디엠으로 음흉한 웃음을 날리네요…….. 아니야 임맠
PCG 시스템으로 덩굴 농사 해본 썰
여기서 부터는 제가 PCG 시스템을 사용해서 돌멩이에 덩굴농사 짓는 과정을 축약해서 보여드리도록 하겠습니다. 스크린샷은 튜토리얼 영상 만든것에서 가져온 것들입니다. 크게 세가지 방식이 있는데, 각 과정마다 자세한 순서 설명은 글이 너무 길어지니 스킵하도록 하겠지만 혹시 궁금하시거나 보고 따라 해보고 싶으신 분들은 글 맨 아래에 영상에서 참고하시면 됩니다. 그냥 흥미로 보시는 분들은 글만 읽어도 대충 어떤 방식으로 작동하는지 보이실 것 같습니다.
언리얼엔진 5.2 버전을 받은 다음에 새 프로젝트를 만들고 Procedural Content Generation Framework 라는 플러그인을 활성화 시켜줍니다. 5.2 프리뷰 버젼에서는 Geometry Script 라는 플러그인도 같이 활성화 시켜줘야 하는데 이후의 정식 5.2 버젼부터는 지오메트리 스크립트는 따로 활성화 시켜주지 않아도 되도록 바뀐다고 합니다. 플러그인 활성화 시키고 엔진을 재시작합니다. 벌써부터 두근두근 합니다. 자동화 고고고
아 그런데 기본 직육면체나 구체 같은거에 덩굴 붙이면 좀 없어보이니까 그래도 좀 그럴듯 해보이게 건물 짓는데 사용할 3D 모델들도 다운로드 받아서 사용하기로 합니다. 파라곤 게임 기억하시는 분들 계실지 모르겠는데 (기억하면 아재인증) 파라곤에서 사용하던 캐릭터들이랑 3D 모델들 에픽 마켓플레이스에서 무료로 받아서 사용 할 수 있습니다. 꽤나 시간이 지난 모델들이라서 엄청 비주얼이 좋다거나 하지는 않지만 최적화가 굉장히 잘되어 있고 레벨 디자인에 유용한 모양들의 3D 모델들이 많아서 이런 개인 프로젝트에 사용하기에 참 좋다고 생각합니다.
에디터에서 퀵셀 브릿지를 열어서 덩굴 모델도 다운로드 받습니다. 제가 사용한 것은 English Ivy 라는 메가스캔 팩인데 덩굴 모양이 다양하게 들어 있어서 이것도 꽤나 유용하게 사용하고 있는 자료입니다.
일단 다운받은 빌딩블록으로 쓸 모델들, 그리고 덩굴들까지 모두 나나이트로 변환시킵니다. 나나이트로 변환 한다는 것의 의미를 모르시는 분들을 위해 설명하고 싶어서 입이 근질거리지만 이것도 글 하나를 따로 써야 할 만큼 길어질테니 참겠습니다. 간단하게 뭉뚱그려서 말하면 최적화를 위한 작업이라고 생각하면 되는 것 같습니다. 원래 5.0 대까지는 수풀, 나무등 폴리지 에셋들은 나나이트 변환이 불가능 했는데 5.1부터 폴리지도 나나이트 지원을 시작했습니다. 덕분에 좀 미친척하고 수풀을 레벨에 엄청나게 칠해버려도 어느 정도 fps를 유지하는 모습을 볼 수 있습니다. PCG 시스템을 사용해서 덩굴을 랜덤으로 마구마구 자라게 하면 아무래도 컴퓨터에 무리가 갈텐데 나나이트로 미리 변환해서 어느정도 퍼포먼스를 유지하도록 합니다.
에디터에서 새로운 PCG 시스템을 사용해서 PCG 그래프라는 것을 생성합니다. 이 그래프는 열어보면 UI 가 기존의 블루프린트나 머테리얼 그래프와 흡사한 노드 시스템이라는 것을 알 수 있습니다. 그리고 블루프린트랑도 상호연계하는 방식으로 사용 할 수 있게 되어 있습니다. 블루프린트는 프로그래밍 언어를 몰라도 시각적인 인터페이스를 이용해서 사용자가 게임플레이나 개발툴을 만들 수 있게 해주는 시스템입니다. 그래서 저 같은 프로그래밍 지식이 없는 디자이너가 프로그래밍적 작업을 할 수 있게 해줍니다. 그래서 저는 프로그래밍 언어를 모르기 때문에 블루프린트도 못합니다 (???) 저는 뭘까요 도대체, 블루프린트 잘했으면 좋겠는데 욕심만 앞서고 노력은 뒷전입니다, 앞으로 공부할게요 죄송합니다.
어쨌든 이 새로운 PCG Graph 시스템은 블루프린트 같은 노드 방식이긴 해도 뭔가 노드 이름들이나 이런게 더 직관적인 것 같습니다. 예를 들어 스태틱메시 (3D 모델) 를 불러오는 노드 이름이 Static Mesh Spawner 라던가 PCG 볼륨과 돌맹이가 만나는 지점에 포인트들을 샘플하는 노드 이름이 Intersect 어쩌고라던가. 온라인 튜토리얼에서 보지 못했던 내용들도 노드 이름들을 보고 어느정도는 기능들을 유추 해볼 수 있는 것들이 꽤 있었습니다. 물론 아직 개발 중인 툴이라 사용 할 수 있는 노드 리스트가 그렇게 길지 않아서 좀 덜 무섭(?)게 느껴져서 살펴보는데에 부담이 덜 한 것일지도 모르겠습니다.
기본적으로 PCG 시스템의 작동 방식은 사용자가 지정한 룰대로 3D 공간에서 포인트, 즉 공간의 특정 좌표를 샘플링 한 다음에 그 포인트 값에 필요한 3D 모델을 불러오는 것인 것 같습니다. 맞게 하는 설명인지는 잘 모르겠지만 적어도 제가 이해한대로는 그런것 같습니다. 그래서 애초에 샘플링 하는 포인트들을 어떤 방식으로 어디에다가 샘플링을 하는지, 그리고 불러오는 3D 모델 위에 또 포인트들을 샘플링 하고 다른 모델을 덧씌워서 불러온다던가 하는 방식으로 점점 복잡한 시스템을 만들어 나갈 수 있는 것 같습니다.
덩굴 농사법 #1
그래서 위의 스샷의 경우에는 PCG 볼륨 중앙에 하나의 포인트를 샘플링 한 다음, 그 포인트에다가 이 돌 블럭을 불러옵니다. 그리고 그 다음에 불러온 돌 블럭 위에 다시 여러개의 포인트들을 샘플링 합니다. 그리고 그 포인트들에 덩굴을 하나씩 붙여주면.
음….. 왠지 성게가 먹고 싶어지는군요. 왠지 이 비주얼이 맛있게 마음에 들기는 하지만 덩굴이 이렇게 자랄리는 만무하니 트랜스폼 포인트라는 노드로 각 포인트의 회전값을 일정한 범위 안에서 놀도록 바꾸어 줍니다.
Y 축 회전값을 조절하고 나니 착 가라앉아 차분해진 모습입니다. 이제는 미역국이 생각나네요. 성게 미역국 맛있겠다… 먹어본적은 없지만….
갑자기 푸…풍성해지셨죠? 덩굴을 불러오는 노드들을 복제해서 다른 종류의 덩굴도 돌 블럭에 붙였습니다. 아래 노드 창에 보이는 노드 가지 (Branch) 하나당 덩굴 모델 하나입니다. 원래 하나의 노드에서 여러가지 덩굴을 불러오는 방법도 있는데 따로따로 컨트롤 할 수 가 없어서 이런식으로 만들었습니다. 참고로 덴시티 노이즈, 덴시티 필터 등의 노드들을 사용해서 결과적으로 샘플링된 포인트들의 위치나 개수를 조절 할 수 있습니다. 이런 방식으로 세가지 덩굴이 너무 서로 겹치거나 하지 않도록 하게 할 수 있습니다.
PCG 그래프를 복제하고 처음에 불러온 돌블럭만 다른 3D 모델로 교체한 모습입니다. 그리고 새로운 모델에 맞게 덩굴 모델들 사이즈 정도 바꿔주면 바로 쓸 수 있는 것 같습니다.
PCG 그래프를 사용해서 이렇게 작업하니 정말 좋은 점이 이 3D 모델을 회전하거나, 위치를 옮기거나, 사이즈를 바꾸거나 하면 모델에 붙은 덩굴들이 정해진 룰 안에서 업데이트 됩니다. 그래서 저 같은 경우에는 긴 덩굴이 항상 아래쪽으로 향하게 설정 해놨는데 덕분에 이 모델을 한쪽으로 기울이면 덩굴들이 중력에 따라 아래로 자란 것 처럼 자동으로 업데이트 되도록 할 수 있습니다. 그리고 바위나 돌 블럭 같은 모델들의 자리를 옮기거나 할 때마다 예전처럼 수풀이랑 덩쿨을 지웠다가 다시 칠했다가를 하지 않아도 됩니다. 또 샘플링 포인트들이 정해진 범위 내에서 랜덤으로 지정되도록 되어 있기 때문에 똑같은 모델을 복사해서 옆에 놓아도 랜덤한 덩굴 덕분에 서로 자연스럽게 달라보이는 효과를 수작업 없이 해낼 수 있습니다.
물론 이 방식의 단점은 결국에 랜덤 생성에 의존 하는 것이기 때문에 세부적인 수동적 편집이 어렵다는 것과 PCG 그래프로 만들어 놓은 시스템을 잘 아는 사람이 필요하다는 것이라고 생각합니다. 하지만 예를 들어 메인 게임플레이가 이루어지는 공간이나 메인 스토리가 진행되는 공간처럼 아주 세밀한 수작업이 필요한 공간이 아니라, 중간 중간 채워줘야 하는 배경에 해당하는 공간이라던가, 시스템적으로 이루어지는 서브퀘스트를 위한 공간 등에 충분히 사용될 수 있을 것 같습니다. 또 제 짧은 지식으로 거기까지는 잘 모르겠지만, 가능하다면 PCG 시스템 자체가 자동화와 수동적 컨트롤이 양립 할 수 있게 만들어진다면 아주 좋을 것 같긴 합니다.
똑같은 PCG 그래프로 포인트 샘플링 하고 덩굴 스폰한 모델들로 조그만 씬 레벨 빌딩 시작 해봤습니다. 덩굴 붙은 모델들 이리저리 돌리고 움직이면서 노는 맛이 있습니다. 전에 안되던 것 되니까 신났지 아주
덩굴 농사법 #2
한가지 방식으로만 만들면 좀 더 한정적이기도 하고 재미도 있다 말았으니까, 다른 방식도 시도 해봅니다. 스플라인 선 위에 포인트를 샘플링하고 사용자가 스플라인을 그리는 경로에 따라 덩굴이 생기는 방식입니다. 스플라인을 이용해야 하기 때문에 블루프린트에다가 스플라인이랑 PCG 그래프를 같이 넣어서 상호작용하게 합니다. 다행히 블루프린트 구조 자체는 굉장히 단순합니다. 스플라인은 점과 점을 이어 곡선을 만들 수 있게 해주는 기능으로, 포샵 만져보신적 있는 분들은 사용해보신 적이 있을 법한 펜툴과 비슷하다고 생각하시면 됩니다.
이전에 3D 모델을 불러올 때랑 덩굴을 불러오는 방식은 거의 같은 개념입니다. 포인트를 샘플링하고 그 샘플된 포인트들 위에 덩굴 모델을 불러옵니다. 덩굴을 여러개 불러오면서 서로 다른 포인트에서 자라나도록 노드들의 값들을 조절해주고요. 아 그리고 벽에 붙어 자라는 덩굴의 형태에 맞게 사용해야 하는 회전값 등이 조금 다른 것 같습니다.
스플라인은 선 위로도 작동 할 수 있지만 루프 형태로 동그랗게(?) 닫힌 형태로, 그린 형태의 안쪽의 공간에 포인트를 샘플링 하는 형태로도 사용 가능 합니다.
덩굴 농사법 #3
마지막으로 제가 사용한 방법은 PCG 볼륨이랑 레벨에 있는 3D 모델들이 서로 겹치는 부분을 사용한 방법입니다.
이 방법은 PCG 볼륨이 직접 돌 블럭을 불러오지는 않고 대신에 볼륨을 이렇게 3D 모델에 붙이면 겹치는 부분에 한해서 포인트를 샘플링 합니다. 샘플링 된 포인트는 다른 방법들과 마찬가지로 노이즈, 필터링을 거쳐서 컨트롤 할 수 있구요. 이렇게 생성된 포인트들에 또 덩굴을 붙여주면
이렇게 됩니다. 이 방식은 PCG 그래프를 여러번 복제 할 필요없이 이미 레벨에 있는 모델들을 사용해서 볼륨만 붙여주면 덩굴을 붙일 수 있어서 여러모로 편리한 것 같습니다. 볼륨 하나로 여러개의 모델에 덩굴을 붙일 수도 있습니다. 다만 레벨 빌딩을 하다가 돌블럭을 다른자리로 옮긴다던가 회전시킨다던가 하면 볼륨도 같이 편집을 해줘야 하는 수고가 생길 수 있습니다. 상황에 따라 첫번째 방법이 더 편할 수도, 이 방법이 더 편할 수도 있을 것 같습니다.
덩굴 자동농법 공부해본 김에 재미로 레벨 작은 공간 하나 만들어 봤습니다. 손이 많이 가고 클릭을 많이 해야 되는 부분이 자동화 되니까 다른 부분에 시간을 더 쓸 수 있어서 구도 잡는거랑 실루엣 잡는 재미가 있네요. 네? 그런데 구도가 왜 그 모양이냐고요?
도대체 뭘 표현하고 싶었던건지 모르겠지만 그냥 덩쿨 농사 성공적으로 마무리 짓겠습니다.
인스타 스토리용으로 샷 한개 더 만들어 봤습니다.
사실 절차적으로 콘텐츠 생성하는 시스템이 새로운 것은 아닙니다. 이미 옛날부터 트리플A 게임들은 다양한 분야에서 사용하고 있었던걸로 알고 있고, No Man’s Sky 라는 게임은 절차적으로 생성되는 세계로 유명하다고 들었습니다. 그리고 이미 에픽 마켓플레이스에서 판매하는 나무/폴리지 플러그인 중에도 절차적 시스템을 사용하는 것들이 있었습니다. 하지만 전 세계적으로 많은 사용자를 보유한 언리얼엔진에 이 시스템이 큰 헤드라인 피쳐로 도입된다는 것에 의미가 있다고 생각하고 특히 나나이트와의 시너지가 좋을 것으로 개인적으로 기대하고 있습니다.
덩굴농사 자동화방법 #1,2,3 필드매뉴얼 (한글자막 있어요)