Unity 개발 일지/Unity 공부

GameObject와 MonoBehavior

ohty20012 2025. 5. 16. 20:53

Unity에서 게임을 만들 때 가장 기본적이면서도 필수적인 요소가 GameObject와 MonoBehaviour이다.

이 두 가지는 게임 오브젝트를 정의하고, 게임 동작을 제어하는 데 핵심적인 역할을 한다.

GameObject는 Unity 씬 안에 존재하는 모든 오브젝트의 기본 단위이고, MonoBehavioru는 GameObject에 부착되어 동작을 제어하는 스크립트를 작성하는데 사용된다.

 

이 글에서는 물체와 행동의 기본 단위가 되는 GameObject와 MonoBehaviour를 한 번에 정리해보았다.

 

 


◎ GameObject

GameObject는 Unity의 씬 안에서 모든 오브젝트의 기본 단위이다. 게임 월드에 존재하는 모든 엔티티는 GameObject를 기본으로 가지며, 이 객체에 컴포넌트를 추가하여 다양한 역할을 수행하도록할 수 있다.

 

1. 기본 구조

  • 이름
  • 태그 및 레이어
  • 활성화/비활성화
  • 컴포넌트
    • 기본적으로 transform 컴포넌트를 갖고 있다(제거 불가).

 

2. 주요 메서드

1) 생성

GameObject go = new GameObject("Player");

 

2) 컴포넌트 추가

go.AddComponent<Rigidbody>();

 

3) 삭제

Destroy(go);

 

 

 


 

 

◎ MonoBehaviour

MonoBehaviour는 Unity 스크립트의 기본 클래스이다. GameObject에 스크립트를 추가할 때 기본적으로 상속된다.

 

1. 특징

1) 생명주기(Lifecycle)  (참고 https://ohty20012.tistory.com/28)

Start, Update, FixedUpdate 등 다양한 생명주기 메서드를 제공하고, 이를 통해 게임의 흐름을 제어할 수 있다.

 

2) 컴포넌트 형태

GameObject 컴포넌트로 추가할 수 있으며, MonoBehaviour를 상속하지 않으면 GameObject에 컴포넌트로 추가할 수 없다.

 

3) 인스턴스화 불가

new 키워드로 직접 생성할 수 없다. 반드시 GameObject에 추가되어야 한다.

 

4) 비동기 처리

코루틴을 지원하여 비동기 작업을 수행할 수 있다.

 

 


 

<MonoBehaviour를 사용하지 않고 클래스를 사용하는 방법>

1. 멤버 변수로 사용

using UnityEngine;

public class Player : MonoBehaviour
{
    private PlayerStats stats;

    void Start()
    {
        stats = new PlayerStats();
        stats.Health = 100;
        Debug.Log($"Player Health: {stats.Health}");
    }
}

public class PlayerStats
{
    public int Health;
}

 

PlayerStats 클래스는 MonoBehaviour를 상속받지 않아서 GameObject에 컴포넌트로 추가할 수 없지만, 클래스 내에서 인스턴스를 생성하여 사용할 수 있다.

 

2. 싱글톤

using UnityEngine;

public class GameManager
{
    private static GameManager instance;
    public static GameManager Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new GameManager();
            }
            return instance;
        }
    }

    public int score;

    // 생성자 private으로 보호
    private GameManager()
    {
        score = 0;
    }
}

 

GameManager는 MonoBehaviour 없이도 싱글톤으로 관리하여 게임 전반에 걸쳐 사용 가능하다.

(다만 씬이 전환될 경우 인스턴스 파괴)

 

 

+) MonoBehaviour를 상속받지 않는 이유?

  1. 경량화 : MonoBehaviour는 메모리를 많이 차지한다. 따라서 독립적인 데이터 구조는 단순 C# 클래스로 관리하는 것이 효율적이다.
  2. 직렬화와 성능 : 게임 오브젝트로 관리할 필요가 없는 데이터를 관리할 때 유리함.
  3. 상속 제약 : C#은 다중 상속이 불가능하다. 유연한 설계를 위해 MonoBehaviour를 상속받지 않는 클래스를 사용하는 경우도 있다.

 


 

어떤 일이든 기본을 탄탄하게 다지는 것은 매우 중요하다. 사상누각이라는 사자성어와 같이 기반을 다지지 않고 위로 쌓는 것은 작은 위험에도 흔들릴 수 있다.

Unity 개발에서도 마찬가지로, GameObject와 MonoBehaviour라는 기본 개념을 정확히 이해해야 견고하고 확장성 있는 게임을 만들 수 있다.

 

 

 

< 참고 > 유니티 공식 문서

GameObject  https://docs.unity3d.com/kr/2023.2/Manual/class-GameObject.html

 

게임 오브젝트 - Unity 매뉴얼

Unity의 게임 오브젝트 클래스는 씬에 존재할 수 있는 모든 것을 나타냅니다.

docs.unity3d.com

 

MonoBehaviour  https://docs.unity3d.com/kr/2023.2/Manual/class-MonoBehaviour.html

 

MonoBehaviour - Unity 매뉴얼

MonoBehaviour 클래스는 기본적으로 모든 Unity 스크립트가 파생되는 기본 클래스입니다. Unity의 프로젝트 창에서 C# 스크립트를 생성하면 MonoBehaviour에서 자동으로 상속되며, 템플릿 스크립트를 제공

docs.unity3d.com