Unity로 게임을 개발하다 보면, 아이템이나 스킬 같은 다양한 데이터를 어떻게 쉽게 관리할 수 있을까 고민할 때가 많습니다. Scriptable Object는 이런 고민을 해결해주는 아주 유용한 도구입니다.
Scriptable Object는 Unity의 객체이며, 메모리 효율적으로 데이터를 저장할 수 있는 방법 중 하나.
MonoBehaviour와 달리, 씬에 종속되지 않고 독립적인 데이터 보관이 가능.
데이터 재사용성: 여러 오브젝트에서 같은 데이터를 공유할 수 있음.
메모리 효율: 데이터는 한 번만 로드되고 여러 곳에서 참조 가능.
코드와 데이터의 분리: 게임플레이 로직과 데이터를 깔끔하게 분리하여 유지보수성이 높아짐.
아이템 시스템: 각 아이템에 대한 데이터를 Scriptable Object로 저장하여 쉽게 관리.
스킬 시스템: 스킬의 속성(데미지, 쿨타임 등)을 Scriptable Object로 관리.
레벨 데이터: 각 레벨의 설정값을 저장하여 빠르게 참조 가능.
먼저, Scriptable Object는 일반 클래스와 달리 MonoBehaviour를 상속받지 않고, ScriptableObject를 상속받아야 합니다. 이 클래스는 Unity의 에디터에서 데이터 자산으로 만들 수 있는 객체입니다. 예를 들어, 게임의 아이템 데이터를 저장할 수 있는 간단한 Scriptable Object 클래스를 만들어보겠습니다.
using UnityEngine;
[CreateAssetMenu(fileName = "NewItem", menuName = "Inventory/Item")] // 에디터에서 바로 생성 가능하게 하는 속성
public class Item : ScriptableObject
{
public string itemName; // 아이템 이름
public Sprite icon; // 아이템 아이콘
public int itemValue; // 아이템 가치
}
[CreateAssetMenu]는 Unity 에디터에서 간편하게 Scriptable Object를 생성할 수 있게 해주는 속성입니다. 이 속성을 추가하면, Unity 에디터에서 우클릭 → Create 메뉴에 새로운 항목이 추가됩니다. 예를 들어, 위 코드에서 menuName이 "Inventory/Item"으로 설정되어 있기 때문에, 에디터에서 쉽게 새로운 아이템 데이터를 만들 수 있습니다.
[CreateAssetMenu(fileName = "NewItem", menuName = "Inventory/Item")]
- fileName: 생성할 자산의 기본 파일 이름.
- menuName: 에디터의 Create 메뉴에서 어떻게 보일지 결정.
이 속성을 설정하면, 에디터 상에서 우클릭 후 Create > Inventory > Item을 선택해 쉽게 아이템 데이터를 만들 수 있습니다.
이제 Unity 에디터에서 직접 Scriptable Object를 만들어 봅시다.
- 프로젝트 뷰에서 우클릭.
- Create > Inventory > Item을 선택.
- 새로 생성된 NewItem 파일이 프로젝트에 추가된 것을 확인.
- 파일을 클릭하면 Inspector에서 itemName, icon, itemValue와 같은 데이터를 입력할 수 있습니다.
이제 Scriptable Object를 게임에서 어떻게 사용할지 알아보겠습니다. 생성한 아이템 데이터를 다른 스크립트에서 불러와 활용할 수 있습니다. 예를 들어, 캐릭터가 인벤토리에 아이템을 추가하는 스크립트를 만들어봅시다.
using UnityEngine;
public class Inventory : MonoBehaviour
{
public Item[] items; // 인벤토리에 아이템을 저장할 배열
void Start()
{
foreach (Item item in items)
{
Debug.Log(item.itemName + " - " + item.itemValue);
}
}
}
이렇게 하면, Inventory 스크립트의 items 배열에 여러 Scriptable Object 인스턴스를 추가할 수 있습니다. 게임이 시작될 때 각 아이템의 이름과 가치를 콘솔에 출력할 수 있죠.
Scriptable Object는 여러 오브젝트에 공통으로 사용할 수 있는 데이터 저장소로 활용할 수 있기 때문에, 다음과 같은 장점을 제공합니다:
데이터 재사용: 동일한 데이터를 여러 오브젝트에서 공유 가능.
메모리 절약: 중복된 데이터가 메모리에서 반복 생성되지 않고 한 번만 로드됨.
유지보수성: 코드와 데이터의 분리로 구조가 깔끔해지고 유지보수가 용이해짐.