[실전 개발기#1] 모르는 건 싫으니까 AI에 도움 받으려고 합니다

기획기사 | 윤서호 기자 | 댓글: 5개 |



최근 제일 가장 핫한 단어를 꼽자면 아무래도 'AI'일 겁니다. 왜 그런지는 설명하는 것이 새삼스러울 정도로, 이미 AI는 곳곳에 영향을 끼치고 있죠. 특히 게임 개발에서도 AI 이미지, AI 그림 등 관련해서 이런저런 키워드들이 바로 튀어나올 만큼 친숙한(?) 상황입니다.

사실 AI는 이미지로 대변되는 애셋 작업뿐만 아니라 곳곳에서 연구 중입니다. 그간 컨퍼런스 등지에서 만난 업계인들의 공통적인 입장이, 그걸 실제 제품에 활용 가능한지 혹은 실제로 쓰고 있는지는 모르지만, 적어도 프로토타입이나 알파 정도로 간단하게 구현하면서 이터레이션에 드는 시간은 확실히 줄였다는 평은 들었으니까요.

이런 상황인 만큼 게임 개발에 관여하는 업계라면 이 분야를 연구할 수밖에 없었고, 그와 관련해 다양한 솔루션을 내놓고 있습니다. 작년에 유니티에서 공개한 '유니티 뮤즈', '유니티 센티스' 등의 기술이 그 좋은 예일 겁니다. 수박 겉핥기로나마 유니티로 게임 개발하는 법을 알고 있던 저로서는 구미가 당길 수밖에 없는 일이었죠. 더군다나 제일 쥐약이었던 코딩 부분을 보완해줄 수단까지 지원해준다고 하니, 이미 다 꺼져서 사라졌던 창작욕구가 다시 불타오를 수밖에 없었습니다.

▲ 코딩에 스프라이트, 애니메이션, 텍스쳐까지 처리해준다니 한 번 확인해보겠습니다


그래서 뭘 만들지?



▲ 오픈월드로 이런 미소녀 TPS를 만들고 싶은 1인. 언젠가는...가능하겠지?

모든 창작의 시작은 결국 저 질문에서부터 시작됩니다. 뭘 만들까? 이 부분이었죠. 한계고 뭐고 생각할 것 없이 진짜로 만들고 싶은 걸 고백하자면, 미소녀 오픈월드 TPS입니다. 택티컬한 복장부터 다양한 복장의 미소녀들이 각종 총기와 무기를 장비하고 필드를 돌아다니며 싸우는 그 광경이란. 생각만 해도 제 지갑은 물론 제 미래의 지갑까지 영끌해서 바칠 것 같은데, 이상하게도 그런 장르가 잘 안 나오더군요. 그것마저도 AI로 뚝딱 만들 수 있다면 좋겠지만, 그나마 2D만 조금 다룰 줄 아는 초보가 그 정도로 만들 수 있다면 이미 그런 게임이 시중에 나오고도 남지 않을까 싶습니다.

더군다나 본업도 있는 상황에서 짬짬이 만들어야 하는 상황이니, 눈물을 머금고 이전에 생각만 해뒀다가 묻어놨던 소규모 게임 중 하나를 골랐습니다. 2018년 출시된 '리썰 리그 블레이즈'를 하다가 이런 건 어떻게 만들까 하고 고민했던 적이 있었거든요. 물론 당시에 2D 플랫포머 개발 기획이 있었고, 3D는 겉핥기로 배운 것도 다 까먹어서 그 다음으로 미루었죠.

▲ 그러나 지금 하긴 어려우니 이걸 했던 기억을 살려서 로컬 2인 대전 게임을 만들까 합니다

그 개발팀의 작품이 한국어화 출시가 된 적이 없으니 간단하게 요약하자면, 철권볼과 비슷합니다. 공을 스윙으로 적에게 날려버리고, 그걸 적이 되받아치지 못하면 고스란히 피해를 입히는 그런 룰이죠. 배구처럼 바닥에 닿지 말아야 하는 철권볼과 달리 이 게임은 사방으로 공이 튕기고, 또 서로 칠 때마다 가속도가 붙기 때문에 어느 시점에선 누가 반응을 하느냐 못하느냐로 승패가 갈립니다.

결국 그 속도를 못 따라가서 중도에 접긴 했지만, 그 독특한 게임을 한 번 이렇게 고쳐보면 어떨까? 싶은 생각이 있긴 했습니다. 다만 3D에 대한 전반적인 지식도 없고, 그 안에 숨어있을 복잡한 코딩까지 직접 구현할 수 있을까 싶어 언감생심이었죠. 그리고 지금은 초보가 AI의 도움을 받으면 어느 정도까지 가능할지 보여주는 차원에서 만들어보고자 합니다.




▲ 3D는 다룰 줄 몰라서 2D로 날림작 하나 만든 게 전부인 초보 개발자, 과연 3D 게임을 만들 수 있을까?


엉성한 기획, 프로토타이핑부터 도와주는 AI



▲ 뭔가 엉성하지만 AI 도움 안 받고 혼자 뭘 빠르게 작업하려면 이 정도로 처참하다

프로토타이핑 없이 무턱대고 애셋부터 만들었다가 실패했던 적이 있었으니, 이번에는 애셋 제작보다 프로토타이핑부터 시작했습니다. 솔직히 모든 과정이나 게임퀄리티 수준이 프로토타이핑 수준이라 이렇게 말하는 게 실례겠지만, 애셋에 맞춰서 이것저것 우겨넣다가 어디서 버그가 났는지도 모르는 괴작을 만들었던 걸 생각하면 조금 진보한 셈이죠.

코드를 처음부터 짤 수있었다면 이런 걸 굳이 강조하진 않았을 겁니다. 그런데 저는 C# 언어를 겉핥기로, 그것도 2D에 필요한 것만 속성으로 배운 터라 3D와 관련해서 뭘 어떻게 해야 하는지 감도 못 잡았습니다. 특히 볼이 통통 튕기는 건 물론, 스윙을 해서 타격을 하면 가속도를 주는 건 대체 어떻게 해야할지 그걸 또 무엇으로 어떻게 컨트롤할지 등등. 과제가 처음부터 산더미죠.

그 과제를 덜기 위해서 비주얼 스크립팅 등이 나왔지만, 결국 기계를 설득하기 위한 '논리'를 탑재해야 한다는 점은 변함이 없습니다. 기계는 융통성이라는 것이 정말 1도 없어서, 시키는 그대로만 하고 지시하지 않은 건 정말 1도 안 건드리는 터라 인간이 거기에 맞춰서 말해줘야만 하니까요.



▲ 일단은 기본 뼈대부터 검증하기 위해 대강 큐브와 구체로 벽과 플레이어, 공, 배트를 임시로 제작했다



▲ 그런데 챗GPT로 파이썬을 활용해 블렌더로 모델링하는 방법까지 쫙 나올 줄은



▲ 물론 아직 검증은 필요하지만 3D 울렁증에 파이썬을 몰라서 손도 못 댔던 블렌더를 써본 것도 수확일지도

그렇지만 이제 챗GPT를 포함한 AI가 그 고민을 상당히 해결해주는 시대입니다. 유니티에서는 유니티의 자체 AI 툴 '유니티 뮤즈' 중 '뮤즈 챗'이 이런 역할을 하고 있었죠. 코딩은 물론, 유니티 에디터 내에서 작동하기 때문에 프로젝트에서 발생한 오류의 원인을 찾아주거나 프로젝트에 맞는 기능을 설명해주는 등 다양한 곳에서 활약할 수 있다는 것이 지난 유나이트부터 GDC까지 유니티가 강조한 사항이었죠.

일단 프로토타이핑을 위해서 필요한 것은 공을 움직이는 스크립트, 스윙 애니메이션을 재생하는 스크립트, 공에 탄성을 주기 위해서 필요한 기능을 찾는 것이었습니다. 원래대로였다면 그 스크립트를 깃허브나 유튜브를 뒤적거렸겠지만, 뮤즈챗에 'How to make a character move'라던가 'How can play swing animation When click a mouse'라는 식으로 적으니 바로 필요한 코드가 나와서 놀랐습니다. 문장도 이상하게 썼는데 어떻게 잘 알아들을 거라곤 생각도 못했으니까요. 최근 AI의 기본 소양이겠지만, 매번 깃허브나 스택오버플로우 같은 곳을 들락거리면서 해결책을 찾던 문제도 어떤 애셋의 무슨 문제인지 지적해주기까지 했으니까요.



▲ 뮤즈 챗에 어떻게 캐릭터 움직일까? 이렇게 썼다가 좀 더 조건을 더하니 원하는 결과물에 좀 더 가까워졌다

물론 애셋을 직접 배치하고 프리팹을 만드는 것까지는 해주지 않으니, 그 부분은 직접 했습니다. 어차피 프로토타입이니 큐브나 구체로 벽이나 테스트용 배트, 그걸 휘두를 본체 그리고 공을 만든 뒤 플레이어에 아까 물어봤던 이동 관련 스크립트와 애니메이션 재생 스크립트를 붙여넣기해서 컴포넌트로 넣었죠. 구체의 탄성은 어떻게 구현해야 할까 싶었는데, 일단은 3D 바운스 관련 옵션이 있어서 그걸로 먼저 조율한 뒤에 추후에 스크립트로 세부 조율하는 식으로 보류했습니다. AI가 스크립트를 하나하나 다 짜주기는 하지만, 스크립트는 대안으로 작성해주고 일단은 바운스 옵션을 조절해보라는 팁이 있어서 그쪽부터 본 것이죠.



▲ 컴포넌트 넣기나 키 애니메이션 제작, 트랜짓 같은 기본은 알고 있지만



▲ 모르면 뮤즈챗에게 물어보자. 주석까지 달면서 친절하게 답해준다

또 하나 더하자면, 공을 쳐서 날리는 것도 결국 AI한테 물어봤습니다. 아직 유니티 뮤즈 애니메이션 기능이 시험 단계이기도 하고, 복잡한 걸 구축하려는 게 아니라서 초 단위로 동작을 녹화한 뒤 이를 재생하는 키 애니메이션을 썼기 때문이죠. 즉 각각의 위치 정보는 유니티 엔진에서 처리하지만, 여기에는 '힘'이 빠져있습니다. 현실에서는 모든 운동에 힘이 들어가기 때문에 망각하는 현상이죠. 그래서 그 코드를 플레이어 무브먼트 스크립트에 같이 넣으면서 공에 플레이어가 주는 '힘'을 전달할 수 있도록 지시했습니다.



▲ 뮤즈 애니메이션은 아직 정식 적용이 아니라서 우선 키 애니메이션을 활용했다

그리고는 배트에 충돌을 주지 않고 플레이어 앞에 히트박스를 설치하고 그곳에 충돌을 주는 형태로 디자인했습니다. 배트에 안 준 이유는, 앞서 말한 것처럼 애니메이션 그 자체에 '힘'이 실린 게 아니라서 코드로 컨트롤해야 할 텐데 그걸 어떻게 AI한테 설명해야 할지 감이 안 잡혔기 때문입니다. AI가 이것저것 뚝딱 만들어주기는 하는데, 결국 그걸 알맞게 조립하고 조합하는 건 여전히 사람의 몫이니까요.



▲ 키 애니메이션은 위치 정보만 있고 힘이 안 실려있으니



▲ 대략 그 공을 때릴 방망이나 혹은 무언가에다가 그 힘을 주는 정보를 줘야 한다는 뜻.jpg



▲ AI가 점지해준(?) 코드를 약간 개조해서 플레이어에게 스크립트로 넣으면



▲ 어찌저찌 힘이 실린 스윙을 때릴 수 있게 된다


디테일은 몰라도 뭔가는 나온다. 문제는 재조립과 검토



▲ 더미까지 만들어서 작업했는데 튕기기까지는 되는데, 그때그때 궁금한 것만 채워서 만들었더니 이런 일이

눈썰미가 좋은 사람이라면 이미 짐작했겠지만, 저것만으로는 그냥 단순히 규칙 없이 공을 벽면에 통통 튕겨서 노는 정도에 불과합니다. 학창 시절에 혼자 축구공을 들고서 학교 옆 벽면에 슈팅 때리면서 쓸쓸하게 놀던 추억(?)이 떠오르는 것도 잠시, 규칙을 집어넣어야 비로소 프로토타이핑 단계가 완성이 되죠.

그런데 막상 AI에게 설명을 하려고 하니 막막해집니다. 물론 가장 큰 것은 언어의 장벽이죠. 대다수의 AI 툴이나 프로그램, 사이트가 영어를 기반으로 하고 있으니까요. 뮤즈챗은 그나마 한국어를 지원하기는 하지만 상당히 느린 편이라 영어로 쳤을 때보다는 덜 쾌적합니다. 그래도 문법이 안 맞는 것 정도는 어지간하면 그냥 넘어가서 잘 찾긴 하죠. 거기다가 유니티가 그간 축적한 데이터를 학습한 결과물과 커뮤니티에 올라온 Q&A 사례, 혹은 도큐먼트에 게재된 안내를 토대로 프로젝트를 분석한 뒤 그에 맞는 솔루션을 말하는 것이라 한 번 답을 찾았을 때 크게 수정할 필요는 없긴 합니다. 다만 그때그때 필요한 것만 묻는 식으로 쓰다 보면 의도한 것과는 다소 달라질 수 있으니, 계속 체크할 필요는 있죠.



▲ 한국어를 못 알아듣진 않지만 시간이 꽤 걸려서 영어로 치는 게 속편하다

물론 그렇다고 해도 그게 '원하는 답'인지, 그 답을 도출하기 위해서 제대로 설명했는지 개발자 스스로가 검토해야 합니다. 처음에 공을 쳐서 상대방에게 날렸는데 그걸 상대방이 못 받으면 피해를 입고, 상대방이 되받아친 공을 못 받았을 때 자기가 피해를 입는다고 설명하고 스크립트를 맡겼습니다. 그런데 그걸 '못 받는다'는 걸 말 그대로 해석해서 그 공을 받지 못한 모든 상황에 피해를 입는다는 걸 알았기 때문이죠. 의도한 것은 던진 공을 상대방이 못 쳐낸 상황에서 그 공을 맞았을 때 피해를 입는다는 것이었는데, 그 의도를 AI에게 전달하지 못해서 이런 결과물이 나왔습니다.

대신 그걸 어떻게 변주해서 써먹을 단서는 찾았습니다. 볼을 쳐낸 사람에게는 피해를 주지 않고 그걸 못 쳐낸 사람에게만 피해를 주기 위해서는 '공'에다가 그와 관련된 정보를 줘야 한다는 것, 그리고 플레이어 구분을 어떻게 해야 할지에 대한 힌트가 있으니까요. 이를 활용하기 위해서는 OnCollisionEnter2D, if문처럼 코딩에 대한 이해도가 필요하지만, 비주얼 스크립트로 적용할 수 있겠죠. 다만 비주얼 스크립트는 그 노드를 이미지로 보여주거나 하지는 않고 어떻게 노드를 만들어야 할지 글로 설명이 되어있습니다.



▲쳤는데 그 공을 되친 걸 못 받으면 플레이어가 피해를 입게 하는 스크립트 짜달라고 했는데



▲ "못 받는다"는 단어를 뭔가 다르게 해석할 줄이야. 그 맥락까지 한 번에 제시해줄 필요가 있다

결론적으로 AI한테 물어본 것은 "캐릭터가 움직이게 만들려면 어떻게 해야 할까", "스윙하는 애니메이션을 만들었는데 클릭 혹은 패드 버튼을 누르면 그 애니메이션을 재생하게 하려면 어떻게 할까", "그렇게 스윙할 때 공이 날아가게 하려면 어떻게 할까", "공을 쳐서 다른 플레이어한테 날렸는데 그 공을 못 받으면 피해를 입는다. 그리고 그 공을 쳐서 다른 플레이어에게 날렸는데 못 받으면 피해를 입는다", "중앙선을 못 넘게 하려면 어떻게 해야 할까" 이것들이었고, 그 예시 답안을 보면서 적용해보고 오류가 나면 또 물어봐서 해결한 뒤에 다시 마개조(?)를 하는 과정을 이어가고 있습니다.

사실은 이것만으로 끝이 아니고, 더 복잡한 규칙들을 미리 기획하긴 했습니다. 특정 조건에 따라 공이 변한다거나, 플레이어를 맞추는 것 외에도 에어하키처럼 골대에다가 넣으면 점수를 획득한다던가 하는 것들 말이죠. 다만 먼저 과연 이걸 흉내라도 낼 수 있을까 싶은 것을 AI를 써서 구현하는 과정을 검토하고, 그 다음에 차곡차곡 단계별로 나가기 위해서 이 단계까지 만들었습니다.



▲ 뮤즈 텍스쳐는 금이나 철 같은 재질은 잘 구현하는 반면



▲ 패턴 같은 경우에는 아직 레퍼런스가 없으면 애매하다

정확히는 AI가 이렇게 만들어주는 속도를 머리가 못 따라가서 과부하가 걸렸다고 하는 게 맞을 겁니다. 어깨 너머로 그리고 이리저리 기웃거리면서 배웠던 지식으로 누더기처럼 코드를 짰던 때는 부족하나마 코드 리뷰에 구조까지 파악하면서 만들었는데, AI는 바로 만들어주니 마치 산데비스탄을 단 것처럼 그 속도감에 취할 수밖에 없었습니다. 그걸 아무 생각 없이 썼던 결과는? 좀 과장하자면 사이버 사이코라고 할까요. 이것저것 신나서 막 붙이는 것도 모자라 그걸 순정으로 안 쓰고 마개조(?)까지 해버리는 바람에 뭔가 이상한 물건이 되어버려서 플레이 가능한 빌드로 만들기 위해서 리뷰 중입니다.

당연한 말이지만 게임 개발에서 AI의 쓰임은 더더욱 많습니다. 유니티 엔진 자체의 AI툴인 뮤즈만 해도 스프라이트, 텍스쳐를 비롯해 아직 시범 기능이지만 애니메이션까지 있으니까요. 거기에 블렌더 등 3D 모델링 소프트웨어에서도 AI로 모델링하는 방법이 있고 하니, 다음에는 UI까지 입힌 프로토타이핑 완료 이후에는 스프라이트나 텍스쳐 및 3D 모델링, 애니메이션 등 디테일을 가다듬는 과정을 보여드리고자 합니다.



▲ 너무 빠르게 뭔가 나와서 그 속도감에 취하다가



▲ 과부하 걸려서 클리닉 받고 있는 1인, 다음엔 반드시 플레이용 가능한 빌드를

댓글

새로고침
새로고침

기사 목록

1 2 3 4 5