02. ScriptableObject 의 사용 - gryphus11/ScriptableObject GitHub Wiki

01. ScriptableObject 의 생성 및 사용

01. ScriptableObject 의 생성 및 사용

    상속
  • ScriptableObject 상속

    • Scriptable Object 생성시 ScriptableObject 클래스를 상속하여 생성.
    • 클래스 명과 에셋 명은 되도록이면 같도록 하는 것이 좋음.
  • 생성
  • ScriptableObject 인스턴스화

    • 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 를 사용하여 제거합니다.

⚠️ **GitHub.com Fallback** ⚠️