시작은 호기롭게 하다가 끝은 결국 이도저도 아니게 맺는 걸 보고 흔히들 용두사미라고 하죠. 하지만 세상엔 끝조차 맺지도 못하고 아예 흐지부지되어버리는 일도 흔합니다. 꼬리 없이 몸통까지만 나와서 숨 한 번 펄떡여보지도 못하고 사장되어버린 것들은 둘러보면 꽤나 여럿 있죠. 사정은 여러 가지겠습니다만, 현실의 벽에 부딪힌 게 가장 큰 문제일 겁니다. 그 중 하나가 제 작품이 될 예정이었죠.

게임만들기 기사 모아보기
[게임만들기 ①] 1인 게임 개발에 한 번 도전해보았습니다 - 예고 및 기획 단계편
[게임만들기 ②] 1인 게임 개발에 한 번 도전해보았습니다 - 캐릭터 디자인편
[게임만들기 ③] 1인 게임 개발에 한 번 도전해보았습니다 - 중간 점검 및 기획 수정편
[게임만들기 ④] 1인 게임 개발에 한 번 도전해보았습니다 - 배경 및 스테이지 설계편
[게임만들기 ⑤] 1인 게임 개발에 한 번 도전해보았습니다 - 적 캐릭터 제작편
[게임만들기 ⑥] 1인 게임 개발에 한 번 도전해보았습니다 - 적 만들기 심화편

"게임 개발이 너무 어렵다고 말하는 것 같은 뉘앙스로 끝나는 거 아니에요?" 업계 지인들을 만날 때 가끔 농반진반으로 듣는 말인데, 처음엔 가슴에 비수가 꽂히는 것 같았습니다. 그래도 한 번 시작했으니 이번엔 끝을 보겠다던가 혹은 뭔가 좀 게임 개발 더 배워보고 하면 되지 않을까 이런 일말의 희망이 남아있던 때였으니까요. 그런데 나중에는 "어려운 건 어려운 거죠"라고 덤덤히 받아들이고는 기억에서 지워나갔습니다. 유나이트 코펜하겐 전까지는 말이죠.


그때 발표된 것들을 들으면서 "아 귀국하면 바로 다시 만들어야지"라고 생각하고 실제로 엔진도 업데이트했지만, 버전이 바뀌면서 충돌해버렸습니다. 버그들과 씨름한 끝에 처음부터 다시 만들어야 한다는 결론이 나왔죠. 마치 중간보스 클리어하고 보스 앞쪽에서 낑낑거리면서 트라이하고 있었는데, 그 데이터가 날아가버린 셈입니다. 다행히 에셋 파일은 남아있으니 초반부는 넘긴 상태에서 시작한다고 보는 게 더 정확하겠죠.

▲ 엔진 버전이 바뀌면 일부 구형 패키지는 대응이 안 되니, 처음부터 만들어야 합니다

이제 코로나 19로 일이 바쁘다던가, 시간이 없다거나, 어디 가야된다거나 하는 은엄폐물들이 사라져버렸습니다. 중국에 있는 개발자 친구에게 받은 축전 답장을 작업하다가 "생각해보니까 처음부터가 아닌 게 어디야"라는 오기로 재개된 게임 만들기. 이번에는 24시간 동안 무슨 작업을 했는지, 또 어떤 새로운 기능을 활용하려고 씨름하고 있는지를 적어보겠습니다.

▲ 시작 전 손풀기 1.
위의 내용은 CDC의 공지를 참조했습니다. 모두들 코로나 19 조심조심



■ 2D도 이젠 라이팅이 적용된다, 유니버설 렌더링 파이프라인


"이젠 2D도 쉐이더, 라이팅 작업이 가능하다고?"

유니티 키노트에서 유니버설 렌더링 파이프라인을 소개할 때 가장 솔깃한 대목이었습니다. 그간 2D 게임 개발은 별도 툴을 쓰지 않는 한 이와 같은 기능을 엔진에서 지원하지는 않았기 때문이죠. 별도 툴을 구하지 못하거나 만들 수 없으면, 모든 상황을 하나하나 다 감안해서 일일이 그려나가야 했습니다. 캐릭터 명암도 못 넣는데 왜 쉐이더하고 라이팅이 필요하다고 하는지 의문일 겁니다. 그게 가능해지면서 바뀐 차이는 아마 직접 비교해보시는 게 좋을 것 같습니다.

▲ 2D 라이팅이 없던 구 버전(좌)과 2D 라이팅을 적용한 새로운 버전(우)

사용 방법을 간단히 설명하자면, 메뉴창에서 윈도우-패키지 매니저에 가서 유니버설 렌더링 파이프라인을 다운로드 받은 뒤, Assets 폴더를 우클릭해서 Create-Rendering-Universal Render Pipeline에서 Pipeline Asset와 2D Renderer를 만들었습니다. 그렇게 해서 생겨난 UniversalRenderPipelineAsset에
New 2D Renderer Data를 리스트업하고 2D 라이트를 설치했습니다.

일단은 유니티 애셋스토어에서 구한 배경과 타일맵에다가 포인트 라이트 2D와 글로벌 라이트 2D를 섞어서 쓴 상태입니다. 그 외에도 프리폼 라이트, 디렉셔널 라이트 등 기능이 있지만 아직 어떻게 활용해야 할지 감이 안 와서 이래저래 만져보는 중이죠.




▲ 클릭하면 확대됩니다



■ 참고한 영상





■ 이제 스프라이트 시트는 안녕, 2D 패키지


예전엔 본 애니메이션을 사용하려면 ANIMA 2D나 혹은 다른 툴을 에셋스토어에서 다운로드 받아야했습니다. 예전 기사에서 소개한 방식은 ANIMA 2D를 활용해 스프라이트를 스프라이트메시로 변환한 다음 본을 바인드하는 방식이었죠. 그때 발생한 문제가 한 번 본에 바인드된 스프라이트메시를 다른 스프라이트로 전환하기가 어렵다는 점이었습니다.

그걸 스크립트로 다른 스프라이트를 호출하는 방식으로 변환하면 되기는 한데, 프로그래밍을 못하는 사람에겐 정말 난제였죠. 더군다나 에셋들이 뿔뿔이 흩어져있는 스프라이트 시트를 보면서 스프라이트메시에 바인드할 본을 설정하는 것도 익숙하지 않은 사람에겐 꽤 지난한 작업입니다. 마치 맵핑하는 느낌이랄까요? 원본 그대로가 아니라 일일이 다 펴져있는 상태에서 원본 모습을 보고 하나하나 맞춰가는 작업이기 때문이죠.

▲ 예전엔 각 파트별로 스프라이트를 따로 나눠놔야 했지만(좌),
PSD 임포터가 개선되면서 원래 모습대로 저장해도 됩니다. 알아서 슬라이스해줍니다(우)

2018년 말부터 2D PSD 임포터에, 별도의 툴 없이도 스프라이트 에디터에서 본 애니메이션을 활용할 수 있게 되면서 방향이 좀 바뀌었습니다. 그 전에는 포토샵에서 각 스프라이트를 마치 부품처럼 배치한 뒤에 PNG 등으로 저장했는데, 이제는 원본 그대로 PSB로 저장하면 레이어 정보를 읽고 스프라이트들을 알아서 나눠줍니다. 자연히 캐릭터를 그린 뒤에 머리, 몸통, 팔, 다리 각 파트별로 따로 떼어놓지 않아도 되는 거죠.

스프라이트 에디터에서 스키닝 에디터를 활용해 본 애니메이션 작업을 할 땐 원본 그대로 보면서 본을 바인딩하고 지오메트리, 무게 조절도 가능해졌습니다. 그뿐만 아니라 예전에 스프라이트메시를 쓸 때와 다르게 각 파트별로 스프라이트 변환도 자유로워졌죠.

▲ 각각 파트뿐만 아니라 전체적으로 보면서 지오메트리, 무게 등을 체크하고 바인딩하기 쉬워졌습니다

주인공 유채림을 예로 들면, 얼굴 파트가 가면 쓴 버전과 일반 버전 두 종류가 있습니다. 이걸 바꾸려면 포토샵에서 각각 버전을 PSB 파일로 저장한 뒤, 디폴트인 가면 쓴 버전을 스프라이트 에디터에서 본 바인딩까지 다 작업합니다. 이걸 저장한 뒤, 그 삽입한 본들을 전부 선택한 뒤에 복사하고 다른 버전을 스프라이트 에디터에 불러와서 붙여넣기하는 식이죠.

그 다음엔 프로젝트창에서 Sprite Library Asset을 만들고, 리스트와 사이즈를 추가하고 각각에 해당하는 스프라이트를 넣어주는 식입니다. 마스크를 쓴 얼굴과 맨얼굴, 두 버전을 각각 따로따로 넣어주는 거죠. 그리고는 하이어라키창에서 얼굴을 선택한 뒤, 컴포넌트에 SpriteResolver를 추가하고 카테고리를 아까 지정해둔 Mask로 바꿔두면 아까 지정해둔 두 버전의 스프라이트가 라벨창에 뜨게 되죠. 각 라벨을 클릭만 하면 원하는 스프라이트로 언제든지 바꿀 수 있게 됩니다.

원래 PSD 임포터와 스프라이트에디터는 2018년 4분기부터 있던 기능이지만, Sprite Library Asset이나 SpriteResolver 등 실험적인 기능들이 추가되면서 좀 더 쉽게 애니메이션 작업이 가능해졌습니다. 예전에 있던 충돌도 개선됐고, 프로그래밍을 못하면 꽤나 난제였던 것들도 프로그래밍 없이도 금방 적용할 수 있게 됐으니까요.

▲ 에셋 버전을 따로 만들어두고 본을 복사-붙여넣기한 뒤에 Sprite Library Asset 등을 쓰면

▲ 이젠 코드 안 짜고도 본 애니메이션에서 스프라이트를 자유롭게 교체할 수 있습니다


■ 참고한 영상




■ 그렇지만 문제는 언제나 발생한다? 24시간의 기록

가장 골머리를 썩고 있던 문제가 해결됐으니 모든 게 일사천리일 것 같았지만, 정작 문제는 다른 곳에서 발생했습니다. 우선 본과 캐릭터 스프라이트 구조가 바뀌었으니 애니메이션을 처음부터 다시 만들어야했죠. 일일이 찾아서 다시 맞추고 하는 방법이 있긴 하지만, 구조를 모르면 아예 리셋하는 게 편하다는 걸 이제는 너무도 잘 알고 있습니다. 구조 찾겠다고 이것저것 뒤져보다가 어려운 나머지 때려치고 싶어지는 게 사람 마음이니까요.

그렇게 해서 애니메이션도 대강 만들고 트랜지션도 연결하면 될 것이라고 생각했지만! 세상사 그렇게 쉽지 않더군요. 예전에 썼던 스크립트를 그대로 붙여서 그런지 몰라도 점프도 안 되고, 첫날에는 절대 움직일 일이 없던 타일맵이 빙글빙글 돌기 시작했습니다. 마치 지구가 도는 게 아니라 태양이 도는, 정말 있을 수 없는 일이 벌어진 거죠.

그것뿐이면 모르겠습니다. 분명 스피드 0.1 이상이면 걸어가게끔 스크립트가 되어있을 텐데도 걷질 않고 그냥 미끄러져가는 캐릭터에, 그거 고쳐놓고 보니까 방향전환할 때 휙휙 순간이동하는 모습까지. 그런다고 끝이 아니죠. 이번에 다리에 쥐가 났는지 도통 걷지도 뛰지도 못하는 캐릭터의 모습을 보면 코드 다시 짜야 하나 한숨만 나오더군요.

"그래도 예전 거 만큼 하는데 24시간 안에는 충분해! 자체 게임잼 한 번 해보지 뭐!"라고 하다가 "아니 이건 좀"으로 끝나버린, 24시간의 기록을 공개합니다.

▲ 지금부터 타이머 돌아갑니다

▲ 에너지 음료와 커피, 개발에 날개를 달아주죠

▲ 아직은 멀쩡합니다만, 과연 24시간 뒤엔 어떨지...

▲ 일단 옛날 걸 참고하면서

▲ 스프라이트를 다시 만듭니다

▲ 작업은 꽤 순조롭군Yo

▲ 캐릭터 애니메이션 그까짓 거!


▲ 트랜지션도 OK, 스크립트도 OK!

▲ 이제 타일맵 깝니다 따~라라란~ 따라란~ 따라란~ 따~ 쿵짝짝~ 쿵짝짝~ 따라리라라리...

▲ ??????

▲ 아니 타일맵이 왜 흔들립니까ㅏㅏㅏ

▲ 문제 원인 검색 중입니다

▲ (몇 시간 뒤) 아...노답이네

▲ 결국엔 내일의 최우선 과제로 설정합니다.

▲ 미안하다 내일의 나, 뒤를 부탁한다!


▲ 내일의 나: 아 나 저거 어떻게 해결함? 어제의 나 너무한 거 아님?

▲ (또 몇 시간 뒤) 역시 천동설(?)이 아니었어! 지동설(?)이었어!

▲ 후허헣허허허허허허허허허허허허헣ㅎ 이런 거 갖고 그렇게나 헤맸었나요(멘탈 나가기 전)

▲ 자 이제 진정하고 라이팅을 작업합시다

▲ 일단 강의를 듣고 그대로 하면 되겠지?

▲ ?????

▲ 허허허허허허허허 이젠 빛도 나를 버렸구나 허허허허허허(이미 제정신 아님)

※ 주: 원래 빛이 안 비추면 이렇게 까맣게 나오거나, 안 보여야 정상이다

▲ ???

▲ ???? 근데 이거는 왜 라이팅이 적용되는 거죠? 지금 스프라이트 차별하는 거임?

▲ 어느 덧 타임아웃이 다가오고....

▲ 정신줄을 잡아줄 최후의 보루, 에너지 음료도 이젠 없다

▲ 마침내 종~료!

▲ 하얗게...불태웠어...

▲ 과연 이 단계까지 빠른 시일 내로 리메이크할 수 있을까요?