
스크립터블 오브젝트(Scriptable Object)
유니티의 스크립터블 오브젝트(Scriptable Object)는 게임 데이터를 효율적으로 관리하기 위한 강력한 도구입니다. 게임 개발에서 아이템 정보, 캐릭터 스탯, 레벨 설정 등 다양한 데이터를 체계적으로 관리하는 방식은 프로젝트의 유지보수성과 생산성에 큰 영향을 미칩니다. 특히, 스크립터블 오브젝트를 활용하면 데이터를 독립적으로 관리하고 재사용성을 높여, 복잡한 게임 구조에서도 높은 효율성을 유지할 수 있습니다. 이번 글에서는 Scriptable Object의 기본 개념부터 실무에서의 활용 방법까지 살펴보고, 이를 통해 게임 데이터 관리의 효율성을 극대화하는 방법을 소개하겠습니다.
Scriptable Object란 무엇인가?
Scriptable Object는 유니티에서 데이터를 관리하기 위해 제공하는 특수한 클래스입니다. 일반적으로 게임 오브젝트에 붙는 MonoBehaviour와 달리, Scriptable Object는 독립적으로 존재하며, 데이터를 에셋 파일 형태로 저장할 수 있습니다. 이를 통해 데이터와 로직을 분리하고, 효율적으로 재사용할 수 있습니다.
Scriptable Object의 주요 특징
- 독립적 데이터 관리: MonoBehaviour처럼 게임 오브젝트에 붙지 않고, 독립적인 데이터 컨테이너로 사용됩니다.
- 데이터의 재사용성: 여러 씬과 오브젝트에서 동일한 데이터를 참조하여 관리할 수 있습니다.
- 메모리 효율성: 하나의 인스턴스만 메모리에 로드되므로 메모리 낭비를 방지합니다.
- 팀 협업 지원: 비개발자도 Unity Editor의 Inspector에서 데이터를 쉽게 수정할 수 있습니다.
Scriptable Object 만들기
1. Scriptable Object 클래스 정의
Scriptable Object를 사용하려면 ScriptableObject를 상속받는 클래스를 작성해야 합니다. 다음은 아이템 데이터를 관리하기 위한 간단한 예제입니다.
using UnityEngine;
[CreateAssetMenu(fileName = "NewItem", menuName = "Inventory/Item")]
public class ItemData : ScriptableObject
{
public string itemName;
public int itemID;
public Sprite itemIcon;
}
- [CreateAssetMenu]: Unity Editor에서 에셋을 쉽게 생성할 수 있도록 메뉴 옵션을 추가합니다.
- ItemData 클래스는 아이템의 이름, ID, 아이콘을 저장하는 역할을 합니다.
2. Unity Editor에서 에셋 생성
- 프로젝트 창에서 우클릭 > Create > Inventory > Item을 선택합니다.
- 생성된 .asset 파일을 선택한 후, Inspector에서 데이터를 입력합니다.


Scriptable Object의 활용 방법
1. 아이템 데이터 관리
게임 내 여러 아이템의 정보를 Scriptable Object로 관리할 수 있습니다. 아래 코드는 Scriptable Object를 참조하여 아이템 정보를 화면에 표시하는 예제입니다.
using UnityEngine;
using TMPro;
public class ItemDisplay : MonoBehaviour
{
public ItemData itemData;
public TextMeshProUGUI itemNameText;
void Start()
{
itemNameText.text = itemData.itemName;
}
}
2. 씬 간 데이터 공유
씬 전환 시 데이터를 유지하는 것은 어려운 일일 수 있습니다. Scriptable Object는 데이터를 에셋 파일로 저장하기 때문에, 씬 간 데이터 공유가 매우 간편합니다.
3. 이벤트 시스템
Scriptable Object를 이벤트 관리 도구로 활용하면, 오브젝트 간 의존성을 줄이고 이벤트를 중앙에서 관리할 수 있습니다. 이는 특히 복잡한 게임 로직에서 매우 유용합니다.
Scriptable Object 사용 시 주의할 점
- 런타임 데이터 수정
- Scriptable Object의 데이터는 런타임에서 수정할 수 있지만, 이는 에디터 세션 동안에만 유지됩니다. 빌드된 게임에서는 이러한 변경 사항이 저장되지 않으므로, 런타임 데이터 저장이 필요한 경우에는 별도의 저장 시스템을 구현해야 합니다. 예를 들어, JSON 파일이나 데이터베이스를 사용하여 데이터를 저장하고 불러오는 방식을 결합할 수 있습니다.
- 변경 전파
- Scriptable Object는 참조된 모든 곳에 동일한 데이터를 제공하므로, 하나의 데이터를 변경하면 이를 참조하는 모든 오브젝트에 영향을 미칩니다. 의도하지 않은 변경이 발생하지 않도록 주의해야 합니다.
- 직렬화 제한
- Scriptable Object는 Unity의 직렬화 시스템을 통해 데이터를 저장합니다. 하지만, 복잡한 데이터 구조나 순환 참조가 있는 경우 직렬화 과정에서 문제가 발생할 수 있습니다. 따라서, 직렬화 가능한 데이터로 설계하거나, 필요한 경우 System.Serializable이나 맞춤형 직렬화 로직을 활용해야 합니다.
Scriptable Object를 활용한 데이터 관리의 장점
- 코드와 데이터 분리
- 데이터와 로직을 분리하여 코드 가독성과 유지보수성을 향상시킵니다.
- 효율적인 데이터 공유
- 여러 씬이나 오브젝트에서 동일한 데이터를 참조할 수 있습니다.
- 생산성 향상
- Unity Editor를 통해 데이터를 쉽게 수정할 수 있어, 반복 작업이 줄어듭니다.
- 메모리 관리 효율성 향상
- Scriptable Object는 동일한 데이터를 여러 오브젝트가 참조할 수 있으므로, 불필요한 메모리 중복 사용을 방지합니다. 예를 들어, 같은 아이템 데이터나 적 스탯을 여러 개의 오브젝트에서 참조하더라도 메모리 공간은 한 번만 차지합니다. 이는 대규모 데이터셋을 사용하는 게임에서 특히 유용합니다.
결론
Scriptable Object는 유니티에서 게임 데이터를 체계적으로 관리하고 복잡한 로직을 단순화하는 데 매우 유용한 도구입니다. 특히, 대규모 프로젝트를 진행하거나 팀 단위로 협업하는 환경에서는 Scriptable Object를 통해 데이터 중심 설계를 쉽게 적용할 수 있습니다. 이번 글에서 소개한 내용과 예제를 바탕으로 직접 프로젝트에 Scriptable Object를 활용해 보세요. 이를 통해 데이터 관리가 더 효율적이고 체계적으로 개선되는 경험을 하실 수 있을 겁니다. 프로젝트 진행 중 궁금한 점이 생기거나 도움이 필요하다면 언제든 문의해 주세요!
Github Project URL

GitHub - ralskwo/UnityScriptableObject
'Unity' 카테고리의 다른 글
| [Unity] Unity Remote: 빌드 없이 모바일 환경 테스트 시작하기 (2) | 2025.06.08 |
|---|---|
| [Unity] Android GPS 구현: 사용자 위치 데이터 가져오기와 권한 요청 방법 (0) | 2025.06.08 |
| [Unity] 네이버 지도 Dynamic Map API로 마커와 정보 창 구현하기 (3) | 2025.06.08 |
| [Unity] 중력 시스템 기초와 응용: 맞바람과 블랙홀 물리 효과 구현 (0) | 2025.06.08 |
| [Unity] NavMesh를 활용한 AI 캐릭터 경로 탐색 구현 가이드 (3) | 2025.06.08 |