콘텐츠 제작: 씬·프리팹·UI·입력·카메라

유니티 콘텐츠 제작: 씬 · 프리팹 · UI · 입력 · 카메라 시스템의 통합 이해

목표: 본 장에서는 유니티의 실제 게임 제작 단계에서 다루는 다섯 가지 핵심 축인 씬(Scene), 프리팹(Prefab), UI 시스템, 입력(Input), 카메라(Camera)를 중심으로, 개발자가 플레이 가능한 콘텐츠를 구성하는 전 과정을 이해하도록 안내합니다.

1. 씬(Scene): 게임의 무대와 논리 단위

유니티의 씬(Scene)은 하나의 “무대(Stage)”이자, 게임 오브젝트와 환경의 컨테이너입니다. 프로젝트의 구조적 단위로서, 씬을 어떻게 구성하느냐가 유지보수성과 로딩 효율을 좌우합니다.

1.1 씬 구성 전략

  • Core Scene — 항상 유지되는 시스템(Managers, UI Root, Camera).
  • Gameplay Scene — 스테이지, 맵, 이벤트 로직 등.
  • Additive Scene — 특정 구역/레벨을 동적 로드하기 위한 보조 씬.

1.2 씬 로딩 방식

using UnityEngine.SceneManagement;

public class SceneLoader : MonoBehaviour {
public void LoadLevel(string sceneName) {
SceneManager.LoadScene(sceneName);
}
public void LoadAdditive(string sceneName) {
    SceneManager.LoadScene(sceneName, LoadSceneMode.Additive);
}
}

Additive 모드는 큰 맵을 여러 구역으로 나누어 로딩할 때 자주 사용됩니다.

💡 팁: 씬 전환 시 Fade-in/out 효과를 추가하면 시각적으로 매끄러운 UX를 제공합니다. 이는 Canvas GroupCoroutine을 결합해 쉽게 구현할 수 있습니다.

2. 프리팹(Prefab): 재사용 가능한 오브젝트의 원형

유니티 개발에서 프리팹은 반복적으로 생성되는 오브젝트의 설계도입니다. 모든 캐릭터, 총알, UI 요소는 프리팹을 기반으로 구성되어야 효율적입니다.

2.1 프리팹의 장점

  • 변경 시 모든 인스턴스 자동 업데이트.
  • 씬 파일의 용량과 복잡도를 줄임.
  • 런타임 생성 및 삭제가 용이.

2.2 프리팹 생성 및 인스턴스화

public class EnemySpawner : MonoBehaviour { public GameObject enemyPrefab; public Transform spawnPoint;
void Start() {
    Instantiate(enemyPrefab, spawnPoint.position, Quaternion.identity);
}
}

Instantiate() 함수는 프리팹을 실시간으로 복제하는 핵심 함수입니다. 파괴 시에는 Destroy()를 사용합니다.

2.3 Prefab Variant

공통된 구조를 유지하면서 일부 속성만 다른 오브젝트를 만들고 싶을 때, Prefab Variant 기능을 활용합니다. 예를 들어, 적 캐릭터의 공통 AI는 유지하면서 색상이나 속도만 다르게 설정할 수 있습니다.

3. UI 시스템: UGUI와 캔버스 계층 구조

유니티의 UI는 Canvas를 중심으로 구성되며, 이는 렌더링과 입력 이벤트의 기준이 됩니다. UI의 구조를 잘 설계하면 성능과 유지보수성이 크게 향상됩니다.

3.1 Canvas의 종류

  • Screen Space - Overlay : 화면 전체에 직접 렌더링.
  • Screen Space - Camera : 특정 카메라를 통해 렌더링 (3D UI 연출 가능).
  • World Space : 실제 3D 공간 내 UI 오브젝트로 배치.

3.2 기본 UI 구성 예시

public class UIManager : MonoBehaviour { [SerializeField] GameObject pausePanel;
public void TogglePause() {
    bool isActive = pausePanel.activeSelf;
    pausePanel.SetActive(!isActive);
}
}

Button 컴포넌트의 OnClick() 이벤트를 통해 TogglePause() 함수를 연결하면, 비코드 형태로도 동작 제어가 가능합니다.

3.3 TextMeshPro 사용

기존 Text 대신 TextMeshPro를 사용하면 고해상도 렌더링과 정교한 폰트 제어가 가능합니다. 모든 UI 프로젝트에서 TMP는 표준으로 간주됩니다.

⚙️ 팁: UI 캔버스의 갱신 비용을 줄이려면 Canvas를 여러 개로 분리하고, 자주 갱신되는 요소(예: 체력 바)는 별도 Canvas로 관리하세요.

4. 입력 시스템(Input System)

유니티 2020 이후 버전에서는 신규 Input System 패키지가 표준으로 자리 잡았습니다. 이는 디바이스 독립적 입력 처리를 가능하게 하며, 액션 기반의 구조로 설계되어 있습니다.

4.1 기본 설정

  1. 패키지 매니저에서 Input System 설치.
  2. 플레이어 설정에서 Active Input Handling → Both로 설정.
  3. Input Actions 자산 생성 → Action Maps 정의 (예: Move, Jump).

4.2 코드 예시

using UnityEngine; using UnityEngine.InputSystem;

public class PlayerInputController : MonoBehaviour {
private Vector2 moveInput;
public void OnMove(InputAction.CallbackContext context) {
    moveInput = context.ReadValue();
}

void Update() {
    transform.Translate(moveInput * Time.deltaTime * 5f);
}
}

이 코드는 키보드뿐 아니라 게임패드, 터치 입력까지 자동으로 지원합니다. 즉, 입력 로직을 플랫폼 독립적으로 유지할 수 있습니다.

5. 카메라 시스템: 연출과 시점의 중심

카메라는 단순히 장면을 비추는 장치가 아닙니다. 연출, 몰입감, 정보 전달의 핵심 도구입니다. 유니티는 Cinemachine이라는 고급 카메라 시스템을 통해 복잡한 연출도 코드 없이 구현할 수 있습니다.

5.1 기본 카메라 제어

public class CameraFollow : MonoBehaviour { public Transform target; public float smoothSpeed = 5f; public Vector3 offset;
void LateUpdate() {
    transform.position = Vector3.Lerp(transform.position, target.position + offset, smoothSpeed * Time.deltaTime);
}
}

LateUpdate()를 사용하면 플레이어 이동 후 카메라를 부드럽게 따라가게 할 수 있습니다.

5.2 Cinemachine의 장점

  • 가상 카메라(Virtual Camera) 기반의 시점 관리.
  • 대상 추적, 흔들림(Noise), 경계(Bounding Box) 설정 가능.
  • 컷신이나 카메라 전환을 Timeline과 연동하여 시각적으로 연출 가능.
💡 실무 팁: 카메라 전환 시에는 시점의 “연속성”을 고려해야 합니다. 시점이 바뀌어도 공간 방향 감각이 유지되도록 “시선 축(Line of Action)”을 기준으로 설계하세요.

정리: 콘텐츠 제작은 ‘구조적 조립’이다

씬은 무대를, 프리팹은 배우를, UI는 관객 인터페이스를, 입력은 제스처를, 카메라는 시선을 담당합니다. 이 다섯 요소가 유기적으로 결합될 때, 게임은 단순한 코드의 집합이 아니라 살아 있는 경험으로 완성됩니다.

유니티 콘텐츠 제작의 본질은 ‘각 시스템을 따로 배우는 것’이 아니라, 그것들을 하나의 경험으로 엮는 사고입니다.

다음 학습 추천:

Comments