유니티에는 Scriptable Object라는 기능이 있습니다. Scriptable Object를 왜 사용하며, 사용하면 어떤 점이 좋은지 정리해보도록 하겠습니다.
Scriptable Object는 대량의 데이터를 저장하는데 사용할 수 있는 데이터 컨테이너입니다.
메모리의 효율
유니티에서 같은 오브젝트를 여러개 만들때, 프리팹이라는 방식으로 원본을 만들고 그 원본을 복사하여 원본과 똑같은 사본들을 만들어냅니다. 이런 경우에 Scriptable Object는 유용하게 사용될 수 있습니다.
프리팹을 인스턴스화 할 때 마다 해당 데이터의 자체 사본이 생성됩니다. 즉 사본을 많이 생성할수록 메모리를 많이 소모하게됩니다.
만약 원본 오브젝트가 1byte의 메모리를 사용한다면, 사본을 10개 만들면 10byte, 100개 만들면 100byte의 메모리가 필요합니다.
단순히 1byte의 원본 데이터와 완전히 똑같은 데이터를 100개 저장하는데 메모리를 사용한다면, 이는 굉장히 비효율적이라고 볼 수 있습니다.
이 때, Scriptable Object를 사용한다면 메모리에서 단 1바이트만 사용하여 원본 데이터를 저장하고, 같은 내용을 사용하는 100개의 사본들은 이를 참조하는 방식으로 쓸 수 있습니다.
데이터를 에셋 형태로 저장
Scriptable Object는 MonoBehaviour와 마찬가지로 기본 유니티 오브젝트에서 파생됩니다.
하지만 프로젝트 에셋으로 저장되기 때문에 MonoBehaviour와 다르게 게임오브젝트에 컴포넌트로 추가할 수 없습니다.
Scriptable Object가 에디터 네임스페이스와 에디터 스크립팅을 사용합니다. 때문에 에디터 사용 시 데이터를 저장할 수 있지만, 배포된 빌드에서는 Scriptable Object를 사용하여 데이터를 저장할 수 없습니다. 물론 개발시 저장해놓은 데이터를 사용할 수는 있습니다.
Scriptable Object는 에셋 형태이기 때문에 데이터가 디스크에 저장됩니다. 즉 세션 간에도 데이터가 그대로 유지됩니다.
CreatAssetMenuAttribute
ScriptableObject에서 파생된 유형을 Assets/Create 하위 메뉴에 자동으로 나열되도록 표시하도록 설정합니다.
프로젝트 창에서 해당 유형의 인스턴스를 쉽게 만들고 프로젝트에 ".asset" 파일로 저장할 수 있습니다.
✔️ 참고한 자료
Introduction to Scriptable Objects - Unity Learn
ScriptableObject - Unity 매뉴얼 (unity3d.com)
https://docs.unity3d.com/kr/2021.1/ScriptReference/CreateAssetMenuAttribute.html
👍 함께 보면 좋은 자료
유니티 - RPG Inventory System(RPG 게임 인벤토리 만들기) | Rito15
Better Data with Scriptable Objects in Unity! (Tutorial) - YouTube