Scriptable Object 를 생성 하려면 ScriptableObject.CreateInstance 를 사용합니다.
new 를 사용하면 안됨!
이유는 MonoBehaviour 와 같이, Unity 의 시리얼라이즈 구조를 경유하여 오브젝트를 생성할 필요가 있기 때문.
ScriptableObject 저장
인스턴스화 한 오브젝트를 AssetDatabase.CreateAsset 를 사용하여 에셋으로 저장.
에셋의 확장자는 반드시 .asset 이 아니면 Unity 가 ScriptableObject 파생 에셋으로 인식하지 않음.
CreateAssetMenu 속성을 사용해 간단히 에셋을 생성할 수도 있습니다.
로드
ScriptableObject 로드 및 인스펙터
AssetDatabase.LoadAssetAtPath 을 이용해 간단히 로드 할 수 있음.
MonoBehaviour 와 같이 인스펙터에 표시 되며 PropertyDrawer 도 적용 가능.
Resources.Load 를 이용하여 호출하는것도 가능.
Resources.Load 와 Scene 정의로 호출한 ScriptableObject 의 인스턴스는,
ScriptableObject 의 Resources.Unload 나 UnloadUnusedAssets 로 언로드 되지 않는 한,
같은 인스턴스가 반복 사용되고, 다른 컴포넌트가 컴포넌트가 설정한 값을 그대로 설정한 값을 그대로 사용할 수 있습니다.
02. ScriptableObject 종속관계
02. ScriptableObject 의 종속관계
부모 자식 관계에 대하여
멤버로 다른 ScriptableObject 를 가지는 경우
일반적인 멤버를 다루듯이 스크립트를 작성 했습니다.
결과는 Type Mismatch
해결방법은 간단합니다. 명심하세요.
UnityEngine.Object 를 에셋으로 다루려면 디스크에 존재해야만 한다.
ScriptableObject 를 모두 에셋으로 저장하고, 그 참조를 Serialize 가능한 필드에 연결.
ScriptableObject 의 기저 클래스인 UnityEngine.Object 를 Serialize 데이터로 다루려면,
디스크상에 에셋으로 저장되어 있어야만 합니다. Type Mismatch 상태는, 인스턴스는 존재하지만 디스크상에
에셋으로 존재하지 않는 상태를 가리킵니다.
부모 자식 관계가 있는 상태에서, 각각의 독립된 에셋을 생성해 버리는 것은 관리면으로 봐도 득이 될 것이 없습니다.
자식의 수가 늘거나, 리스트를 다루게 되는 경우 그 수만큼 에셋을 생성하는 것은 파일 관리 면에서 많은 불편이 따릅니다.
그래서 이를 해결하는 방법으로 서브에셋 이라는 기능을 사용해 부모 자식 관계의 에셋을 하나로 묶을 수 있습니다.
서브에셋
서브에셋
부모가 되는 메인 에셋에 에셋 정보를 추가하는 것으로 UnityEngine.Object 가 서브에셋으로 취급됩니다.
모델의 안에 메쉬나 애니메이션 등의 에셋이 포함되어 있습니다. 이것들은 보통, 독립된 에셋으로 존재해야 하지만
서브에셋으로 다루는 것으로 정보들이 내부에 포함되어 디스크상에 저장하지 않고 사용 가능합니다.
ScriptableObject 또한 서브에셋의 기능을 사용하여 구축할 수 있습니다.
Hierarchy 에서 서브 에셋을 보이지 않게 하여 메인 에셋만 존재하는 것 처럼 보이게 할 수 있습니다.
메인 에셋에서 서브에셋을 지우는 방법은 간단합니다. Object.DestroyImmediate 를 사용하여 제거합니다.