어떤 상황에서는 씬의 일부로 로드하지 않고 프로젝트에서 사용할 수 있게 하는 것이 유용합니다. 예를 들어, 게임의 모든 씬에 등장할 수 있지만 드물게 사용되는 캐릭터 또는 기타 오브젝트가 있을 수 있습니다(가령 이것은 “비밀” 기능, 오류 메시지 또는 하이스코어 알림일 수 있습니다). 또한, 초기 다운로드 시간을 단축하거나 게임 콘텐츠를 교체하기 위해 별도의 파일 또는 URL에서 에셋을 로드할 수 있습니다.
Unity는 프로젝트에서 리소스 폴더 를 지원하여 콘텐츠가 메인 게임 파일에 공급될 수 있게 하지만, 요청이 있을 때까지 로드하지 않습니다. 또한, 에셋 번들 을 만들 수도 있습니다. 에셋 번들은 메인 게임 파일에서 완전히 분리된 파일로 게임이 요청했을 때 파일 또는 URL에서 엑세스할 수 있는 에셋을 포함합니다.
에셋 번들(Asset Bundles)은 에셋의 외부 컬렉션입니다. 여러 개의 에셋 번들을 가질 수 있기 때문에 다른 에셋의 외부 컬렉션도 다수 가질 수 있습니다. 이러한 파일은 빌드된 Unity 플레이어의 외부에 존재하기 때문에 일반적으로 웹 서버에 있으며, 최종 사용자가 동적으로 액세스할 수 있습니다.
에셋 번들을 빌드하려면, 에디터 스크립트에서 BuildPipeline.BuildAssetBundles()를 호출해야 합니다. 인수에서 빌드된 파일에 포함될 오브젝트 배열을 다른 옵션과 함께 지정합니다. 이렇게 하면 추후 런타임에서 AssetBundle.LoadAsset()을 사용하여 동적으로 로드할 수 있는 파일을 빌드할 수 있습니다.
리소스 폴더(Resource Folders)는 빌드된 Unity 플레이어의 에셋 컬렉션이지만, 인스펙터에서 어떤 게임 오브젝트와 반드시 연결되어야 하는 것은 아닙니다.
리소스 폴더에 무언가를 넣으려면 프로젝트 뷰(Project View) 에 새 폴더를 만들고 폴더 이름을 “Resources”로 지정해야 합니다. 프로젝트에 여러 리소스 폴더를 다른 형태로 배치할 수 있습니다. 폴더 중 하나에서 에셋을 로드하고 싶다면 Resources.Load()를 호출해야 합니다.
Resources 폴더의 모든 에셋 및 종속성은 resources.assets_이라는 파일에 저장됩니다. 에셋이 이미 다른 레벨에서 사용되는 경우 해당 레벨의 .sharedAssets_에 저장됩니다. Edit -> PlayerSettings First Streamed Level 설정에 따라 _resources.assets_가 모아져 빌드에 포함될 레벨을 결정합니다.
“First streamed Level” 보다 이전 레벨이 Resource 폴더의 에셋을 포함하는 경우, 에셋은 해당 레벨의 에셋으로 저장됩니다. 이후에 포함될 경우 해당 레벨은 “resources.assets”의 에셋을 레퍼런스합니다.
Resources 폴더 에 있는 에셋만이 Resources.Load()를 통해 액세스될 수 있습니다. 그러나 종속성을 지니고 있으면 더 많은 에셋이 “resources.assets” 파일에 포함될 수 있습니다(예를 들어, Resources 폴더의 머티리얼은 Resources 폴더 외부의 텍스처를 레퍼런스할 수 있습니다).
AssetBundle.Unload()를 호출해서 에셋 번들의 리소스를 언로드할 수 있습니다. unloadAllLoadedObjects 파라미터에 true 을 전달하면 에셋 번들에서 내부적으로 보유한 오브젝트와 AssetBundle.LoadAsset()을 사용하여 에셋 번들에서 로드된 오브젝트가 모두 삭제되고 번들에 의해 사용된 메모리가 릴리스됩니다.
에셋 번들을 로드한 후 원하는 오브젝트를 인스턴스화하고 오브젝트를 유지하면서 번들이 사용하던 메모리를 해제하고 싶은 경우가 있습니다. 다른 에셋 번들을 위한 인스턴스 로드 등, 다른 작업을 위해 메모리를 비울 수 있다는 게 장점입니다. 이 경우 파라미터에 false 를 전달해야 합니다. 번들이 삭제된 후에는 해당 번들에서 오브젝트를 로드할 수 없게 됩니다.
다른 레벨을 로드하기 전에 Resources.Load()를 사용하여 로드한 씬의 오브젝트를 삭제하려면 Object.Destroy()를 호출해야 합니다. 에셋을 해제하려면 Resources.UnloadUnusedAssets()를 사용해야 합니다.