Action disabled: source

Loading Resources at Runtime

실행 가능한 주요 게임 내에서 포함되지 않은 사용자의 끝난 게임에서 몇 가지 종류의 에셋을 포함하기를 원하는 시나리오가 있습니다: 독립형, 웹 플레이어 또는 사용자의iOS/Android 어플리케이션. 예를 들어, 하나의 시나리오는 웹 플레이어의 다운로드 사이즈를 슬림하게 하고 동적으로 개별적인 오브젝트 또는 아이템을 다운로드하고 객체화하게 하는 것입니다. 이 방법으로 오직 필요한 물체많이 사용자에 의해 로드됩니다. 또다른 시나리오는 추가적인 무기, 환경, 캐릭터 또는 심지어 완전한 레벨같은 다운로드가 가능한 컨텐츠를 위한 것일지도 모릅니다.

Unity Pro/iOS Advanced/Android Advanced에서 사용자는 이러한 태스크를 수행하기 위해서 두 가지 옵션 중에서 선택할 수 있습니다: Asset Bundles, 그리고 Resource Folders. Non-Pro/Advanced 라이센스를 가지는 사람은 Resource Folders만을 사용할 수 있습니다.

Asset Bundles (Unity Pro-only/iOS Advanced/Android Advanced licenses only)

Asset Bundle은 에셋의 외부적인 컬렉션 입니다. 사용자는 많은Asset Bundle을 가질 수 있고 그러므로 에셋의 많은 다른 외부 컬렉션을 가질 수 있습니다. 이러한 파일은 보통 사용자가 동적으로 접근하기 위해 웹 서버위에 앉아있는 구축된 Unity 플레이어의 외부에서 존재합니다.

Asset Bundle을 구축하기 위해서 사용자는 편집기 스크립트 안으로부터 BuildPipeline.BuildAssetBundle()를 콜합니다. 아규먼트에서 사용자는 빌드된 파일에 포함되는 Objects의 배열을 지정합니다. 이것은 사용자가 AssetBundle.Load()을 사용하는 것에 의해 실시간으로 동적으로 후에 로드할 수 있는 하나의 파일을 빌드할 것입니다.

Resource Folders

Resource 폴더는 구축된 Unity 플레이어에 포함되는 에셋의 컬렉션이나 반드시 인스펙터에서 어떠한GameObject로도 반드시 연결되지는 않습니다.

Resource 폴더로 어떤 것이라도 넣기 위해 사용자는 단순히 Project View에서 하나의 새로운 폴더를 생성하고 폴더를 "Resources"라고 이름 짓습니다. 사용자는 사용자의 프로젝트에서 다르게 구성된 다수의Resource 폴더들을 가질 수 있습니다. 사용자가 이러한 폴더의 하나로부터 로드하고 싶을 때마다 사용자는 Resources.Load()를 콜합니다.

사용자의 전개할만한 타겟이 Streaming Web Player라면 사용자는 어떤 씬이 사용자의Resource 폴더에 모든 것을 포함할 것인지를 정의할 수 있습니다. 사용자는 Player Settings에서 이것을 하고 Edit→Project Settings→Player를 통해서 접근될 수 있습니다. First Streamed Level With Resources을 파라미터와 함께 세팅하고 사용자의Resources 폴더에 있는 모든 에셋은 이 레벨이 사용자에게로 스트림할 때 로드될 것입니다.

Note:

Resources 폴더에서 발견되는 모든 에셋과 그들의 의존성은 resources.assets이라고 불리는 파일에 저장됩니다. 에셋이 벌써 다른 레벨에 의해 사용된다면 그것은 그 레벨을 위해 .sharedAssets에 저장됩니다. Edit → PlayerSettings 'First Streamed Level' 세팅은 어떤 레벨에서 resources.assets이 빌드에서 수집되고 포함될 지를 결정합니다.

"First streamed Level" 이전의 레벨은Resource 폴더에서 하나의 에셋을 포함하고 있다면 그 에셋은 그 레벨을 위해 에셋에 저장될 것입니다. 그것이 이후에 포함된다면 그 레벨은 "resources.assets" 파일로부터 에셋을 레퍼런스할 것입니다.

Resources folder에 있는 유일한 에셋은 Resources을 통해서 접근될 수 있습니다. 그러나 더 많은 에셋은 그들이 의존적이기 때문에 결국 "resources.assets" 파일에 있습니다 (예를 들어 Resources 폴더에서 하나의 재질은Resources 폴더 외부에서 하나의 텍스쳐를 레퍼런스할 지도 모릅니다).

Resource Unloading

사용자는 AssetBundle.Unload()을 부르는 것에 의해 unloadAllLoadedObjects 파라미터를 위해 true를 패스한다면 AssetBundle에 의해 내부적으로 붙잡혀 있던 오브젝트 둘 다와 AssetBundle.Load()를 사용해서 AssetBundle로 부터 로드된 하나는 파괴될 것이고 번들에 의해 사용된 메모리는 릴리즈될 것입니다.

때때로 사용자는AssetBundle을 로드하고 원하는 물체를 객체화하고 그 오브젝트들을 주변에 유지하는 동안 번들에 의해 사용된 메모리를 릴리즈하는 것을 더 선호할지도 모릅니다. 이점은 사용자가 다른 태스크 예를 들어 또다른AssetBundle을 로딩하는 것을 위해 메모리를 비울 수 있다는 것입니다. 시나이오에서 사용자는 파라미터로서 false를 패스할 것입니다. 번들이 파괴된 후에 사용자는 그것으로부터 더이상 오브젝트를 로드할 수 없을 것입니다.

사용자가 또다른 레벨을 로딩하기 전에 Resources.Load()을 사용해서 로드된 씬 오브젝트를 파괴하고 싶다면 그들 위에서 Object.Destroy()를 부릅니다. 에셋을 릴리즈하기 위해서 Resources.UnloadUnusedAssets()를 사용합니다.

역링크