스크립터블 오브젝트란?
- 스크립터블 오브젝트는 데이터를 저장하고 공유하기 위한 데이터 컨테이너입니다. Unity에서 제공하는 ScriptableObject 클래스를 상속받아 만들며, 프로젝트 내에서 애셋으로 저장됩니다.
사용방법
[CreateAssetMenu(fileName = "Data", menuName = "ScriptableObjects/Example")]
public class ExampleScriptableObject : ScriptableObject
{
// 데이터 필드들
}
[CreateAssetMenu(
fileName = "NewData", // 생성될 파일의 기본 이름
menuName = "MyGame/NewScriptableObject", // Project 창의 Create 메뉴에서 보일 경로
order = 0 // 메뉴에서의 정렬 순서
)]
// 런타임에서 생성
PlayerStats newStats = ScriptableObject.CreateInstance<PlayerStats>();
newStats.playerName = "New Player";
newStats.level = 1;
활용사례
// 아이템 데이터 정의
[CreateAssetMenu(fileName = "ItemData", menuName = "Inventory/ItemData")]
public class ItemData : ScriptableObject
{
public string itemName;
public Sprite itemIcon;
public int maxStackSize;
public bool isConsumable;
// 읽기 전용 데이터
[SerializeField] private int basePrice;
public int Price => basePrice; // 외부에서는 읽기만 가능
// 런타임 중 변경되면 안 되는 데이터는
// 인스펙터에서만 수정 가능하도록 SerializeField 사용
[SerializeField] private string itemDescription;
public string Description => itemDescription;
}
// 아이템 매니저에서 사용
public class ItemManager : MonoBehaviour
{
[SerializeField] private ItemData[] availableItems;
public ItemData GetItemById(int index)
{
return index < availableItems.Length ? availableItems[index] : null;
}
}
질문
Q. 위 예제에서 basePrice와 itemDescription을 private으로 선언하고 public 프로퍼티로 제공하는 이유는 무엇인가요?
A. 런타임 도중에 어드레서블의 값을 변경하지 않기 위함 입니다.
Q. availableItems를 배열로 선언한 이유는 무엇일까요?
A. 하나의 아이템만 있는것이 아닌 아이템이 여러개가 있기 때문입니다.
Q. ScriptableObject를 사용하여 아이템 데이터를 관리할 때의 장점은 무엇인가요?
A. 데이터 수정이 용이함 (인스펙터에서 직접 수정 가능)
A. 프리팹이나 다른 씬에서 재사용 가능
A. 메모리 효율성 (같은 데이터를 여러 번 복제하지 않음)
A. 버전 관리가 용이함 (데이터만 별도로 관리 가능)
Q. GetItemById 메서드에서 null을 반환할 수 있는 이유는 무엇인가요?
A. index값이 넘었기 때문입니다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
특징 및 장점, 차이점
1. 모듈성
- 데이터와 로직 분리
2. 관심사 분리
- 게임플레이에서 데이터를 동작 로직에서 분리
- 각 독립적인 부분 테스트 및 유지 관리 수월
- 변경 시 오류가 덜 발생할 가능성이 있음
3. Asset 저장
- 게임 외부에서 유지
- 런타임 중에 값을 변경하면 게임을 종료하더라도 유지됨
4. 장점
- 메모리 공간 절약
- 여러 씬에서 동일한 데이터 사용 가능
- 협업 시 로직을 건드리는 것이 아니기 때문에 문제 발생 가능성이 적어 효율적임
- 메모리 사용량 개선
5. 모노, 스크립터블 오브젝트 차이점
- 모노는 Awake, onEnable, Reset, Start, Update 등등 함수들이 많음
- 스크립터블 오브젝트는 데이터 컨테이너로 인스펙터나 다른 불러오는 방식을 이용해야만 사용 가능
- 단순히 생성만 하는데도 구성자체에 차이를 보여줌

결론
- 모노를 데이터 컨테이너 역할로 쓰기엔 쓸대없는 것들까지 같이 붙어 있고 스크립터블의 경우엔 간단한 구성으로 되어 있기 때문에 추후에 적을땐 문제가 없지만 점점 많은 데이터가 생성되면 될수록 차이가 나게 될 것임
즉, 역할의 차이가 확실함
유용한 팁

- json이나 xml은 유니티 외부에서 변경하거나 수정하기 쉬운 장점이 있지만 유니티로 넘어와 쓰기엔 어려움이 있을 수 있다.
그래서 유니티 내부에서 스크립터블 오브젝트를 만든 후 json으로 작업을 하면 협업에 큰 도움이 됨
'유니티 > 최적화' 카테고리의 다른 글
[최적화] Assembly Defintion (0) | 2025.01.13 |
---|---|
[최적화] 오브젝트 풀링 (0) | 2025.01.10 |
[최적화] 유니티 어드레서블 개념 정리 (0) | 2025.01.09 |