Search Unity

어드레서블(Addressables)은 복잡한 라이브 콘텐츠를 전달해야 하는 대규모 제작팀의 요구사항을 보다 효과적으로 지원하기 위한 Unity 에디터 및 런타임 에셋 관리 시스템입니다. 이번 릴리스를 통해 개발자의 수고를 크게 덜 수 있게 되었으며, 엔지니어링 문제를 자체적으로 해결할 만한 여건을 갖추지 않은 소규모 팀도 라이브 콘텐츠를 사용할 수 있게 됩니다. 어드레서블은 이제 프리뷰 단계를 마치고 검증이 완료된 정식 패키지로 Unity 2019.3에 포함되며, Unity 2018 LTS 릴리스에서도 지원됩니다.

배경

에셋 번들은 런타임 시 동적 로딩을 위해 에셋을 개별 단위로 구성하는 로우레벨 방식으로 Unity 4에 도입되었습니다. 에셋 번들을 구현하면 개발자가 앱 설치 시 콘텐츠를 분리할 수 있어 라이브 앱에 정기적인 콘텐츠 업데이트를 제공할 때 초기 다운로드 크기를 작게 유지할 수 있으며, 앱 콘텐츠가 추가되더라도 무선 전송 규정(over-the-air) 한도를 넘어서지 않게 됩니다.

하지만 이러한 이점에도 불구하고, 실제 제작 시 에셋 번들을 활용하는 것이 간단한 일은 아닙니다. 씬과 게임 오브젝트의 공용 필드에서 직접 참조하여 에셋을 로드하고 참조하는 간단한 방식에서 에셋 번들로 콘텐츠를 전환하기 위한 명확한 워크플로가 Unity에 없기 때문에, 앱이나 게임을 정적인 빌트인 콘텐츠를 사용하던 방식에서 증분 업데이트를 통해 동적으로 콘텐츠를 로드하는 방식으로 전환하려면 많은 리팩터링과 커스텀 프로그래밍이 필요합니다. 그래서 많은 개발자가 이 기능을 사용하지 않고 있습니다.

 

어드레서블

에셋 번들을 사용해 본 개발자에게 의견을 물어본 결과, 에셋 번들을 성공적으로 활용하고 있는 대부분의 개발자가 동일한 고수준 시스템을 서로 조금씩 다른 수많은 방식으로 작성하고 있다는 사실을 알게 되었습니다. 그리하여 에셋의 위치 지정, 빌드 및 로드와 관련하여 일반적으로 발생하는 몇 가지 문제를 해결하기 위한 프레임워크를 구축하기 위해 어드레서블이 탄생하게 되었습니다.

 

에셋 참조와 패키징의 분리

어드레서블의 주된 기능은 로드할 대상이 되는 에셋과 에셋이 로드되는 위치방식을 분리하는 것입니다. 씬, 프리팹, 텍스트 에셋을 비롯한 모든 에셋을 어드레서블(위치 지정 가능)로 표시하고 고유한 이름을 부여할 수 있습니다. 위치 지정이 가능한 에셋은 코드 내의  위치 지정 가능한 이름과 특수한 에셋 레퍼런스 스크립트 유형을 통해 참조 및 로드가 가능합니다. 이와 별개로, 어드레서블 에셋을 함께 그룹화하여 빌트인 콘텐츠로 빌드하고 로드하거나 런타임 시 동적으로 로드하기 위한 번들로 통합할 수 있습니다. 이러한 분리를 통해, 게임 코드를 변경하지 않고도 제작 최종 단계에 콘텐츠 패키징과 배포에 대한 의사 결정을 할 수 있습니다.

어드레서블 창

런타임 메모리 관리

Unity의 에셋 번들에서 로드 시 얻게 되는 주된 이점은 더 이상 필요하지 않은 콘텐츠를 메모리에서 효율적으로 언로드할 수 있다는 점입니다. 이전에는 로드한 것과 안전하게 언로드할 수 있는 것을 효과적으로 추적하기 위해 개발자가 복잡한 코딩 작업을 수행해야 했습니다. 하지만 어드레서블을 통해 로드하면 로드된 에셋과 이들의 종속성에 대해 개략적인 참조 횟수가 자동으로 계산되므로 더 이상 사용하지 않는 번들과 관련 에셋을 자동으로 언로드할 수 있습니다. 또한 어드레서블은 로드된 에셋과 에셋 번들 참조 횟수를 실시간으로 디버깅하기 위한 시각적 프로파일러도 제공합니다.

어드레서블 프로파일러

더욱 빠른 반복 작업

어드레서블은 에셋 로드 프로세스에 대한 몇 가지 핵심적인 추상화 기능을 제공하여 콘텐츠 변경 시 바로 확인할 수 있으므로 반복 작업을 더욱 빠르게 수행할 수 있습니다.

  • 플레이 모드 시뮬레이션: 에셋을 빌드하지 않고도 디스크에서 직접 로드하며, 동시에 프로파일러를 통해 에셋 참조 횟수를 디버깅할 수 있습니다.
  • 빠른 증분 빌드: 어드레서블에는 증분 빌드의 속도와 안정성을 향상시키는 새로운 스크립터블 빌드 파이프라인(Scriptable Build Pipeline)이 함께 제공됩니다.
  • 에디터 호스팅 서비스: 로컬에 어드레서블 콘텐츠를 서비스하기 위한 빌트인 기능, LAN에 연결된 기기들이 로컬 기기상에서 빠르고 편리하게 콘텐츠에 대한 반복 작업을 수행할 수 있는 방법을 제공합니다.

시작하기 

어드레서블은 에셋의 참조 및 패키징 문제를 분리하고, 플레이 모드 및 배포된 플레이어 빌드에서 반복 작업을 더욱 빠르게 수행할 수 있게 해주며, 자동 메모리 관리 및 프로파일링 툴을 제공합니다. 이를 통해 콘텐츠의 복잡도에 상관없이 모든 사용 사례에 적용할 수 있도록 확장하고 커스터마이즈할 수 있습니다.

유니티는 어드레서블이 프리뷰 단계를 마치고 제작이 완료된 앱에서 안정적으로 사용 가능하도록 지원하게 된 것으로 만족하지 않고 지속적으로 성능과 기능을 개선할 것이며, Unity의 개선과 더불어 개발자의 요구사항을 충족해 나갈 것입니다.

어드레서블을 통해 동적 콘텐츠를 지원하기 위한 핵심적인 기술 문제가 상당 부분 해결되었지만, 에셋을 호스팅하고 제작을 마친 게임과 앱에 실시간으로 에셋을 제공해야 하는 ‘마지막’ 문제가 여전히 남아 있습니다. 올해 내에 어드레서블 시스템에 완전히 통합된 엔터프라이즈용 글로벌 콘텐츠 호스팅 솔루션을 출시할 예정입니다. 이 서비스에 대한 자세한 내용은 여기에서 요청하실 수 있습니다.

이미 300여 개 프로젝트에서 어드레서블을 사용하고 있습니다. 지금 바로 Unity의 패키지 관리자를 통해 어드레서블을 다운로드하여 프로젝트에서 사용해 보세요. 새로운 프로젝트에서 간편하게 시작하거나, 마이그레이션 가이드에 따라 기존 프로젝트를 업그레이드하여 어드레서블을 활용할 수 있습니다.  또한 GitHub에서 기본 및 고급 사용자를 위한 예제 프로젝트를 제공합니다.

 

33 코멘트

코멘트 구독

댓글 남기기

사용할 수 있는 HTML 태그 및 속성: <a href=""> <b> <code> <pre>

  1. As developers, we tend to do a lot of work, programming/development, etc. and can get caught up in all the pain of the errors we face. But I want to say really, thank you. This was very-much needed, and is absolutely awesome! Great job to your team for all the work put into this! I’ve started using the Addressables in my project, and love it so far!

    I am still using Resources.Load(…) for the majority of my game still, however. I’m wondering if Addressables can be used when *not* in playmode, and just in the editor? I made a level-editing system that requires being able to load these assets (currently through the Resources API) to show where enemy spawns are, but would *love* to switch that system to use the Addressables instead!

  2. after installing the package and updating from bundles my project now fails to load the converted asset. and I find no clue on how to fix the code to make them working again

  3. In my opinion this package should stay on preview until it’s truly production ready, otherwise it’s misleading the community.

  4. I am experiencing a weird bug that happens only on iPhone X/Xs/Xr that the Addressables Initialization Task never completes. On any other platforms, it runs to completion. I suspect it might have something to do with the Task initialization or the WaitHandle

  5. Something I’ve been unable to find – how do you get the address of a ScriptableObject at runtime?

  6. Hi. I use Adressables since the beginning. Nice Stuff.
    Would be cool when you could use it the Unity examples like Fontainebleau, FPS Sample and the Additive Loading Lighting Examples Asset.
    Would speed up out of preview.)

  7. That’s great news.

    But last time I tried to play with it (0.8.something), it was not even possible to get a basic load progress.
    Also, very large scenes (~500Mb) were not loading at all over my local network.

    Curious to know if these issues are fixed now.

    Thanks for the great work. I’m sure the Addressable system will be a very powerful feature!

  8. Not sure i understand this sentence:

    “Addressables is now out of preview and will be available as a verified package for Unity 2019.3. It will remain fully supported in Unity 2018 LTS releases.”

    Is the “official” package available right now? which Unity version can i use it with ?

    1. Lior, we updated the blog post (at the bottom) with a clarification on this point.

  9. Do you anticipate any API churn from now until 2019.3, or is the remaining work mostly bug fixes and new features?

    1. APIs and data will be relatively stable. We are considering a sync loading API, but that would be additive. We’re really focusing on bug fixes and usability improvements for the rest of the year. An Editor UI refresh is coming in about a month, for instance.

  10. typo – “of loadeds assets”

  11. Hopefully its usable by then, because right now and up until now except for a handful of cases it has been a pretty broken and difficult to use system.

    The UI is almost completely broken and will throw all sorts of errors, and trying to load anything except at the very very granular level is difficult.

    People just want a way to load a collection of prefabs, a scene, or a single prefab easily, without having to be an expert in using addressables. Right now both packaging up stuff and loading + unloading it is far too cumbersome for something touted as fixing the difficulty of using asset bundles.

    1. We have not been running into UI errors in our tests, and would love to know what situations cause these. Have you already posted the issue on the forum or as a Unity bug? If not, it would be great if you could. A Unity bug is the best way for us to get a repro project and really dig into problems. If you cannot get us a project, we try to stay somewhat on top of the forums, so you can try posting there. (https://forum.unity.com/forums/addressables.156/)

      1. Thanks I have not but I will file a bug when I am back home.

  12. So can you load in addressable catalogues as addressables?

    1. Are you referring to having multiple Unity projects, and allowing one to load assets (and a catalog) from another? If so, this is something that can work, but is fairly advanced and not yet well explored on our end. This would be the place to start looking: https://docs.unity3d.com/Packages/com.unity.addressables@1.1/api/UnityEngine.AddressableAssets.Addressables.html#UnityEngine_AddressableAssets_Addressables_LoadContentCatalogAsync_System_String_System_String_.

  13. Feedback — it’s completely unusable in its currently form (v1.1.4 – 6/19/2019). The UI asked to convert existing resource bundles and then it locked-up and became unresponsive. I restored ,my project’s files and tried again — this time skipping conversion of existing bundles. Again, it locked up Unity. I’d warn anyone who reads this article to make a back-up of their Unity project before doing anything with this experimental package, as it exists today.

    1. Thanks for the feedback Shaun. Sounds like you are running into a bug; perhaps related to large numbers of legacy asset bundles in use. We’ll investigate.

  14. Good but the biggest issue with asset bundles is shaders in them throwing errors as Unity changes and old bundles are not fully compatible. Bundles have to be kept up to date with changing shaders and material systems. What if you could have material descriptions instead which map/build final material on load (we did this but old bundles throw shader errors or warnings)

    1. Shaders in bundles built in Unity 2018.x and later should be forward compatible with later versions of Unity. If not it would be considered a bug at this point.

  15. Thanks for the post, I’ll give it a try with 2018.4! I was just looking at the “Getting started” guide, but couldn’t find how to load a scene through the addressables system.

    I don’t need to load individual assets, just levels. I hope I can use the addressables system for that, basically mark every scene to be stored as a separate asset bundle and then use addressables to load that scene from its bundle.

    I’m pretty sure it’s supported, the information how to achieve it is probably available somewhere in the documentation. Do you mind to point there?

    Perhaps update the “Getting started” guide with that information too?

    1. Sorry that this isn’t something you easily found in the docs. We do discuss it some, but I’d actually recommend you look at one of our samples to get started with this. Take a look at https://github.com/Unity-Technologies/Addressables-Sample/tree/master/Basic/Scene%20Loading and if you run into any problems, please post them on the forum (https://forum.unity.com/forums/addressables.156/)

  16. Plenty of time till 2019.3. Ive been following the Addressables team on forums , its a solid team they will deliver

  17. Wait, out already? But what about something like Sync Addressables (because that sample on github is not good enough)? What about proper dependency sorting for stuff like unused models in FBX files? What about having your settings serialized and versioned when using custom providers? What about determenistic build behaviour for easier patching? Or, you know, what about the countless bugs?

    It’s far from being a production ready package for *most* of the projects, unless quite a big amount of problems will be fixed until 2019.3.

    1. I have to say, I’ve learned to take it with a grain of salt whenever Unity says something is production ready.

      1. This is sadly so true. I really don’t want to offend anybody, but when I see “production ready” in Unity I read it as “don’t touch it until at least several months later or more”.

    2. Don’t worry, they’ll probably forget about it then deprecate it and promise to replace it with a new system in a year or two.

      1. We’re not going anywhere. We are committed to making Addressables the best way to manage and build live content in Unity 2018 and 2019. We do expect that there will be some evolution of the system as Unity transitions into DOTS workflows with runtime entity binary data in 2020 and beyond, but the team’s mission and goal remains to reduce pain points around content distribution for live productions.

    3. 2019.2 stable is not even released yet. Just give Unity team a time. It ‘s a long way until 2019.3 I’m sure they can finish it.

    4. – Synchronous API: this is not as straightforward as it seems, as one of the fundamental principals of Addressables is that asset dependencies are resolved at runtime, and any number of those dependencies (like asset bundles) may require an asynchronous operation to complete, such as downloading from a remote server. Having said that, based on developer feedback and some requirements we see coming up in DOTS/hybrid, I think there is a place for API support for sync loading under certain conditions, and will likely show up in a later release.
      – Dependency sorting/unused sub-assets: Unused objects in complex assets like FBX files are already stripped correctly by the build pipeline. For instance, in an addressable prefab with a mesh renderer that references a single mesh from an FBX file with multiple meshes, the unused mesh will not be included in the build. A limitation that has existed even before Addressables is the ability to reference a sub-object directly as a loadable unit, as you can only do so at the asset level.
      – Serialization and versioning of custom provider settings: sounds like you are expecting/looking for something specific that we need more clarity on – feel free to start a thread in our forums (https://forum.unity.com/forums/addressables.156/) to facilitate that discussion with the team.
      – Deterministic builds: Non-deterministic output in builds are always considered bugs, and we take them seriously. Please report them if you are experiencing them.

      1. Regarding deterministic builds, I think he refers to deterministic asset bundles output on different machines, which seems to be a known issue and not easily fixable: https://forum.unity.com/threads/deterministic-asset-bundle-building.703826/