"스크립터블 오브젝트(ScriptalbeObject)"
개발을 하다보면 데이터를 코드와 분리해서 관리하고 싶거나
인스펙터에서 값만 바꿔서 바로 테스트하고 싶은 경우가 자주 생긴다.
이럴 때 Unity에서 아주 많이 쓰는 것이 바로 '스크립터블 오브젝트(ScriptableObject)'다.
오늘은 ScriptableObject가 뭔지 알아보고, 어떻게 쓰면 좋은지 간단히 알아볼 예정이다
1) 스크립터블 오브젝트(ScriptalbeObject)란?
ScriptableObject는 씬의 오브젝트(인스턴스)에 붙는 컴포넌트가 아니라,
프로젝트에 에셋(Asset) 형태로 저장되는 데이터 컨테이너이다.
2) MonoBehaviour와 ScriptableObject 의 차이는?
[Scene] [Project(Assets)]
GameObject(Player) ItemData.asset
└─ PlayerController(MB) -----> (ScriptableObject)
(씬에 존재, 복제/삭제됨) (에셋으로 저장, 여러 곳에서 공유)
MonoBehaviour: 씬에 존재하는 오브젝트에 붙어서 동작(로직)중심
ScriptableObject: 프로젝트 에셋로 존재하면서 데이터 중심
3) ScriptableObject를 쓰는 이유 3가지
(1) 데이터와 로직 분리
밸런스 값이 코드에 박혀 있으면 수정할 때마다 빌드/커밋/리뷰가 번거롭다.
SO로 분리해서 사용하면 인스펙터에서 데이터만 수정하고 테스트하기 쉬워진다.
(2) 메모리/관리 비용 감소
여러 Prefab이 같은 데이터를 들고 있으면 값이 중복된다.
SO는 하나의 에셋을 여러 객체가 참조하게 해서 중복을 줄이는 방향으로 설계할 수 있다.
(3) 런타임에서 쉽게 참조
MonoBehaviour 필드에 ScriptableObject를 참조로 걸어두면 Unity가 자동으로 로드해 사용할 수 있다.
4) ScriptableObject를 만드는 방법
a) ScriptableObject 클래스 작성
using UnityEngine;
[CreateAssetMenu(fileName = "ItemData", menuName = "SoEx/Item Data")]
public class ItemData : ScriptableObject
{
public string itemName;
public int price;
public Sprite icon;
}
ItemData.cs
b) 에셋 생성

Project 창 우클릭 → Create → SoEx → Item Data
c) 에셋 생성 결과

생성된 ItemData.asset
5) 사용시 주의할 점
1) 런타임에서 값 바꾸는 SO는 주의
에디터에서는 ScriptableObject 에셋이 Edit/Play 모드에서 저장될 수 있고,
인스펙터로 바꾼 값은 디스크에 기록되어 다음 세션에도 유지될 수 있다.
그래서 런타임 상태(HP, 현재 점수 등)를 SO에 그대로 저장하면
테스트하다가 값이 남아서 디버깅이 꼬일 수 있다.
따라서
정적 데이터(설정/정의)는 SO로,
런타임 상태는 별도 클래스/컴포넌트로 관리하거나
SO를 Instantiate로 복제해서 런타임 전용으로 쓰자.
2) 스크립트로 SO 값을 바꿔서 에셋에 저장하려면 추가 처리 필요
Unity는 인스펙터/에디터 도구로 변경한 SO는 저장하지만,
스크립트로 Edit 모드에서 바꾼 값은 자동 저장되지 않을 수 있어 EditorUtility.SetDirty가 필요할 수 있다.
6) 오늘의 한 줄 요약
『 ScriptableObject는 프로젝트에 에셋으로 저장되는 데이터 컨테이너로,
여러 오브젝트가 같은 설정값을 공유하게 해준다. 』
'1일 1 cs' 카테고리의 다른 글
| 25. 짐벌락(Gimbal Lock) 이란? (0) | 2026.02.14 |
|---|---|
| 24. 스프라이트 아틀라스(Sprite Atlas)란? (0) | 2026.02.13 |
| 22. 박싱(Boxing)과 언박싱(Unboxing)이란? (0) | 2026.02.08 |
| 21. namespace와 partial 이란? (0) | 2026.02.07 |
| 20. 시네머신(Cinemachine)이란? (3) | 2026.02.06 |