Version: 2022.2
언어: 한국어
에셋을 사용한 스크립팅
스트리밍 에셋

런타임 시 리소스 로드

어떤 상황에서는 씬의 일부로 로드하지 않고 프로젝트에서 사용할 수 있게 하는 것이 유용합니다. 예를 들어, 게임의 모든 씬에 등장할 수 있지만 드물게 사용되는 캐릭터 또는 기타 오브젝트가 있을 수 있습니다(가령 이것은 “비밀” 기능, 오류 메시지 또는 하이스코어 알림일 수 있습니다). 또한, 초기 다운로드 시간을 단축하거나 게임 콘텐츠를 교체하기 위해 별도의 파일 또는 URL에서 에셋을 로드할 수 있습니다.

Unity는 프로젝트에서 리소스 폴더 를 지원하여 콘텐츠가 메인 게임 파일에 공급될 수 있게 하지만, 요청이 있을 때까지 로드하지 않습니다. 또한, 에셋 번들 을 만들 수도 있습니다. 에셋 번들은 메인 게임 파일에서 완전히 분리된 파일로 게임이 요청했을 때 파일 또는 URL에서 엑세스할 수 있는 에셋을 포함합니다.

에셋 번들

에셋 번들(Asset Bundles)은 에셋의 외부 컬렉션입니다. 여러 개의 에셋 번들을 가질 수 있기 때문에 다른 에셋의 외부 컬렉션도 다수 가질 수 있습니다. 이러한 파일은 빌드된 Unity 플레이어의 외부에 존재하기 때문에 일반적으로 웹 서버에 있으며, 최종 사용자가 동적으로 액세스할 수 있습니다.

에셋 번들을 빌드하려면, 에디터 스크립트에서 BuildPipeline.BuildAssetBundles()를 호출해야 합니다. 인수에서 빌드된 파일에 포함될 오브젝트 배열을 다른 옵션과 함께 지정합니다. 이렇게 하면 추후 런타임에서 AssetBundle.LoadAsset()을 사용하여 동적으로 로드할 수 있는 파일을 빌드할 수 있습니다.

리소스 폴더

리소스 폴더(Resource Folders)는 빌드된 Unity 플레이어의 에셋 컬렉션이지만, 인스펙터에서 어떤 게임 오브젝트와 반드시 연결되어야 하는 것은 아닙니다.

리소스 폴더에 무언가를 넣으려면 프로젝트 뷰(Project View) 에 새 폴더를 만들고 폴더 이름을 “Resources”로 지정해야 합니다. 프로젝트에 여러 리소스 폴더를 다른 형태로 배치할 수 있습니다. 폴더 중 하나에서 에셋을 로드하고 싶다면 Resources.Load()를 호출해야 합니다.

참고

Resources 폴더의 모든 에셋 및 종속성은 resources.assets_이라는 파일에 저장됩니다. 에셋이 이미 다른 레벨에서 사용되는 경우 해당 레벨의 .sharedAssets_에 저장됩니다.

Resources 폴더 에 있는 에셋만이 Resources.Load()를 통해 액세스될 수 있습니다. 그러나 종속성을 지니고 있으면 더 많은 에셋이 “resources.assets” 파일에 포함될 수 있습니다(예를 들어, Resources 폴더의 ​​머티리얼은 Resources 폴더 외부의 텍스처를 레퍼런스할 수 있습니다).

리소스 언로드

AssetBundle.Unload() 또는 AssetBundle.UnloadAsync(bool)를 호출해서 에셋 번들의 리소스를 언로드할 수 있습니다. unloadAllLoadedObjects 파라미터에 true 를 전달하면 에셋 번들에서 내부적으로 보유한 오브젝트와 AssetBundle.LoadAsset()을 사용하여 에셋 번들에서 로드된 오브젝트가 모두 삭제되고 번들에 의해 사용된 메모리가 릴리스됩니다.

에셋 번들을 로드한 후 원하는 오브젝트를 인스턴스화하고 오브젝트를 유지하면서 번들이 사용하던 메모리를 해제하고 싶은 경우가 있습니다. 다른 에셋 번들을 위한 인스턴스 로드 등, 다른 작업을 위해 메모리를 비울 수 있다는 게 장점입니다. 이 경우 파라미터에 false 를 전달해야 합니다. 번들이 삭제된 후에는 해당 번들에서 오브젝트를 로드할 수 없게 됩니다.

다른 레벨을 로드하기 전에 Resources.Load()를 사용하여 로드한 씬의 오브젝트를 삭제하려면 Object.Destroy()를 호출해야 합니다. 에셋을 해제하려면 Resources.UnloadUnusedAssets()를 사용해야 합니다.

에셋을 사용한 스크립팅
스트리밍 에셋