"깊이"가 다른 게임개발자 허민영

유저에서 게임까지, 철학에서 코딩까지, 본질을 보는 게임개발

소프트웨어 공학/코딩

유니티] ScriptableObject 알아보기

허민영 2025. 3. 6. 19:14

1. ScriptableObject란?

ScriptableObject는 Unity에서 제공하는 데이터 컨테이너 클래스이다. MonoBehaviour와 달리 GameObject에 부착할 필요 없이 독립적으로 존재하며, 프로젝트 에셋으로 저장될 수 있다. 이를 통해 런타임 메모리 할당을 줄이고, 데이터 중심의 구조를 효율적으로 설계할 수 있다.

2. ScriptableObject의 특징

  • 데이터 저장: 게임 데이터를 프로젝트 에셋으로 저장할 수 있다.
  • 메모리 효율성: MonoBehaviour와 달리 런타임에서 불필요한 객체 생성 없이 활용 가능하다.
  • 직렬화 가능: Unity의 직렬화 시스템과 연계되어 Inspector에서 편집 가능하다.
  • 객체 공유: 여러 게임 오브젝트에서 동일한 ScriptableObject 인스턴스를 공유하여 관리할 수 있다.

3. ScriptableObject의 활용 사례

  1. 게임 설정 데이터 관리
    • 볼륨 설정, 게임 속도, UI 테마 등 변경 가능한 설정 데이터를 관리할 수 있다.
  2. 아이템 및 캐릭터 속성 관리
    • 무기, 방어구, 캐릭터 능력치 등의 데이터 저장에 유용하다.
  3. 이벤트 시스템
    • 게임 내 이벤트를 중앙에서 관리하는 용도로 사용할 수 있다.
  4. 오브젝트 풀링 시스템
    • 미리 생성된 오브젝트 풀을 저장하여 효율적인 리소스 관리를 할 수 있다.

4. ScriptableObject 생성 방법

  1. ScriptableObject 클래스를 정의
using UnityEngine;

[CreateAssetMenu(fileName = "NewItem", menuName = "Game/Item")]
public class ItemData : ScriptableObject
{
    public string itemName;
    public int damage;
    public Sprite icon;
}

2. ScriptableObject 인스턴스 생성

 

  • Unity Editor에서 Assets 폴더에서 Create > Game > Item을 선택하여 새로운 ScriptableObject를 생성할 수 있다.

3. 게임 오브젝트에서 활용

  • MonoBehaviour 클래스에서 ScriptableObject를 참조하고 사용한다.
public class Item : MonoBehaviour
{
    public ItemData itemData;

    void Start()
    {
        Debug.Log("아이템 이름: " + itemData.itemName);
    }
}

 

5. ScriptableObject의 장점

  • 객체의 재사용성 증가: 여러 오브젝트에서 동일한 데이터를 공유할 수 있다.
  • 런타임 성능 최적화: 불필요한 객체 생성을 줄여 성능을 향상할 수 있다.
  • 데이터 변경 용이: Inspector에서 쉽게 변경 가능하며, 코드 수정 없이 데이터 변경이 가능하다.

6. ScriptableObject의 단점

  • 상태 유지 불가: 런타임에서 변경된 값이 저장되지 않으며, 게임이 종료되면 초기화된다.
  • 초기 학습 난이도: MonoBehaviour에 익숙한 개발자에게는 다소 생소할 수 있다.
  • 객체 간 참조 문제: 객체 간의 관계를 유지하는 방식에 따라 의도하지 않은 참조 공유 문제가 발생할 수 있다.

7. ScriptableObject를 Singleton으로 활용

Singleton 패턴을 적용하면 특정 데이터나 설정을 전역적으로 관리할 수 있다.

using UnityEngine;

public class GameSettings : ScriptableObject
{
    private static GameSettings instance;

    public static GameSettings Instance
    {
        get
        {
            if (!instance)
            {
                instance = Resources.Load<GameSettings>("GameSettings");
            }
            return instance;
        }
    }

    public float volume;
}

이 방법을 사용하면 어디서든 GameSettings.Instance.volume을 호출하여 설정 데이터를 가져올 수 있다.

8. 결론

ScriptableObject는 Unity 개발에서 데이터 중심 설계를 가능하게 하며, 메모리 사용을 최적화하는 중요한 도구이다. 적절하게 활용하면 게임 데이터의 유지보수성과 재사용성을 높일 수 있다. 다만, 객체 간 참조 관리와 런타임 변경 사항 유지에 대한 주의가 필요하다.