04. ScriptableObject 의 수명 - gryphus11/ScriptableObject GitHub Wiki

ScriptableObject 의 수명은, 에셋이 Release 될 때까지

    ScriptableObject 의 수명
  • ScriptableObject 의 수명

    조금 신경 쓰이는 것이 있는데, ScriptableObject 의 수명 입니다. 이것은 단순히 [ScriptableObject 의 에셋이 해제될 때 까지] 입니다. 예를들어, Scene 을 로드할 때, 다음의 Scene 에도 동일 인스턴스의 ScriptableObject 를 참조하고 있는 경우, ScriptableObject 의 값을 간직하고 있습니다. 또 UnloadUnusedAssets 을 호출했을 때, 어디선가 ScriptableObject 에 대한 참조가 있을 경우, 마찬가지로 ScriptableObject 의 값이 보존됩니다
    그림의 아래에서 Scene B 가 ScriptableObject 를 참조하고 있지 않아서 Unload 되어, 값이 리셋 됩니다.

    또한, 에디터라면 Scene 을 넘어가더라도 ScriptableObject 가 해제되지 않을 수 있습니다.

      에셋이 임의로 해제되지 않도록 하는 방법
    • 에셋이 임의로 해제되지 않도록 하는 방법

      Scene 을 넘어가거나, 어디에서도 참조되지 않는 상태에서 UnloadUnusedAssets 이 호출되면 에셋이 해제됩니다. 에셋을 해제하지 않는 방법은, 다음과 같습니다.

      • 어디선가 항상 참조한다. 예를들어 Static 이라도 등록한다면 해제되지 않는다.
      • PreLoadAssets 에 등록. 어떠한 것을 해도 해제되지 않는다.
      • HideFlags.DontUnloadUnusedAsset 을 설정
    • 적극적인 에셋의 해제는, Resources.Unload.
    • 적극적인 에셋의 해제는, Resources.Unload. 하지만 C#의 인스턴스가 해제되는 것은 아님.

      값을 적극적으로 리셋하고 싶을 경우, Scene 을 로드하기 직전에 Release.Unload 로 인스턴스를 해제시켜 준다면, 다음의 Scene 에서 깨끗한 ScriptableObject 를 받을 수 있습니다.

      예를들어, 두개의 Scene 을 오가고 있습니다. 그 때, 연속해서 ScriptableObject 를 참조하고 있기 때문에, 두개의 Scene 에서 값을 보존하고 있지만, Unload 를 실행하면 ScriptableObject 가 해제되어, 다음의 Scene 에는 값이 되돌아옵니다.

      이 때, C# 의 ScriptableObject 인스턴스가 해제되지는 않는 점에 주의할 필요가 있습니다. ScriptableObject 는 일단 파괴되지만, ScriptableObject 가 Deserialize 하여 생성된 C# 의 인스턴스는 그대로 보존되어 있습니다. 즉, Event 나 C# 적으로 직접 참조하고 있는 것은 Unload 후에도 액세스 가능한 것을 의미합니다. 아래의 그림에서는, 왼쪽이 Button 으로부터 이벤트를 호출, 오른쪽은 스크립트(C#)가 ScriptableObject 에 대한 참조를 캐쉬하여 호출하고 있습니다. 왼쪽의 ADD 버튼은 Unload 시에 누를수 없게 되어 있지만, 오른쪽은 Unload 후에도 누를 수 있습니다.

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