[Unity] ScriptableObject에 대한 설명 및 사용 방법
ScriptableObject는 대량의 데이터를 저장할 수 있는 데이터 컨테이너로 데이터를 저장하고 있기 때문에 변경되지 않는 데이터를 갖는 프리팹의 경우 ScriptableObject를 사용하면 인스턴스화할 때마다 데이터를 중복하여 만들지 않기 때문에 메모리 사용을 줄일 수 있다.
MonoBehaviour와 같이 ScriptableObject는 Unity의 Object에서 파생되지만 MonoBehaviour와 달리 GameObject에 연결할 수 없고 에셋으로 저장된다.
편집기에서 사용할 때 데이터 저장은 아무 때나 가능하다. 다만 게임을 플레이하는 중에는 데이터를 저장할 수 없고 저장된 데이터를 사용하는 것만 할 수 있다.
편집기에서 에셋 형태로 ScriptableObject에 저장한 데이터는 세션 간에도 그대로 유지된다.
ScriptableObject는 에셋으로 관리되기 때문에 에셋 번들로 빌드하고 배포하는 방식으로 게임 데이터를 업데이트시키는 데 사용할 수 있다.
ScriptableObject를 생성하고 사용하는 방법은 아래와 같다.
클래스를 생성한 후 ScriptableObject 클래스를 상속받는다. CreateAssetMenu 속성을 사용하면 더욱 간편하게 커스텀 에셋을 생성할 수 있다.
using UnityEngine;
[CreateAssetMenu(fileName = "InfoData", menuName = "ScriptableObjects/Info", order = 1)]
public class Info : ScriptableObject
{
public string prefabName;
}
메뉴에서 Assets > Create > ScriptableObjects > Info를 클릭하여 ScriptableObject의 어셋을 생성할 수 있다.
ScriptableObject의 어셋을 생성하면 아래와 같은 아이콘이 생성된다.
어셋의 Inspecter는 다음과 같다.
Prefab Name에 원하는 데이터를 넣을 수 있다.
만든 ScriptableObject의 어셋을 사용하려면 GameObject에 ScriptableObject를 참조하는 변수를 추가한 후 사용할 수 있다.
[SerializeField] Info _info;
void Start() {
print(_info.prefabName);
}
그리고 Inspecter에서 아이콘을 드래그하여 GameObject에 연결한다.
참고 : https://docs.unity3d.com/kr/2022.3/Manual/class-ScriptableObject.html