XR 기술을 활용한 게임 개발자 부트 캠프/TIL

유니티 입문 (2)

담금질 2025. 10. 14. 12:41

1. 게임 오브젝트(Game Object)란?

게임 오브젝트는 유니티 씬(Scene)에 존재하는 모든 것의 기본 틀이자 컨테이너입니다. 캐릭터, 아이템, 카메라, 광원, 특수 효과 등 게임 세계를 구성하는 눈에 보이는 것이든 보이지 않는 것이든 모두 게임 오브젝트로 시작합니다.

  • 본질: 텅 빈 상자 또는 껍데기와 같습니다.
  • 특징: 게임 오브젝트 자체는 어떤 특별한 기능이나 모양을 가지고 있지 않습니다.
  • 역할: 게임 오브젝트는 기능을 담는 역할만 하며, 이 기능은 바로 컴포넌트를 통해 부여됩니다.

2. 컴포넌트(Component)란?

컴포넌트는 게임 오브젝트에 기능과 속성을 부여하는 모듈(부품)입니다. 컴포넌트는 레고 블록처럼 각각 특정한 기능을 담당하며, 이 컴포넌트들을 조합하여 게임 오브젝트의 동작과 모습을 설계합니다. 유니티가 컴포넌트 기반(Component-based) 엔진이라고 불리는 이유이기도 합니다.

  • 본질: 게임 오브젝트의 기능을 구현하는 조각 부품입니다.
  • 특징: 모든 게임 오브젝트는 하나 이상의 컴포넌트로 구성됩니다.
  • 대표적인 예시:
    • Transform: 모든 게임 오브젝트에 필수적으로 붙어 있으며, 오브젝트의 위치(Position), 회전(Rotation), 크기(Scale) 정보를 관리합니다.
    • Mesh Renderer: 오브젝트의 시각적인 모습(렌더링)을 담당하여 화면에 보이게 합니다.
    • Rigidbody: 오브젝트가 중력이나 힘의 영향을 받는 등 물리적인 동작을 하도록 만듭니다.
    • Collider: 오브젝트의 충돌 영역을 정의하여 다른 오브젝트와의 상호작용(충돌)을 감지합니다.
    • 스크립트(Script): 개발자가 직접 작성하여 원하는 복잡한 동작(로직)을 구현하는 컴포넌트입니다.

3. 게임 오브젝트와 컴포넌트의 관계

게임 오브젝트 빈 상자 또는 뼈대 기능을 담는 그릇 역할만 합니다.
컴포넌트 레고 블록 또는 요리 재료 상자에 조립되어 실제 기능을 부여하는 부품입니다.

 

예를 들어, "날아다니는 몬스터"를 만들고 싶다면:

  1. 게임 오브젝트를 만듭니다. (빈 상자)
  2. 이 오브젝트에 다음 컴포넌트들을 추가합니다.
    • Transform: 위치를 설정합니다.
    • Mesh Renderer: 몬스터의 3D 모델을 보여줍니다.
    • Rigidbody: 물리적 영향을 받도록 설정합니다.
    • Collider: 충돌 범위를 설정합니다.
    • 스크립트(A.I.): 스스로 움직이고 플레이어를 공격하는 로직을 구현합니다.

결론적으로, 게임 오브젝트는 컴포넌트들의 집합체이며, 컴포넌트를 조합함으로써 무한한 종류의 오브젝트와 기능을 만들 수 있습니다.


5. 유니티의 최상위 클래스: UnityEngine.Object

유니티에서 Object (클래스 이름은 UnityEngine.Object)는 유니티 엔진이 관리하고 에디터의 인스펙터(Inspector) 창에서 참조하고 편집할 수 있는 모든 것의 기본 클래스입니다.

💡 UnityEngine.Object의 역할 및 특징

  • 유니티 자원(Asset)의 기반: GameObject를 포함하여 Component, Material, Texture, Mesh, ScriptableObject 등 프로젝트 에셋이나 씬 내부에 존재하는 대부분의 유니티 내장 클래스가 이 Object를 상속받습니다.
  • 에디터 기능 지원: Object를 상속받는 클래스의 인스턴스(객체)들은 스크립트 변수 필드에 드래그 & 드롭으로 연결하거나 오브젝트 피커(Object Picker)를 통해 선택할 수 있는 기능을 자동으로 지원합니다.
  • 유니티 메모리 관리: 유니티 엔진의 특별한 메모리 관리 방식(C++ 객체를 C# 스크립트가 참조하는 방식 등)이 이 Object 클래스를 통해 이루어집니다.

6. GameObject와 Object의 관계 (포함 관계)

Object (최상위) UnityEngine.Object 유니티 에디터/엔진이 관리하는 모든 리소스와 객체의 가장 근본이 되는 기본 클래스.
Game Object (특정 역할) UnityEngine.GameObject 씬 내에서 위치, 회전, 크기를 가지며, Component들을 담는 컨테이너 역할을 하는 특정 유형의 오브젝트.

 

결론적으로, 모든 GameObject는 Object이지만, 모든 Object가 GameObject인 것은 아닙니다.

💡 GameObject가 아닌 Object의 주요 종류

GameObject가 아닌, UnityEngine.Object를 상속받는 클래스들은 게임의 로직이나 시각적 요소를 정의하는 데 사용됩니다.

오브젝트 종류 클래스명 용도

컴포넌트 Component (및 그 파생 클래스) Transform, Rigidbody, Collider 등 GameObject에 기능을 부여하는 모듈.
스크립터블 오브젝트 ScriptableObject 대규모 데이터 관리, 설정, 에셋 제작 등 씬에 존재하지 않는 데이터 컨테이너로 사용.
머터리얼 Material 오브젝트의 색상, 질감, 셰이더를 정의하여 시각적인 모습을 결정.
텍스처 Texture 이미지 데이터를 나타내는 오브젝트.
메시 Mesh 3D 모델의 정점(Vertex)과 면(Face) 구조를 정의.

 

7. C# 프로그래밍의 일반적인 Object와 유니티 Object

프로그래밍(특히 C#)을 배울 때 말하는 객체(Object) 개념과 유니티의 UnityEngine.Object는 또 다릅니다.

  • C#의 object (소문자): C# 언어에서 모든 데이터 타입의 최상위 클래스입니다. (System.Object). 모든 C# 클래스는 암묵적으로 이를 상속합니다.
  • 유니티의 Object (대문자): 유니티 엔진에 특화된 기능(씬 관리, 에디터 참조, 메모리 관리)을 제공하기 위해 C#의 object를 상속받아 확장한 클래스입니다.

따라서 유니티에서 스크립트를 작성할 때 Object라는 단어를 사용하면 대부분 UnityEngine.Object를 의미하며, 이는 GameObject는 물론 다른 모든 유니티 자원과 기능들의 공통 조상이라고 이해하는 것이 가장 정확합니다.

 

8. 프리팹

유니티 핵심 개념: 프리팹(Prefab) 정리 📦

유니티 게임 개발에서 프리팹(Prefab)은 워크플로우를 효율적으로 만들어주는 가장 중요한 기능 중 하나입니다. 프리팹은 복잡한 게임 오브젝트를 템플릿으로 저장하여 재사용할 수 있게 해주는 특별한 에셋입니다.


1. 프리팹(Prefab)이란 무엇인가요?

프리팹게임 오브젝트를 통째로 프로젝트 파일로 저장해놓은 템플릿입니다. 단순히 게임 오브젝트의 복사본이 아니라, 원본 게임 오브젝트와 그에 부착된 모든 컴포넌트(Component)와 속성(Properties)을 포함하는 완전한 형태의 재사용 가능한 "설계도"입니다.

  • 원본과의 연결: 프리팹을 사용해 생성한 오브젝트(인스턴스)는 원본 프리팹과 연결됩니다. 이 때문에 원본 프리팹을 수정하면, 이 프리팹으로부터 만들어진 모든 인스턴스에 수정 사항이 자동으로 적용됩니다.

2. 왜 프리팹을 사용해야 하나요?

프리팹은 게임 개발의 비효율성을 해결해줍니다. 예를 들어, 게임에 등장하는 몬스터 100마리를 만든다고 가정해 봅시다.

 

프리팹을 사용하지 않는다면... 몬스터 100마리 각각에 대해 텍스처, 스크립트, 콜라이더 등 모든 컴포넌트를 수동으로 설정해야 합니다. 만약 몬스터의 공격력을 수정해야 한다면, 100마리 모두를 일일이 찾아가서 수정해야 하는 비효율적인 작업이 발생합니다.

 

프리팹을 사용한다면... 몬스터의 원본 게임 오브젝트를 프리팹으로 만듭니다. 이후 씬에 몬스터 100마리가 필요하면, 이 프리팹을 복제하여 배치하기만 하면 됩니다. 몬스터의 공격력을 수정해야 할 때, 원본 프리팹 하나만 수정하면 씬에 배치된 100마리 몬스터 전체에 변경사항이 즉시 반영됩니다.


3. 프리팹 사용 방법

프리팹을 만드는 방법은 매우 간단합니다.

  1. 게임 오브젝트 준비: Hierarchy(계층) 창에서 프리팹으로 만들고자 하는 게임 오브젝트를 준비합니다.
  2. 프로젝트 창으로 드래그: 준비된 게임 오브젝트를 Hierarchy(계층) 창에서 Project(프로젝트) 창으로 드래그 앤 드롭합니다.
  3. 프리팹 생성 완료: Hierarchy 창의 오브젝트 아이콘이 파란색 상자로 바뀌고, Project 창에 새로운 프리팹 에셋이 생성됩니다. 이 에셋이 바로 템플릿 역할을 하는 프리팹입니다.

이후, 씬에 해당 오브젝트가 필요할 때마다 Project 창에 있는 프리팹을 Hierarchy나 Scene 뷰로 드래그하여 사용하면 됩니다.


4. 프리팹의 주요 이점

  • 재사용성: 동일한 오브젝트를 여러 씬에서, 또는 한 씬에서 여러 번 반복해서 쉽게 사용할 수 있습니다.
  • 생산성 향상: 원본 템플릿 하나만 수정하면 모든 인스턴스에 변경사항이 적용되므로, 대규모 수정 작업이 효율적으로 이루어집니다.
  • 일관성 유지: 모든 인스턴스가 동일한 속성을 공유하므로 게임 내 오브젝트의 일관성을 쉽게 유지할 수 있습니다.
  • 런타임 생성: 게임 플레이 도중에도 스크립트를 통해 프리팹을 동적으로 생성(Instantiate)하거나 삭제할 수 있어, 총알, 폭발 효과 등 순간적으로 생성되는 오브젝트를 관리하기에 용이합니다.

간단히 말해, 프리팹은 오브젝트를 "제품화"하여 복제와 관리를 쉽게 해주는 유니티의 강력한 기능이라고 할 수 있습니다.