내 주인공 캐릭터의 아트 스타일을 개발한 방법
요약
개발자는 주인공 캐릭터의 아트 스타일을 완성하기 위해 픽셀 아트의 한계를 극복하고자 3D 엔진을 활용하는 전략을 선택했습니다. 셀 셰이딩, 전용 조명 레이어, 복잡한 애니메이션 시스템 및 발광 외곽선 등을 통해 캐릭터의 시각적 완성도와 가독성을 높이는 과정을 설명합니다.
핵심 포인트
- 픽셀 아트의 반복적인 작업 한계를 극복하기 위해 3D 엔진을 사용하여 아트 스타일의 유연성을 확보함
- 셀 셰이딩 셰이더를 통해 3D 모델에 손으로 그린 듯한 느낌을 부여함
- 전용 동적 조명 레이어를 사용하여 캐릭터에 최적화된 빛 표현을 구현함
- 애니메이션 타이밍 조절과 수동 스크립팅을 결합하여 정교한 동작 시스템을 구축함
- 발광 외곽선(Emissive outline)을 활용해 어두운 환경에서도 캐릭터의 가독성을 유지함
나의 첫 번째 프로젝트는 실패였습니다.
그 이유 중 하나는 첫 아이디어를 구상할 때부터 내가 고수해 온 원칙 때문이었습니다: 아트 에셋 (Art asset)으로서의 당신의 주인공 캐릭터는 특별한 의미를 갖습니다. 내가 가장 좋아하는 게임들에서 나는 게임 캐릭터들을 아주 친밀하게 알고 있습니다. 모든 애니메이션 프레임 (Animation frame), 모든 픽셀 (Pixel), 모든 이펙트 (Effect)를 말이죠. 당연한 소리 같겠지만, 당신은 이 단 하나의 에셋을 뚫어지게 쳐다보며 말도 안 될 정도로 연구하는 데 수많은 시간을 보냅니다.
당신의 주인공 캐릭터는 수많은 시간 동안 "재미있게" 보이고 느껴져야 합니다. 일종의 소모품처럼 쓰이는 다른 모든 아트들 사이에서, 주인공 캐릭터는 항상 화면에 남아 있습니다.
첫 번째 프로젝트에서 나는 픽셀 기반의 아트 스타일 (Pixel based artstyle)로 주인공 캐릭터 에셋을 작업했습니다. 나는 며칠 동안 각 애니메이션을 다듬었고, 수십 번의 반복적인 루프 (Iterative loops)를 거쳤습니다. 그러다 문득 깨닫기 시작했습니다. 만약 이런 식으로 작업해야 한다면, 나는 절대 끝내지 못할 것이라는 사실을 말이죠.
이것이 Mazestalker가 기본적으로 2D 게임임에도 불구하고 여전히 3D 엔진을 사용하는 이유입니다. 3D 엔진을 사용하면 새로운 결정을 내릴 때마다 수백 개의 애니메이션 스프라이트 (Animation sprites)를 매번 다시 그릴 필요 없이, 주인공 캐릭터의 아트 스타일을 지속적으로 발전시킬 수 있기 때문입니다.
그래서 프로젝트를 시작한 지 몇 년이 지난 지난 반년 정도 동안, 프로세스 초기에는 명확하지 않았던 주인공 캐릭터를 표현하는 방법에 대해 몇 가지 아이디어를 얻었습니다. 이제 나는 최종 푸티지 (Footage)를 기록해야 하는 단계에 진입했기에, 캐릭터를 빛나게 만들기 위해 열심히 작업하고 있었습니다.
나는 캐릭터의 외형과 느낌에 매우 만족하며, 이제 드디어 이 장을 마무리할 수 있을 것 같습니다.
다음은 몇 년 동안 아트 스타일이 어떻게 진화했는지에 대한 단계입니다:
-
셀 셰이딩 셰이더 (Cell shaded shader)는 스프라이트 애니메이션 (Sprite-animation)의 손으로 그린 듯한 느낌을 불러일으킵니다.
-
나는 오직 주인공 캐릭터에게만 특정 동적 조명 레이어 (Dynamic lighting layer)를 적용하여, 빛이 모델 자체에 항상 올바르고 멋지게 보이도록 합니다. Unity의 포인트 라이트 (Point lights)는 정확한 위치에 배치하기가 매우 어렵습니다. 빛이 캐릭터로부터 나오는 위치에 배치하면 캐릭터가 보통 그 안으로 움직이게 되어 끔찍한 문제들을 일으키곤 합니다. 전용 레이어를 사용하는 것이 그 문제를 해결해 줍니다.
-
저는 애니메이션 시스템 (Animation system)을 말도 안 될 정도로 재작업했으며, 이제는 제 게임에서 가장 복잡한 시스템이 되었습니다. 포즈와 동작을 강조하기 위해 특정 애니메이션 키프레임 (Animation-keyframes)에 맞춰 애니메이션 타이밍을 조절하며, 더 많은 레이어 (Layers)와 추가적인 애니메이터 (Animators)가 존재합니다. 수많은 블렌드 트리 (Blendtrees)를 사용하지만, 특정 디테일을 구현하기 위해 일부 수동 스크립팅 (Manual scripting)도 병행합니다.
-
저는 캐릭터가 Yves의 표현력이 풍부하고 독립적인 스타일을 강조할 수 있도록, 정해진 세트 중에서 무작위 공격 애니메이션을 재생하기를 원했습니다.
-
저는 어둠을 활용하는 것을 좋아하지만, 때로는 그로 인해 캐릭터가 잘 보이지 않게 됩니다. 이것이 제가 Yves의 머리카락, 검, 그리고 배낭 모두에 발광 외곽선 (Emissive outline)을 추가한 이유 중 하나입니다. 이는 가장 어두운 구석에서도 항상 보이지만, 낮에는 전혀 보이지 않습니다.
-
최근에는 배낭에 물리 셰이더 (Physical shader)를 추가하여 캐릭터의 움직임에 따라 배낭이 흔들리도록 만들었습니다. 이는 플랫폼 액션 (Platforming)이나 일반적인 이동 중에 시선을 끄는 재미있는 요소를 캐릭터에 더해줍니다. 이를 vectorpaint로 제어하려고 시도했으나 잘 되지 않아, 대신 간단한 텍스처 (Texture)를 구현했습니다.
-
마지막 단계는 최근에 내린 결정입니다. 저는 모든 애니메이션을 12 FPS로 렌더링합니다. 이것이 가장 논란이 될 만한 기능이라고 생각하지만, 특정 프레임이 렌더링되는 방식을 세밀하게 조정할 수 있는 미세 조정 (Finetuning) 레이어를 추가했습니다. 이는 제가 목표로 하는 레트로 (Retro) 감성을 불러일으키는 주인공 캐릭터만의 또 다른 스타일라이제이션 (Stylization) 층을 제공합니다.
이 모든 것들이 모여 제 주인공 캐릭터의 외형을 완성합니다.
Steam에서 제 게임을 확인하고 싶으시다면, 데모 버전이 준비되어 있습니다:
AI 자동 생성 콘텐츠
본 콘텐츠는 r/Unity3D (top/week)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기