유니티 2D
1. 개요
1. 개요
유니티 2D는 유니티 엔진을 사용하여 2차원 그래픽을 기반으로 게임이나 애플리케이션을 제작하는 개발 방식을 의미한다. 주로 2D 게임 개발, 2D 애니메이션 제작, 2D 인터랙티브 애플리케이션 개발에 사용된다. 이 기능은 유니티 4.3 버전[2]에서 공식적으로 도입되어, 기존의 3D 중심 엔진을 2D 개발에 최적화된 환경으로 확장하는 중요한 전환점이 되었다.
유니티 2D는 스프라이트 관리, 타일맵 편집, 2D 물리 시뮬레이션 등 2D 개발에 특화된 전용 도구 세트를 제공한다. 이를 통해 개발자는 직관적인 에디터 인터페이스 안에서 애니메이션, 충돌 처리, 렌더링 파이프라인을 효율적으로 구성할 수 있다. 또한 C# 스크립팅을 통한 로직 구현과 강력한 UI 시스템을 결합하여 완성도 높은 2D 프로젝트를 제작하는 것이 가능하다.
이 기술은 인디 게임 개발자부터 대형 스튜디오에 이르기까지 광범위한 개발자 층이 활용하고 있으며, 모바일 게임, PC 게임, 웹 게임 등 다양한 플랫폼으로의 빌드 및 배포를 지원한다. 유니티 2D의 등장은 게임 개발 및 컴퓨터 그래픽스 분야에서 2D 콘텐츠 제작의 접근성을 크게 높이는 계기가 되었다.
2. 핵심 개념
2. 핵심 개념
2.1. 스프라이트(Sprite)
2.1. 스프라이트(Sprite)
스프라이트는 유니티 2D 개발에서 가장 기본적인 그래픽 요소이다. 이는 게임 화면에 표시되는 모든 2D 이미지, 예를 들어 캐릭터, 배경, 아이템, 효과 등을 의미한다. 스프라이트는 일반적으로 PNG나 JPEG 같은 이미지 파일 형식으로 준비되어 유니티 에디터로 임포트된다. 임포트 과정에서 텍스처 설정이 적용되며, 이는 이미지의 압축 방식, 필터링, 픽셀당 단위(PPU) 등을 정의하여 게임 내에서 최적의 형태로 사용될 수 있도록 한다.
스프라이트를 게임 오브젝트로 사용하기 위해서는 스프라이트 렌더러 컴포넌트가 필요하다. 이 컴포넌트는 스프라이트 에셋을 참조하여 실제로 화면에 그리는 역할을 한다. 개발자는 스프라이트 렌더러를 통해 스프라이트의 색상, 레이어 순서, 마테리얼 등을 조절할 수 있다. 또한, 여러 개의 스프라이트를 하나의 시트에 모아놓은 스프라이트 시트를 사용하면 애니메이션 제작이나 메모리 관리에 효율적이다.
스프라이트의 충돌 판정을 구현하려면 콜라이더2D 컴포넌트를 추가해야 한다. 가장 일반적으로 사용되는 것은 스프라이트의 외곽선을 따는 폴리곤 콜라이더2D와 단순한 사각형 영역을 정의하는 박스 콜라이더2D이다. 물리적인 상호작용이 필요하다면 리지드바디2D 컴포넌트와 함께 사용하여 중력이나 힘의 영향을 받게 할 수 있다.
유니티 에디터 내의 스프라이트 에디터 도구는 스프라이트 작업을 위한 전용 환경을 제공한다. 이 도구를 사용하면 스프라이트 시트에서 개별 프레임을 슬라이스하고, 9-슬라이스 스케일링을 설정하여 UI 요소의 모서리를 깨지지 않게 조정하며, 스프라이트의 피벗점과 커스텀 물리 모양을 편집할 수 있다. 이러한 작업들은 복잡한 2D 그래픽 에셋을 체계적으로 관리하고 게임에 적용하는 데 필수적이다.
2.2. 2D 물리(Physics2D)
2.2. 2D 물리(Physics2D)
유니티의 2D 물리 시스템은 2차원 공간에서 오브젝트의 운동, 충돌, 중력 등의 물리적 상호작용을 시뮬레이션하는 핵심 기능이다. 이 시스템은 3D 물리 엔진을 기반으로 하지만, 계산을 2차원 평면으로 단순화하여 성능 효율성을 높이고 2D 게임 개발에 최적화된 워크플로우를 제공한다. 핵심 구성 요소로는 강체의 운동을 정의하는 리지드바디2D와 오브젝트의 충돌 영역을 정의하는 다양한 콜라이더2D가 있다.
2D 물리의 동작은 별도의 물리 레이어에서 처리되며, FixedUpdate 주기에서 연산이 수행된다. 개발자는 중력의 방향과 세기, 물리 재질을 통한 마찰력과 탄성 계수 등을 설정하여 현실적인 물리 반응을 구현할 수 있다. 또한, 힘과 토크를 가하거나 관절을 사용하여 복잡한 기계적 운동을 만들 수 있다.
충돌 감지와 반응은 2D 물리의 중요한 부분이다. 콜라이더2D는 박스 콜라이더2D, 원형 콜라이더2D, 캡슐 콜라이더2D, 폴리곤 콜라이더2D 등 다양한 형태로 제공되어 스프라이트의 모양에 맞게 정밀한 충돌 영역을 설정할 수 있다. 충돌이 발생하면 OnCollisionEnter2D, OnTriggerEnter2D와 같은 이벤트 함수를 통해 스크립트에서 반응을 처리할 수 있다.
이 시스템은 플랫포머 게임의 점프와 낙하, 슈팅 게임의 총알 충돌, 퍼즐 게임의 오브젝트 간 물리 퍼즐 등 다양한 2D 게임 장르의 핵심 메커니즘을 구축하는 데 필수적이다. 성능을 위해 불필요한 물리 계산을 줄이고, 간단한 기하학적 형태의 콜라이더를 사용하는 등의 최적화가 권장된다.
2.3. 타일맵(Tilemap)
2.3. 타일맵(Tilemap)
타일맵은 유니티 2D에서 격자 기반의 배경이나 레벨을 효율적으로 구성하기 위한 핵심 시스템이다. 이 시스템은 타일 에셋을 팔레트에 등록한 후, 브러시 도구를 이용해 게임 월드에 직관적으로 페인팅하듯 배치할 수 있게 해준다. 타일맵을 사용하면 대규모의 정적 환경을 빠르게 제작하고 수정할 수 있으며, 특히 플랫포머 게임이나 롤플레잉 게임의 맵 제작에 널리 활용된다.
유니티의 타일맵 시스템은 기본적인 타일맵 렌더러 외에도 다양한 전용 컴포넌트를 제공한다. 타일맵 콜라이더 2D는 배치된 타일에 자동으로 충돌체를 생성해주고, 타일맵 애니메이션 타일을 사용하면 움직이는 물이나 불꽃 같은 애니메이션 타일을 구현할 수 있다. 또한 규칙 타일 기능은 미리 정의된 규칙에 따라 타일의 모양이 주변 타일에 맞춰 자동으로 변경되도록 설정할 수 있어, 복잡한 지형 제작을 간소화한다.
타일맵 작업은 주로 유니티 에디터의 전용 창을 통해 이루어진다. 타일 팔레트 창에서 사용할 타일 스프라이트를 관리하고, 타일맵 브러시를 선택해 씬 뷰에서 직접 타일을 배치하거나 지울 수 있다. 여러 층의 타일을 겹쳐 배치해야 할 경우에는 서로 다른 정렬 순서를 가진 타일맵 게임 오브젝트를 여러 개 생성해 레이어처럼 사용하는 것이 일반적이다.
이 시스템은 레벨 디자인 워크플로우를 획기적으로 개선하며, 아티스트와 디자이너가 코드 의존 없이도 시각적으로 콘텐츠를 제작할 수 있는 기반을 마련했다. 유니티 에코시스템 내에는 타일맵 제작을 보조하는 다양한 서드파티 에디터 확장 도구도 존재하며, 이를 통해 보다 전문적이고 복잡한 타일 기반 월드를 구축하는 것이 가능해졌다.
2.4. 2D 애니메이션
2.4. 2D 애니메이션
유니티의 2D 애니메이션 시스템은 정적 스프라이트에 생동감을 불어넣는 핵심 도구이다. 이 시스템은 주로 애니메이션 창(Animation Window)과 애니메이터 창(Animator Window)을 통해 구성되며, 각각 애니메이션 클립의 제작과 상태 흐름의 관리를 담당한다. 개발자는 애니메이션 창에서 시간축을 따라 스프라이트 렌더러의 스프라이트를 교체하거나 트랜스폼의 위치, 회전, 크기 등의 속성을 변경하여 키프레임 애니메이션을 만들 수 있다. 이렇게 생성된 애니메이션 클립은 애니메이터 창에서 상태 머신을 구성하는 노드로 사용되어 캐릭터의 대기, 이동, 점프 등 다양한 상태와 전이 조건을 정의하는 데 활용된다.
보다 정교한 스켈레탈 애니메이션을 구현하기 위해서는 2D 애니메이션 패키지와 2D PSD 임포터를 활용할 수 있다. 이 도구들을 사용하면 하나의 스프라이트를 여러 개의 본과 메시로 분리하고, 아마추어와 유사한 방식으로 리깅을 구성할 수 있다. 이를 통해 하나의 텍스처 아틀라스로 자연스러운 관절 운동과 디포메이션을 구현할 수 있어, 전통적인 스프라이트 시트 애니메이션보다 메모리 효율성이 높고 유연한 작업이 가능해진다. 특히 유니티 2017.1 버전부터 본격적으로 도입된 이 시스템은 복잡한 2D 캐릭터 애니메이션 제작의 표준이 되었다.
애니메이션의 제어는 C 샤프 스크립팅을 통해 이루어진다. Animator 컴포넌트의 SetBool, SetFloat, SetTrigger 같은 메서드를 호출하여 파라미터 값을 변경하면, 미리 설정된 전이 조건에 따라 애니메이터 컨트롤러의 상태가 전환된다. 또한 Animation 컴포넌트를 사용하여 레거시 애니메이션 클립을 직접 재생할 수도 있다. 이러한 애니메이션 로직은 게임플레이와 밀접하게 연동되어, 플레이어 입력, 물리 충돌, 인공지능 행동에 반응하는 살아 있는 캐릭터와 객체를 만들어낸다.
2.5. 스프라이트 렌더러(Sprite Renderer)
2.5. 스프라이트 렌더러(Sprite Renderer)
스프라이트 렌더러는 유니티 (게임 엔진)에서 2D 그래픽의 핵심 구성 요소인 스프라이트 (컴퓨터 그래픽)를 화면에 그리는 역할을 담당하는 컴포넌트이다. 모든 2D 오브젝트는 스프라이트 렌더러 컴포넌트를 통해 지정된 스프라이트 이미지를 표시하며, 이 컴포넌트가 없으면 게임 오브젝트는 비록 스프라이트 에셋을 가지고 있더라도 화면에 보이지 않는다. 씬 (게임 개발) 뷰와 게임 뷰에서 시각적으로 표현되는 모든 2D 요소의 기초가 된다.
이 컴포넌트는 스프라이트의 시각적 속성을 세밀하게 제어할 수 있는 다양한 파라미터를 제공한다. 주요 설정에는 표시할 스프라이트 이미지 선택, 색상 틴트 조정, 그리고 렌더링 순서를 결정하는 'Order in Layer' 값이 포함된다. 'Order in Layer' 값은 여러 2D 오브젝트가 겹쳐 있을 때 어떤 오브젝트가 앞에 또는 뒤에 표시될지를 결정하는 데 사용되며, 2D 레이어 정렬의 기본적인 방법이다.
스프라이트 렌더러는 머티리얼 (컴퓨터 그래픽)을 할당받아 스프라이트의 최종 출력 방식을 변경할 수 있다. 기본적으로 유니티의 2D 스프라이트 디폴트 머티리얼이 사용되지만, 사용자 정의 셰이더를 적용한 머티리얼을 사용하여 특수한 시각적 효과를 구현할 수도 있다. 또한, 스프라이트의 일부분만을 보여주는 '마스크' 기능이나, 애니메이션에서 여러 스프라이트를 전환하는 데에도 이 컴포넌트가 핵심적으로 활용된다.
C 샤프 스크립팅을 통해 스프라이트 렌더러 컴포넌트에 동적으로 접근하여 게임 실행 중에 스프라이트를 변경하거나 색상, 투명도를 조절하는 것이 가능하다. 이는 캐릭터의 상태 변화, 피격 효과, 아이템 획득 시 외형 변경 등 다양한 게임플레이 요소를 구현하는 데 필수적이다. 따라서 스프라이트 렌더러는 정적인 이미지를 표시하는 것을 넘어, 동적이고 인터랙티브한 2D 게임 경험을 창조하는 데 있어 중요한 도구이다.
2.6. 2D 콜라이더(Collider2D)
2.6. 2D 콜라이더(Collider2D)
2D 콜라이더는 유니티에서 2D 게임 오브젝트의 물리적 형태와 충돌 범위를 정의하는 컴포넌트이다. 3D 공간의 콜라이더와 달리, 2D 콜라이더는 평면(X축과 Y축) 상에서의 충돌을 처리하도록 설계되었다. 이 컴포넌트는 물리 엔진이 오브젝트 간의 접촉, 겹침, 충돌을 감지하고 이에 따른 물리적 반응을 계산하는 데 필요한 경계 영역을 제공한다. 주로 스프라이트 렌더러가 시각적 형태를 그리는 오브젝트에 부착되어, 보이지 않는 물리적 몸체를 구성한다.
유니티는 다양한 형태와 용도에 맞는 여러 종류의 2D 콜라이더를 제공한다. 가장 기본적인 형태는 박스 콜라이더 2D와 원형 콜라이더 2D로, 직사각형과 원형의 단순한 충돌 영역을 빠르게 설정할 수 있다. 더 복잡한 형태를 표현하기 위해서는 폴리곤 콜라이더 2D를 사용하여 임의의 다각형 모양으로 충돌 영역을 세밀하게 정의할 수 있다. 또한, 캡슐 콜라이더 2D는 타원형이나 캡슐 모양의 충돌체를 만들 때 유용하다. 에지 콜라이더 2D는 선분이나 플랫폼의 가장자리와 같은 단순한 선 형태의 충돌 영역을 생성하는 데 사용된다.
이러한 콜라이더들은 크게 두 가지 목적으로 사용된다. 하나는 트리거로 설정되어 물리적 반응 없이 오브젝트의 진입 여부만 감지하는 것이고, 다른 하나는 고체 충돌체로 설정되어 리지드바디 2D 컴포넌트와 함께 작동하여 오브젝트가 서로 밀리고 튕기는 실제 물리 시뮬레이션을 가능하게 하는 것이다. 예를 들어, 플레이어 캐릭터가 땅을 밟거나 벽에 부딪히는 현상은 고체 충돌체로, 아이템을 획득하는 영역은 트리거로 설정하는 것이 일반적이다.
2D 게임 개발에서 콜라이더의 최적화는 성능에 중요한 영향을 미친다. 박스 콜라이더 2D나 원형 콜라이더 2D는 계산 비용이 낮아 단순한 형태에 우선적으로 사용하는 것이 좋다. 폴리곤 콜라이더 2D는 정점 수를 최소화하여 복잡도를 줄여야 한다. 또한, 불필요한 충돌 계산을 피하기 위해 레이어 충돌 매트릭스를 설정하여 특정 레이어 간의 충돌만 발생하도록 관리하는 것이 필수적이다.
3. 주요 기능 및 시스템
3. 주요 기능 및 시스템
3.1. 스프라이트 에디터
3.1. 스프라이트 에디터
스프라이트 에디터는 유니티 엔진 내에서 2D 그래픽의 기본 단위인 스프라이트를 편집하고 관리하는 통합 도구이다. 이 도구는 이미지 파일을 임포트할 때 자동으로 활성화되며, 단일 텍스처 파일에서 여러 개의 스프라이트를 생성하고, 그 경계를 정의하며, 피벗 점을 설정하고, 메타데이터를 추가하는 작업을 수행할 수 있다. 특히 복수의 스프라이트를 하나의 시트로 관리하는 스프라이트 아틀라스를 생성하거나, 타일맵 제작에 적합한 규칙적 그리드 형태로 분할하는 기능을 제공하여 애셋 관리의 효율성을 높인다.
주요 편집 모드로는 단일 스프라이트를 수동으로 잘라내는 'Single' 모드, 자동으로 경계를 감지하여 분할하는 'Automatic' 모드, 그리고 행과 열의 수를 지정해 균등하게 분할하는 'Grid by Cell Size' 또는 'Grid by Cell Count' 모드가 있다. 이러한 분할 작업을 통해 게임 캐릭터의 다양한 동작 애니메이션을 위한 프레임 시트를 쉽게 준비하거나, 타일맵을 구성하는 데 필요한 여러 타일 에셋을 한 번에 생성할 수 있다.
에디터 내에서는 각 스프라이트의 물리적 상호작용 영역을 정의하는 폴리곤 콜라이더를 자동 생성하거나 편집할 수 있는 기능도 포함되어 있다. 이를 통해 이미지의 외곽선을 따라 정확한 2D 충돌체를 빠르게 만들 수 있어, 물리 엔진 기반의 게임플레이 구현 워크플로우가 단순화된다. 또한 스프라이트의 원점이 되는 피벗 위치를 시각적으로 조정하여 회전이나 스케일 조작의 기준점을 설정할 수 있다.
스프라이트 에디터에서 생성 및 수정된 정보는 해당 이미지 파일과 함께 저장되는 메타 파일에 기록된다. 이는 원본 이미지 소스를 수정하지 않고도 스프라이트의 분할 정보, 피벗 설정, 태그 등을 유니티 프로젝트 내에서 독립적으로 관리할 수 있음을 의미한다. 결과적으로 이 도구는 2D 게임 개발의 초기 애셋 준비 단계에서 필수적인 역할을 하며, 예술가와 개발자 간의 협업 과정을 원활하게 만드는 기반을 제공한다.
3.2. 2D 조명(Lighting)
3.2. 2D 조명(Lighting)
유니티 2D의 조명 시스템은 2D 씬에 깊이와 분위기를 더하는 데 필수적인 요소이다. 전통적인 3D 조명과 달리, 2D 조명은 주로 스프라이트와 2D 월드에 영향을 주어 빛과 그림자를 시뮬레이션한다. 이 시스템은 스프라이트 렌더러의 머티리얼 속성과 상호작용하며, 다양한 종류의 라이트 2D 컴포넌트를 통해 구현된다. 개발자는 이를 통해 낮과 밤의 사이클을 만들거나, 특정 영역을 강조하는 스포트라이트 효과, 전체적인 환경광을 조절하는 글로벌 조명 등을 적용할 수 있다.
2D 조명의 핵심 구성 요소는 포인트 라이트, 스포트라이트, 글로벌 라이트, 스프라이트 라이트 등이다. 포인트 라이트는 특정 지점에서 모든 방향으로 빛을 발산하며, 스포트라이트는 원뿔 형태의 제한된 각도로 빛을 비춘다. 글로벌 라이트는 씬 전체에 균일한 빛을 제공하는 배경광 역할을 한다. 특히 스프라이트 라이트는 빛의 모양과 색상을 스프라이트 에셋으로 직접 정의할 수 있어 창문이나 네온 사인 같은 효과적인 조명 연출이 가능하다.
이러한 조명 효과는 2D 렌더러 파이프라인을 통해 처리되며, 노멀 맵과 함께 사용될 때 더욱 사실적인 입체감을 만들어낸다. 평면 스프라이트에 노멀 맵을 적용하면 빛이 표면에서 반사되는 각도를 조절하여 2D 그래픽에 3D 같은 질감과 깊이를 부여할 수 있다. 또한, 조명 레이어와 블렌딩 모드를 활용하면 복잡한 빛의 중첩과 색상 혼합 효과를 제어할 수 있어, 다양한 아트 스타일을 구현하는 데 유용하다.
3.3. 2D 효과(Effect)
3.3. 2D 효과(Effect)
유니티 2D 효과는 2D 게임의 시각적 품질과 몰입감을 높이는 다양한 그래픽 기능을 제공한다. 주로 스프라이트에 적용되며, 파티클 시스템, 포스트 프로세싱, 쉐이더 등을 활용하여 화려한 연출을 구현할 수 있다. 예를 들어, 폭발이나 마법 이펙트는 파티클 시스템으로, 전체 화면의 색감이나 블러 효과는 포스트 프로세싱으로 제작한다.
2D 효과 구현의 핵심은 스프라이트 렌더러와 쉐이더의 조합이다. 스프라이트 렌더러의 머티리얼에 특수한 2D 쉐이더를 적용하면, 디졸브나 아웃라인 효과, 스크롤하는 UV 맵을 통한 물 흐름 효과 등을 쉽게 만들 수 있다. 또한 유니티 2D 조명 시스템과 연동하여 빛의 영향을 받는 스프라이트에 동적인 그림자나 발광 효과를 더할 수 있다.
효과 최적화를 위해 스프라이트 아틀라스를 사용하고, 불필요한 파티클 수를 제어하며, 성능에 민감한 포스트 프로세싱 효과는 선택적으로 적용하는 것이 중요하다. 이러한 효과들은 애니메이션 및 물리 시스템과 결합되어 게임플레이의 피드백을 강화하고, 전반적인 사용자 경험을 향상시킨다.
3.4. UI 시스템
3.4. UI 시스템
유니티의 UI 시스템은 게임 내 메뉴, HUD, 대화창, 버튼, 슬라이더 등 사용자 인터페이스를 구성하고 관리하는 통합된 도구 모음이다. 이 시스템은 캔버스라는 특별한 게임 오브젝트를 중심으로 작동하며, 모든 UI 요소는 이 캔버스의 자식으로 배치되어 화면에 렌더링된다. 캔버스는 화면 공간 또는 월드 공간에 배치될 수 있어, 2D 화면 UI와 3D 월드에 배치되는 UI를 모두 제작할 수 있다. UI 요소의 배치와 크기 조정은 앵커와 피벗을 통해 직관적으로 제어되며, 다양한 해상도와 화면 비율에 대응하는 반응형 디자인을 구현하는 데 필수적이다.
주요 구성 요소로는 텍스트를 표시하는 텍스트, 이미지를 표시하는 이미지, 상호작용이 가능한 버튼과 토글, 값을 조절하는 슬라이더와 스크롤바, 목록을 구성하는 드롭다운 등이 있다. 이러한 요소들은 이벤트 시스템을 통해 사용자의 입력(마우스 클릭, 터치, 키보드)을 감지하고, 개발자가 지정한 함수를 호출하는 방식으로 상호작용을 처리한다. 특히 유니티 이벤트 시스템은 코드를 최소화하면서도 시각적으로 이벤트 흐름을 구성할 수 있게 해준다.
UI 시스템은 애니메이션과 시각적 피드백을 강화하는 데에도 활용된다. 애니메이터 컴포넌트와 연동하여 버튼의 호버, 클릭 상태를 시각적으로 표현하거나, 복잡한 UI 전환 애니메이션을 만들 수 있다. 또한, 마스크 컴포넌트와 스크롤 뷰를 결합하면 제한된 영역 안에서 콘텐츠를 스크롤하여 볼 수 있는 인터페이스를 쉽게 구성할 수 있다. 이러한 도구들은 게임 개발에서 직관적이고 매력적인 사용자 경험을 설계하는 데 핵심적인 역할을 한다.
3.5. 입력 관리(Input System)
3.5. 입력 관리(Input System)
유니티 2D 개발에서 입력 관리는 플레이어의 조작을 게임 로직과 연결하는 핵심 시스템이다. 유니티는 기존의 레거시 입력 관리자와 새로운 입력 시스템 패키지를 제공하여 다양한 입력 방식을 처리한다. 키보드, 마우스, 터치스크린, 게임패드 등 다양한 입력 장치를 지원하며, 이를 통해 캐릭터 이동, 점프, 공격, UI 상호작용 등 게임 내 모든 사용자 액션을 제어할 수 있다.
입력을 설정하기 위해 개발자는 유니티 에디터의 프로젝트 설정에서 입력 축과 버튼을 정의한다. 예를 들어, "Horizontal"이라는 가상 축을 만들어 좌우 방향키와 게임패드 조이스틱을 동시에 매핑할 수 있다. 이렇게 정의된 입력은 C# 스크립트 내에서 Input.GetAxis() 또는 Input.GetButtonDown() 같은 함수를 호출하여 간편하게 읽어올 수 있다. 이 방식은 코드에서 직접 키 코드를 하드코딩하는 것을 방지하고, 여러 입력 장치에 대한 지원을 유연하게 만든다.
보다 현대적이고 확장성 있는 접근을 위해 유니티는 별도의 입력 시스템 패키지를 제공한다. 이 시스템은 액션 기반의 설계를 채택하여, "Move", "Jump"와 같은 논리적 액션을 생성하고 여기에 여러 입력 소스를 바인딩할 수 있다. 이 패키지는 입력 처리 로직을 더 깔끔하게 구조화할 수 있게 하며, 복잡한 입력 콤보, 리바인딩, 장치 연결/해제 시 동적 대응 등 고급 기능을 제공한다. 특히 모바일 터치 입력과 여러 게임패드를 동시에 처리하는 데 유리하다.
2D 게임에서는 입력 반응의 즉시성과 정확성이 매우 중요하다. 따라서 입력 처리는 일반적으로 Update() 루프에서 이루어지며, 물리 계산과의 일관성을 위해 FixedUpdate()에서 입력 값을 캐시하여 사용하기도 한다. 올바른 입력 관리 시스템을 구축하면 게임의 조작감을 크게 향상시키고, 다양한 플랫폼으로의 이식성을 높일 수 있다.
4. 개발 워크플로우
4. 개발 워크플로우
4.1. 에셋 준비 및 임포트
4.1. 에셋 준비 및 임포트
유니티 2D 프로젝트의 첫 번째 단계는 에셋을 준비하고 유니티 에디터로 가져오는 작업이다. 이 과정은 주로 그래픽 디자이너나 아티스트가 제작한 스프라이트, 배경 이미지, UI 요소 등의 시각적 자원을 게임 엔진이 인식하고 사용할 수 있는 형태로 변환하는 것을 포함한다. 일반적으로 포토샵, 어도비 일러스트레이터, 에이세스프라이트 같은 외부 그래픽 도구에서 작업된 PNG 또는 PSD 파일을 프로젝트의 'Assets' 폴더로 임포트한다.
에셋을 임포트하면 유니티는 자동으로 텍스처 임포터 설정을 적용한다. 2D 개발의 핵심은 모든 이미지 파일의 'Texture Type'을 'Sprite (2D and UI)'로 설정하는 것이다. 이렇게 하면 이미지가 3D 객체의 표면이 아닌, 평면 스프라이트로 처리된다. 또한, 불필요한 메모리 사용을 줄이고 렌더링 효율을 높이기 위해 이미지의 원본 크기에 맞게 'Max Size' 값을 조정하고, 'Compression' 방식을 적절히 선택하는 것이 중요하다.
여러 개의 개별 스프라이트가 하나의 이미지 파일에 포함된 스프라이트 시트를 사용하는 경우, 'Sprite Mode'를 'Multiple'로 변경한 후 'Sprite Editor'를 열어 각 스프라이트의 영역을 수동 또는 자동으로 잘라내어 정의한다. 이렇게 생성된 여러 개의 스프라이트 서브 에셋은 애니메이션 클립 제작이나 타일맵 팔레트 생성에 직접 활용할 수 있다. 에셋 관리의 편의성을 위해 프로젝트 내에서 이미지, 프리팹, 스크립트 등을 체계적으로 분류한 폴더 구조를 미리 구성해 두는 것이 좋다.
4.2. 씬 구성
4.2. 씬 구성
씬은 유니티 2D 프로젝트에서 게임의 한 장면이나 레벨을 구성하는 기본 단위이다. 씬 구성은 게임 오브젝트를 배치하고, 컴포넌트를 설정하며, 게임의 공간적, 기능적 구조를 만드는 과정을 의미한다. 개발자는 씬 뷰에서 시각적으로 게임 오브젝트를 배치하고, 계층 구조 창을 통해 오브젝트 간의 부모-자식 관계를 설정하여 논리적인 그룹을 형성한다. 이 과정에서 카메라, 조명, 배경, 캐릭터, UI 요소 등이 적절히 배치되어 하나의 완성된 게임 화면을 이루게 된다.
씬을 구성하는 핵심 요소로는 스프라이트 렌더러 컴포넌트가 부착된 2D 그래픽 오브젝트와, 충돌을 처리하는 콜라이더2D, 물리 시뮬레이션을 담당하는 리지드바디2D 등이 있다. 특히 타일맵 시스템은 타일 팔레트를 만들어 반복되는 배경 지형을 효율적으로 구성하는 데 필수적이다. 또한, 캔버스를 사용한 UI 요소는 주로 화면 좌표에 고정되어 메뉴나 체력 바 등을 표시하는 데 사용된다.
효율적인 씬 관리를 위해 프리팹 시스템이 널리 활용된다. 자주 사용되는 게임 오브젝트(예: 적 캐릭터, 아이템)를 프리팹으로 만들어 프로젝트에 저장하면, 동일한 오브젝트를 여러 번 인스턴스화하여 씬에 배치할 수 있어 작업 효율성과 일관성을 높일 수 있다. 씬 간의 전환은 씬 매니저를 통해 스크립트로 제어하며, 씬 빌드 설정에 사용할 씬들을 등록해야 정상적으로 로드할 수 있다.
4.3. 스크립팅(C#)
4.3. 스크립팅(C#)
유니티 2D 개발에서 스크립팅은 C# 프로그래밍 언어를 사용하여 게임의 로직과 상호작용을 구현하는 핵심 과정이다. 모든 게임 오브젝트의 동작, 상태 관리, 사용자 입력 처리, 물리 시뮬레이션 제어, 애니메이션 트리거, 사용자 인터페이스 업데이트 등은 C# 스크립트를 통해 이루어진다. 스크립트는 유니티 에디터 내에서 컴포넌트로서 게임 오브젝트에 부착되며, MonoBehaviour 클래스를 상속받아 유니티의 생명주기 함수를 활용한다.
2D 게임 개발에 특화된 스크립팅은 주로 2D 전용 컴포넌트들을 제어하는 데 초점을 맞춘다. 예를 들어, 스프라이트 렌더러 컴포넌트의 sprite 속성을 변경하여 캐릭터의 이미지를 교체하거나, Rigidbody2D 컴포넌트에 힘을 가해 오브젝트를 이동시키는 것이 일반적이다. 또한 콜라이더2D 컴포넌트를 이용한 충돌 감지는 OnCollisionEnter2D나 OnTriggerEnter2D 같은 특수한 메서드를 통해 처리한다. 이러한 2D 전용 물리 시스템과의 연동은 3D 개발과 구분되는 중요한 특징이다.
스크립트를 효과적으로 작성하기 위해서는 유니티 에디터의 인스펙터 창과의 연동이 중요하다. public 변수나 [SerializeField] 속성을 사용하면 스크립트 내 변수를 에디터에서 직접 설정할 수 있어, 아티스트나 디자이너와의 협업이 용이해진다. 또한 [RequireComponent] 속성을 사용하여 필요한 컴포넌트의 자동 추가를 보장하거나, FindObjectOfType, GetComponent 등의 메서드를 활용하여 씬 내 다른 오브젝트나 컴포넌트에 대한 참조를 얻을 수 있다.
최적화 측면에서 2D 스크립팅은 불필요한 업데이트 함수 호출을 줄이고, 객체 풀링을 구현하며, 코루틴을 활용한 비동기 작업 처리 등에 주의를 기울인다. 특히 많은 수의 스프라이트를 제어할 경우 성능 저하가 발생할 수 있으므로, 프레임 레이트를 유지하기 위한 효율적인 알고리즘 설계가 필요하다. 최종적으로 작성된 스크립트는 빌드 과정을 거쳐 목표 플랫폼에 맞는 실행 파일로 배포된다.
4.4. 물리 및 충돌 설정
4.4. 물리 및 충돌 설정
물리 및 충돌 설정은 유니티 2D에서 오브젝트 간의 상호작용과 현실적인 움직임을 구현하는 핵심 단계이다. 이 과정은 주로 유니티 엔진에 내장된 Physics2D 시스템과 다양한 2D 콜라이더 컴포넌트를 활용하여 이루어진다. 개발자는 리지드바디2D 컴포넌트를 오브젝트에 추가하여 중력, 질량, 마찰력 등의 물리 속성을 부여하고, 그 주변에 콜라이더를 부착하여 오브젝트의 충돌 범위를 정의한다. 이를 통해 캐릭터가 땅을 밟고, 물체가 서로 부딪히며 튕겨나가는 기본적인 물리 시뮬레이션이 가능해진다.
충돌 처리를 위한 콜라이더의 종류는 목적에 따라 선택된다. 간단한 형태의 충돌 영역을 정의할 때는 박스 콜라이더2D나 원형 콜라이더2D를 사용하며, 복잡한 불규칙한 형태의 스프라이트에 정밀한 충돌 영역을 설정해야 할 때는 폴리곤 콜라이더2D를 활용한다. 특히 지형이나 복잡한 배경 요소를 만들 때는 타일맵 콜라이더2D를 타일맵에 적용하여 효율적으로 작업할 수 있다. 이러한 콜라이더들은 서로 겹침(Trigger) 또는 충돌(Collision)하는 이벤트를 발생시키며, 이는 C# 스크립팅을 통해 감지하고 처리된다.
콜라이더 유형 | 주요 용도 |
|---|---|
박스 콜라이더2D | 사각형 형태의 오브젝트 (벽, 상자, 플랫폼) |
원형 콜라이더2D | 원형 형태의 오브젝트 (공, 구슬) |
폴리곤 콜라이더2D | 복잡한 다각형 형태의 오브젝트 (캐릭터, 장애물) |
타일맵 콜라이더2D | 타일맵으로 생성된 지형 또는 구조물 |
물리 동작의 세부적인 제어는 프로젝트 설정의 Physics2D 섹션과 개별 컴포넌트의 속성을 조정하여 이루어진다. 여기서는 중력의 크기와 방향, 물리 시뮬레이션의 정밀도, 서로 다른 물리 레이어 간의 충돌 여부 등을 전역적으로 설정할 수 있다. 또한 리지드바디2D 컴포넌트에서 물리 재질을 할당하여 탄성이나 마찰 계수를 조절하거나, 특정 오브젝트를 물리 영향을 받지 않는 정적(Static) 또는 운동학적(Kinematic) 타입으로 설정하여 유연한 게임플레이를 구현한다.
4.5. 애니메이션 제작
4.5. 애니메이션 제작
유니티 2D에서 애니메이션 제작은 주로 애니메이터(Animator) 컴포넌트와 애니메이션 클립(Animation Clip)을 통해 이루어진다. 개발자는 스프라이트 시트(Sprite Sheet)를 준비하거나, 유니티 내부의 2D 애니메이션(2D Animation) 패키지를 활용하여 스켈레탈 애니메이션(Skeletal Animation)을 제작할 수 있다. 스프라이트 시트 방식은 연속된 프레임 이미지를 순차적으로 재생하는 키프레임 애니메이션(Keyframe Animation)에 가깝다.
애니메이션 창(Animation Window)을 사용하면 스프라이트 렌더러의 스프라이트(Sprite) 속성을 시간에 따라 변경하는 애니메이션 클립을 직접 제작할 수 있다. 보다 복잡한 캐릭터 애니메이션을 위해서는 스킨드 메시 에디터(Skinned Mesh Editor)를 활용한 본(Bone) 기반의 리깅(Rigging)과 가중치 페인팅(Weight Painting) 작업이 일반적이다. 이렇게 생성된 애니메이션 클립들은 애니메이터 컨트롤러(Animator Controller) 내의 상태 머신(State Machine)을 통해 연결되고, 스크립트나 조건에 따라 전환된다.
애니메이션 제작 워크플로우는 에셋 준비 단계부터 밀접하게 연관된다. 포토샵(Photoshop)이나 에이스프라이트(Aseprite) 같은 외부 도구로 제작된 스프라이트 시트는 유니티로 임포트 시 스프라이트 에디터(Sprite Editor)에서 슬라이싱(Slicing)하여 개별 프레임으로 분리해야 한다. 반면, 스켈레탈 애니메이션 방식은 하나의 텍스처에 여러 부위를 그린 후 본 구조를 만들어 애니메이션을 적용하므로, 에셋 관리와 애니메이션 재사용에 효율적이다.
4.6. 빌드 및 배포
4.6. 빌드 및 배포
빌드 및 배포는 개발한 유니티 2D 프로젝트를 최종 사용자가 실행할 수 있는 형태로 변환하고, 목표 플랫폼에 출시하는 과정이다. 유니티의 강력한 멀티플랫폼 지원 덕분에 단일 프로젝트에서 다양한 플랫폼을 위한 애플리케이션을 생성할 수 있다. 빌드 설정(Build Settings) 창에서 안드로이드, iOS, 윈도우, macOS, 웹GL 등 원하는 플랫폼을 추가하고, 해당 플랫폼에 필요한 SDK나 도구를 설정한 후 빌드를 실행하면 된다. 이 과정에서 프로젝트의 모든 에셋과 코드가 통합되고 최적화되어 독립 실행 파일이나 패키지가 생성된다.
배포를 위해서는 각 플랫폼의 스토어나 채널에 맞는 추가 작업이 필요하다. 예를 들어, 구글 플레이 스토어나 애플 앱 스토어에 출시하려면 각 스토어의 가이드라인에 맞게 애플리케이션 아이콘, 스플래시 스크린, 메타데이터를 준비하고, 서명용 키스토어 또는 프로비저닝 프로파일을 생성해야 한다. 또한, 해상도 대응, 터치 입력 최적화, 모바일 기기 성능에 맞는 그래픽 설정 조정 등 플랫폼별 최적화가 빌드 단계에서 함께 이루어진다. 유니티는 이러한 과정을 지원하기 위해 플랫폼별 플레이어 설정(Player Settings)에서 세부 옵션을 제공한다.
5. 최적화 기법
5. 최적화 기법
5.1. 스프라이트 아틀라스
5.1. 스프라이트 아틀라스
스프라이트 아틀라스는 여러 개의 개별 스프라이트 이미지 파일을 하나의 큰 텍스처 파일로 합성하는 기술이다. 유니티 엔진에서는 이를 통해 드로우 콜을 줄이고 렌더링 성능을 향상시킨다. 개별 스프라이트를 각각 렌더링할 경우 각각이 하나의 드로우 콜을 발생시키지만, 아틀라스로 묶인 스프라이트들은 하나의 텍스처로 관리되어 한 번의 드로우 콜로 여러 스프라이트를 그릴 수 있다. 이는 특히 모바일 기기와 같은 성능이 제한된 플랫폼에서 프레임 레이트를 안정적으로 유지하는 데 중요한 역할을 한다.
유니티에서 스프라이트 아틀라스를 생성하는 방법은 크게 두 가지이다. 하나는 유니티 에디터의 스프라이트 패커 기능을 사용하는 것이고, 다른 하나는 스프라이트 아틀라스 에셋을 직접 생성하여 관리하는 방식이다. 스프라이트 패커는 프로젝트 설정에서 활성화하면 빌드 시 자동으로 스프라이트를 아틀라스로 묶어주는 반면, 스프라이트 아틀라스 에셋은 개발자가 직접 포함할 스프라이트를 지정하고 런타임에 로드 시점을 제어할 수 있어 더욱 유연하다.
스프라이트 아틀라스를 효과적으로 사용하기 위해서는 몇 가지 주의점이 있다. 아틀라스의 크기는 GPU가 지원하는 최대 텍스처 크기를 고려해야 하며, 지나치게 크면 메모리 사용량이 증가할 수 있다. 또한, 자주 함께 사용되는 스프라이트(예: 같은 캐릭터의 다양한 애니메이션 프레임)를 같은 아틀라스에 배치함으로써 텍스처 스위칭을 최소화하는 것이 좋다. 아틀라스에 포함된 스프라이트는 개별 이미지 파일로 참조하듯이 스프라이트 렌더러나 이미지 컴포넌트에서 동일하게 사용할 수 있다.
최적화 대상 | 설명 |
|---|---|
드로우 콜 | 여러 스프라이트를 하나의 텍스처로 그려 호출 횟수를 줄임 |
메모리 접근 | 텍스처를 한 번만 VRAM에 로드하여 접근 효율 향상 |
배칭 |
이러한 최적화 기법은 2D 게임에서 복잡한 배경, 많은 수의 캐릭터, 다양한 UI 요소를 동시에 표현해야 할 때 필수적으로 고려된다.
5.2. 배칭(Batching)
5.2. 배칭(Batching)
배칭은 유니티 엔진이 여러 개의 스프라이트나 UI 요소를 하나의 드로우 콜로 묶어 그래픽 처리 장치에 전송하는 최적화 기술이다. 이 과정을 통해 렌더링 성능을 크게 향상시킬 수 있다. 배칭은 기본적으로 정적 배칭과 동적 배칭 두 가지 방식으로 나뉜다. 정적 배칭은 움직이지 않는 객체들을 사전에 결합하여 런타임 성능 부하를 줄이는 반면, 동적 배칭은 매 프레임마다 조건을 만족하는 이동 가능한 객체들을 실시간으로 묶는다.
2D 개발에서 배칭의 효율은 주로 스프라이트 렌더러의 설정과 재질 사용에 달려있다. 동일한 재질과 텍스처를 공유하는 스프라이트는 배칭될 가능성이 높아진다. 따라서 스프라이트 아틀라스를 사용하여 여러 스프라이트 이미지를 하나의 대형 텍스처로 패킹하는 것은 배칭 효율을 극대화하는 핵심 방법이다. 또한, UI 요소는 캔버스 시스템 하에서 자체적인 배칭 로직을 수행한다.
배칭 성능을 확인하려면 프로파일러 창의 렌더링 섹션을 활용한다. 여기서 드로우 콜 수와 배치 수를 모니터링하여 최적화가 제대로 적용되고 있는지 판단할 수 있다. 배칭이 제대로 이루어지지 않는 경우, 스프라이트의 재질 인스턴스가 분리되었거나, Z 좌표 값이 서로 달라 깊이 테스트로 인해 배치가 끊기는 경우 등을 점검해야 한다.
5.3. 콜라이더 최적화
5.3. 콜라이더 최적화
콜라이더 최적화는 유니티 2D 프로젝트의 성능을 향상시키는 핵심 기법 중 하나이다. 2D 게임에서 물리 연산과 충돌 감지는 게임플레이의 핵심이지만, 비효율적인 콜라이더 사용은 프레임 드랍을 유발하고 전체 성능을 저하시킬 수 있다. 따라서 개발 과정에서 콜라이더의 수와 복잡도를 관리하는 것이 중요하다.
콜라이더 최적화의 첫 번째 원칙은 가능한 한 간단한 형태의 콜라이더를 사용하는 것이다. 박스 콜라이더 2D와 원형 콜라이더 2D는 계산 비용이 가장 낮은 기본 도형 콜라이더이다. 반면, 폴리곤 콜라이더 2D는 복잡한 형태를 정밀하게 표현할 수 있지만, 꼭짓점 수가 증가할수록 물리 엔진의 부하가 크게 늘어난다. 따라서 정밀한 충돌이 필요하지 않은 객체에는 기본 도형 콜라이더를 사용하고, 폴리곤 콜라이더 2D를 쓸 때는 꼭짓점 수를 최소화하는 것이 좋다.
두 번째로 중요한 것은 콜라이더의 수를 줄이는 것이다. 한 게임 오브젝트에 불필요하게 여러 개의 콜라이더를 추가하지 않도록 주의해야 한다. 또한, 정적인 배경 요소에는 정적 콜라이더를, 움직이는 객체에는 동적 콜라이더를 적절히 구분하여 사용한다. 정적 콜라이더는 물리 엔진이 최적화하여 처리하므로, 움직이지 않는 객체에 동적 콜라이더를 사용하는 것은 성능 낭비이다.
마지막으로, 레이어 기반의 충돌 매트릭스를 활용하는 것이 효율적이다. 모든 객체가 서로 충돌을 검사하지 않도록, 충돌이 필요한 객체 레이어끼리만 상호작용하도록 설정한다. 예를 들어, 배경과 배경은 서로 충돌할 필요가 없으므로 충돌 검사에서 제외할 수 있다. 이를 통해 물리 엔진이 처리해야 할 충돌 쌍의 수를 크게 줄일 수 있어 성능에 직접적인 이점을 준다.
5.4. 카메라 설정
5.4. 카메라 설정
유니티 2D 개발에서 카메라 설정은 게임의 시각적 표현과 성능에 직접적인 영향을 미치는 핵심 요소이다. 카메라는 플레이어의 시점을 결정하고, 씬 내의 객체들을 어떻게 렌더링할지 제어한다. 2D 프로젝트에서는 주로 Orthographic Camera를 사용하여 깊이감 없는 평면적인 화면을 구현하며, 카메라의 Size 속성을 조절해 화면에 보이는 월드 영역의 크기를 결정한다. 이는 다양한 해상도의 스크린에 대응하는 기본적인 설정이다.
카메라의 이동과 고정 방식은 게임 장르에 따라 달라진다. 플랫포머 게임에서는 주인공을 추적하는 Follow Camera를 구현하는 것이 일반적이며, 턴제 전략 게임이나 정적인 퍼즐 게임에서는 고정된 시점을 유지할 수 있다. Cinemachine 에셋을 활용하면 복잡한 카메라 워크를 비교적 쉽게 설정할 수 있어, 카메라 셰이크나 Smooth Damp 효과를 적용하는 데 유용하다.
성능 최적화 측면에서 카메라 설정도 중요하다. 카메라의 Culling Mask를 사용해 특정 레이어의 객체만 렌더링하도록 설정하면, 화면 밖의 객체나 UI 요소를 제외하여 불필요한 드로우 콜을 줄일 수 있다. 또한, Pixel Perfect Camera 컴포넌트를 사용하면 픽셀 아트 스타일의 게임에서 그래픽이 흐려지거나 일관성 없이 렌더링되는 현상을 방지하여 선명한 화면을 제공할 수 있다.
