유니티를 다루다 보면 데이터를 효율적으로 관리해야 하는 상황이 자주 발생한다. 개별 오브젝트나 프리팹마다 동일한 데이터를 반복해서 넣는 방식은 비효율적이며 유지보수도 어렵다. 이럴 때 활용할 수 있는 기능이 바로 ScriptableObject(SO)이다.
SO는 유니티가 제공하는 독립적인 데이터 컨테이너인데 MonoBehaviour와 달리 게임 오브젝트에 직접 붙일 수 없으며, 별도의 에셋 형태로 프로젝트 내부에서 데이터를 관리하는 용도로 사용된다.
즉, ScriptableObject는 게임 씬과 독립된 데이터를 저장하고 관리하는 데 최적화된 데이터 객체이다.
스크립트 작성
먼저 스크립트를 작성해야 한다.
using UnityEngine;
[CreateAssetMenu(fileName = "NewItemData", menuName = "Game Data/Item", order = 1)]
public class ItemData : ScriptableObject
{
public string itemName;
public Sprite icon;
public int price;
public string description;
}
CreateAssetMenu 애트리뷰트를 사용하면 유니티 에디터에서 우클릭 메뉴로 편리하게 ScriptableObject 에셋 파일을 생성할 수 있다.
에셋 파일 생성
정의한 ScriptableObject를 저장하기 위해 에디터에서 다음과 같은 절차를 따른다.
프로젝트 창에서 마우스 우클릭
Create → Game Data → Item을 선택
새로 생성된 에셋 파일을 선택하여 인스펙터 창에서 원하는 데이터를 입력
이렇게 생성된 에셋 파일은 언제든지 다른 스크립트에서 참조하여 사용할 수 있다.
ScriptableObject는 게임 실행 도중 변경된 데이터가 자동으로 초기화되지 않고 유지되는 특성을 가진다. 따라서 플레이 중 데이터를 동적으로 변경하는 경우, 원본 데이터의 손실 방지를 위해 별도의 인스턴스를 만들어서 사용하거나 순수히 동적으로 변동되지 않는 정적데이터의 관리로만 사용한다.
유니티의 ScriptableObject는 데이터 관리 측면에서 매우 효과적이고 유용한 기능이다. 프로젝트 규모가 커질수록 그 장점이 명확하게 드러나므로, 적극적으로 사용하여 효율적인 데이터 관리 및 유지보수를 고려하는 것이 바람직하다.