스트리밍 에셋(Assets)
고급 에디터 토픽

ScriptableObject

ScriptableObject is a class that allows you to store large quantities of shared data independent from script instances. Do not confuse this class with the similarly named SerializedObject, which is an editor class and fills a different purpose. Consider for example that you have made a prefab with a script which has an array of a million integers. The array occupies 4MB of memory and is owned by the prefab. Each time you instantiate that prefab, you will get a copy of that array. If you created 10 game objects, then you would end up with 40MB of array data for the 10 instances.

Unity 는 Vector3 와 같이 프리미티브 타입, 스트링, 배열, 리스트, Unity 에 특화된 타입뿐만 아니라 복사 처럼 선언된 오브젝트에 속한 Serializable 속성을 가진 커스텀 클래스 모두를 시리얼라이즈 합니다. 이는 사용자가 ScriptableObject 를 생성하고 백만 개의 정수를 배열에 저장하면 배열이 해당 인스턴스와 함께 저장됨을 뜻합니다. 인스턴스는 개별 데이터를 보유하는 것으로 판단됩니다. ScriptableObject 필드나 MonoBehaviour, Mesh, GameObject 와 같은 모든 UnityEngine.Object 필드는 값이 아니라 * 레퍼런스*로 저장됩니다. 백만 개의 정수가 있는 ScriptableObject 를 참조하는 스크립트가 있다면 Unity 는 스크립트 데이터에 ScriptableObject 에 대한 레퍼런스만 저장합니다. 그리고 ScriptableObject 는 배열을 저장합니다. ScriptableObject 에 대한 레퍼런스를 갖는 4MB 의 프리팹 인스턴스 10 개는 그 데이터 총합이 다른 예처럼 40MB 가 아니라 약 4MB 입니다.

ScriptableObject 는 값의 복제를 피해 메모리 소비를 줄이려는 경우에 사용하지만, 장착형 데이터 집합을 정의할 때도 활용할 수 있습니다. RPG 게임의 NPC 샵이 그 예입니다. 사용자 지정 ShopContents ScriptableObject 에서 여러 에셋을 생성하고 각각 구매 가능한 항목을 정의할 수 있습니다. 게임에 존이 세 곳 있는 경우 각 존은 서로 다른 등급의 아이템을 제공할 수 있습니다. 샵의 스크립트는 어떤 항목이 가능할지 정의하는 ShopContents 오브젝트를 참조합니다. 예시는 스크립팅 레퍼런스를 참조하십시오.

ScriptableObject 파생 클래스를 정의하고 나면 클래스를 사용해 커스텀 에셋을 손쉽게 생성하도록 CreateAssetMenu 속성을 사용할 수 있습니다.

팁: 인스펙터에서 ScriptableObject 레퍼런스로 작업할 때 레퍼런스 필드를 더블 클릭해서 ScriptableObject 의 인스펙터를 열 수 있습니다. 또한 인스펙터가 나타내는 데이터의 관리에 도움이 되도록 모양을 정의해 커스텀 에디터를 만들 수도 있습니다.

스트리밍 에셋(Assets)
고급 에디터 토픽