유니티 에셋 번들 | 초보자를 위한 에셋번들 – 개념 설명 및 기본 구현 242 개의 가장 정확한 답변

당신은 주제를 찾고 있습니까 “유니티 에셋 번들 – 초보자를 위한 에셋번들 – 개념 설명 및 기본 구현“? 다음 카테고리의 웹사이트 th.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: https://th.taphoamini.com/wiki. 바로 아래에서 답을 찾을 수 있습니다. 작성자 오늘코딩 이(가) 작성한 기사에는 조회수 597회 및 좋아요 29개 개의 좋아요가 있습니다.

유니티 에셋 번들 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 초보자를 위한 에셋번들 – 개념 설명 및 기본 구현 – 유니티 에셋 번들 주제에 대한 세부정보를 참조하세요

에셋 번들에 관하여 기본적인 내용을 정리해봤습니다.
에셋번들을 A부터 Z까지 영상을 찍기에는 언급해야할 내용이 너무 많고
영상이 심각하게 길어질 거 같아서 기본적인 내용으로 제작하였습니다.
개념적인 설명이 대부분이지만
에셋번들에 대해서 생소하신 분들에게는 도움이 되실거라고 생각합니다.

———————————————————————————————————————–
저도 아직 모르는 게 많고 부족한 부분이 많기 때문에
저 역시 공부한다는 생각으로 찾아보고 조사하면서 영상을 만들고 있습니다.
틀린 부분이나 보충할 부분이 있다면 댓글로 남겨주시면 감사하겠습니다.
오늘코딩 블로그 : https://coding-of-today.tistory.com/
문의 및 이메일 : [email protected]

유니티 에셋 번들 주제에 대한 자세한 내용은 여기를 참조하세요.

[유니티 에셋번들 사용법] 1. 에셋번들이란? – IT 마이닝 – Tistory

에셋번들이란 이름 그대로 에셋의 묶음입니다. 유니티의 에셋(프로젝트 뷰에 보이는 모든 것들을 에셋으로 취급할 수 있습니다.

+ 여기에 보기

Source: itmining.tistory.com

Date Published: 1/25/2022

View: 5463

메모리 사용량을 절감하는 에셋 번들 사용법 – Unity Blog

애플리케이션에서 콘텐츠 전송 네트워크(CDN)로 에셋을 스트리밍하거나, 하나의 대용량 바이너리로 에셋을 한꺼번에 패킹해봤다면 에셋 번들에 대해 들어보셨을 겁니다 …

+ 여기를 클릭

Source: blog.unity.com

Date Published: 9/4/2021

View: 4804

Unity AssetBundle 기본 개념 – 애뎡의 잡동사뉘

+ 저는 지금 2020 이상 버전을 사용 중인데 2018.2 이상 버전부터는 에셋 번들 관리자의 지원이 중단되었다고 합니다. 결국 Addressable asset system …

+ 여기에 자세히 보기

Source: young-94.tistory.com

Date Published: 6/28/2022

View: 998

[Unity3D] 에셋번들(AssetBundle) 빌드 – 싸비 블로그

에셋번들은 에셋(모델, 텍스처, 프리팹, 오디오 클립, 씬 등)의 묶음을 의미합니다. 에셋번들을 이용하면 프로그램 실행중에 동적으로 에셋을 로드할 수 …

+ 여기에 보기

Source: ssabi.tistory.com

Date Published: 11/16/2022

View: 6486

210726_유니티 Asset Bundle – 세상엔 할 것이 참 많아

에셋번들은 게임 등에서 콘텐츠를 다운로드 할 경우 유용하게 사용될 수 있다. 게임 할 때 추가 리소스를 다운 받는 것들이 에셋 번들임. 유니티 …

+ 여기를 클릭

Source: minquu.tistory.com

Date Published: 10/23/2021

View: 2237

Asset Bundle 에셋번들 – TA의 기록

https://itmining.tistory.com/54 [유니티 에셋번들 사용법] 1. 에셋번들이란? 이 글은 PC 버전 TISTORY에 최적화 되어있습니다.

+ 여기를 클릭

Source: mgtul.tistory.com

Date Published: 10/30/2022

View: 800

(Unity) 유니티 에셋번들

에셋번들을 사용하는 이유 ? · window -> Assetbundle Browser 를 킨다. · Configure 탭을 눌러 사용할 에셋들을 드래그로 올린다. · Build 탭을 눌러 Build …

+ 여기에 보기

Source: happysalmon.tistory.com

Date Published: 5/13/2022

View: 7350

Unity3D 5 – 에셋 번들(AssetBundle) – 에듀코카

Unity3D 5 – 에셋 번들(AssetBundle). 게임 > 개발 > 개발엔진 … Unity를 어떻게 활용할 수 있으며 어떤 구조로 이뤄져있는지 분석해봅니다.

+ 여기를 클릭

Source: edu.kocca.kr

Date Published: 9/15/2022

View: 4384

주제와 관련된 이미지 유니티 에셋 번들

주제와 관련된 더 많은 사진을 참조하십시오 초보자를 위한 에셋번들 – 개념 설명 및 기본 구현. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

초보자를 위한 에셋번들 - 개념 설명 및 기본 구현
초보자를 위한 에셋번들 – 개념 설명 및 기본 구현

주제에 대한 기사 평가 유니티 에셋 번들

  • Author: 오늘코딩
  • Views: 조회수 597회
  • Likes: 좋아요 29개
  • Date Published: 2022. 8. 5.
  • Video Url link: https://www.youtube.com/watch?v=mC2d94bfI2w

[유니티 에셋번들 사용법] 1. 에셋번들이란?

이 글은 PC 버전 TISTORY에 최적화 되어있습니다.

서론 자원을 뜻하는 Asset, 묶음을 뜻하는 Bundle이 합쳐져서 만들어진 에셋번들(AssetBundle). 처음 들어보신 분들이 많을 것이라고 생각합니다. 물론 저도 몰랐습니다. 모르는 사람이 알면서 알려주는 에셋번들 사용하기입니다. 1. 에셋번들이란? 2. 에셋번들의 생성 및 빌드 3. 에셋번들 다운로드, 로딩

에셋번들이 뭡니까?

에셋번들이란 이름 그대로 에셋의 묶음입니다. 유니티의 에셋(프로젝트 뷰에 보이는 모든 것들을 에셋으로 취급할 수 있습니다. :프리팹, 이미지, 사운드, 텍스트, 스크립트, 폴더)들을 모아 하나의 묶음으로 만드는 것이죠. 에셋 번들의 일반적인 작업 흐름은 아래와 같습니다.

1. 개발자는 먼저 에디터 내의 씬에 있는 에셋으로부터 에셋 번들을만듭니다.

2. 외부 스토리지에 에셋번들을 로드합니다.

1. 런타임 중 에셋번들을 외부 스토리지로부터 다운로드합니다.

2. 에셋번들로부터 개별 에셋을 로드하여 사용합니다.

에셋번들을 왜 써야하죠?

유니티 게임을 빌드하게 되면 실행파일과 에셋은 고유한 포맷으로 압축, 보안이 되어 있어 재빌드 전에는 수정사항을 적용할 수 없습니다. 에셋번들은 위의 그림에서 보았듯이 에셋들을 모아 저장하고, 서버로부터 WWW 확장자를 이용해 다운로드할 수 있습니다. 그럼으로서 큰 용량에 민감한 모바일은 최초 앱 배포 시에 작은 용량을 배포하게 하고, 추후에 인터넷을 통해서 에셋들을 받도록 하는 방법이죠.

2.1 넥슨의 메이플스토리m 에셋번들 로딩 예1

2.1 넥슨의 메이플스토리m 에셋번들 로딩 예1

이제 에셋번들이 무엇이고, 왜 필요한지 어렴풋이 감이왔다면 다음 장에서 에셋번들을 만들고 빌드하는 방법에 대해서 다뤄보도록 하겠습니다.

Unity AssetBundle 기본 개념

반응형

+ 저는 지금 2020 이상 버전을 사용 중인데 2018.2 이상 버전부터는 에셋 번들 관리자의 지원이 중단되었다고 합니다. 결국 Addressable asset system을 사용해야 하는데 asset bundle의 개념이 머리에 어느 정도 있어야 addressable을 제대로 사용할 수 있을 것이라 판단하여 작성합니다.

-AssetBundle-

– 말 그대로 asset들을 묶은 파일이다.

-사용 목적-

– 메모리 관리

– 초기 인스톨 사이즈를 줄이기 위함

[모바일 게임을 초기에 스토어에서 다운로드하고 나서 게임 시작 후 새 리소스를 다운로드하는데 새로이 받는 리소스들이 에셋 번들이라 생각하면 된다.]

– 런타임에 불러 사용 -> 컨텐츠 패치

=> 사실상 모바일에선 거의 무조건적으로 사용할 수밖에 없다.

잘 사용하면 여러 이점들이 있지만 잘못 사용하면 메모리에 심각한 문제를 야기할 수 있다.

나 같은 초심자의 경우 또는 보통 프로젝트 초기에는 볼륨이 작기 때문에 스크립트에서 public GameObject obj;를 선언하고 인스펙터 창에서 obj에 오브젝트를 할당하여 사용하곤 한다. 그러나 추후 프로젝트의 볼륨이 점점 커지면서 한 씬에 한 번에 참조된 오브젝트들이 많아지게 되면 메모리 문제가 생길 수 있다. [인스펙터 창에 오브젝트나 Prefab을 올려 사용하면 씬 데이터를 불러오는 시점에 메모리에 올리게 된다.]

이를 해결하기 위해 Resources 폴더를 사용한다.

나도 보통 그랬고 잘 모르면 조금 검색하다 바로 찾아볼 수 있기 때문이다.

사실 Resources 폴더는 이름으로 간편하게 접근할 수 있고 필요시에 로드할 수 있어서 효율적이기도 하다!

다만 메모리 관리가 복잡해지고 Resources 폴더 안에 data의 크기가 커지면 커질 수 록 앱의 시작 시간과 빌드 시간이 당연히 증가할 것이고 초기 빌드 용량 또한 커질 수밖에 없다. [Resources.Load를 사용할 때 리소스가 메모리에 올라간다.]

그렇기에 보통 빠른 프로토타입을 위해 사용하거나 정말 빈번하게 사용하는 몇 경우 정도(아이콘과 같은 작은 리소스)에 사용하기에 좋다. [Resources 폴더를 사용하면 또 한 가지 불행한 점이 있다…… Resources.Load를 사용할 때 에셋 이름으로 불러들이기 때문에 함부로 에셋의 이름을 변경하기가 참 힘들다.. 에셋의 이름을 바꾸면 코드를 또 바꿔줘야 하는 엄청난 불편함이 존재한다.(1~2개면 모를까 10개 이상만 돼도 끔 찍 하 다.)]

* Resources 폴더에 관해 잠시 언급

Unity에서도 Resources 폴더는 사용하지 말라고 권장한다. 이유야 여러 가지인데 가장 큰 이유는 당장 이 폴더에 들어가 있는 에셋들을 사용하지 않음에도 불구하고 메모리에 올라가기 때문에(처음 어플이 실행 시 Resources 폴더에 있는 내용들을 읽어드림) 앱의 시작 시간이 느려진다.(앱 시작 시 검정 화면 뜨는 시간이 길어짐)

이는 특히 모바일용 앱 개발에 큰 영향을 미칠 수밖에 없다.

요즘이야 스마트폰의 성능이 많이 좋아졌지만 그 래 도 안 된 다 . 당연한 것…

즉 test 할 때(개발 초기 -> 프로토타입을 구현할 때) 정도 사용하기에는 적절하다.

추후에는 당연히 AssetBundle, Addressable을 사용해야 한다.

[Addressable은 AssetBundle의 상위 버전이 아니라 AssetBundle을 조금 더 효과적으로 관리하고 사용할 수 있도록 도와주는 system이기 때문에 당연히 AssetBundle의 개념을 알고 있어야 한다.]

대략적으로 보면

Resources 폴더 -> 에셋 번들 교체(스토리지에서 에셋 번들을 로드하고 사용하고자 하는 오브젝트를 꺼냄) -> 런칭 시점이 다가올 때쯤에는 로컬 디스크에서 에셋 번들을 가져오는 게 아니라 웹에서 다운로드하는 방식으로 변경!

-에셋 번들의 구조-

Header(ID, 압축방식 등 + Lookup Table) + Data Segment(assets)

Lookup Table – data segment에 들어있는 asset들의 index 정보를 가지고 있다. (tree 구조)

-Data Segment의 압축 방식- (에셋 번들의 압축 방식, 물론 압축을 안 할 수도 있다.)

1. LZMA(None)

– Data Segment 안에 있는 모든 asset들을 하나로 묶어 하나의 파일로 만든다.

– 압축은 많이 되지만 비효율적

– 1번들 1에셋의 경우 적합

– 네트워크 대역폭이 문제일 시 적합

– 에셋 번들이 한번 사용돼서 압축이 풀리게 되면 그다음부터는 LZ4로 자동으로 압축이 풀리고 디스크에 캐싱 되기 때문에 최초 로딩이 오래 걸릴 수 있지만 그 뒤에는 LZ4의 효율로 돌아간다.

2. LZ4의 압축방식(chunkBasedCompression)

– asset들을 하나로 묶는 것이 아닌 여러 덩어리로 나누어서 저장한다.

[chunk는 작은 데이터 블록으로 생각하면 됨 -> asset이 하나의 블록보다 크면 여러 블록에 저장되는 방식 즉 분산돼서 압축되기 때문에 효율성이 올라간다.]

– 일반적인 권장 옵션

-의존성 (Dependency)-

예를 들어

A라는 번들에 3d 오브젝트 a가

B라는 번들에는 여러 Material들이

C라는 번들에는 여러 Animation들이

존재한다 가정할 때

A에 있는 오브젝트 a가 B, C 번들의 Material, Animation을 참조할 때 A 번들은 B, C 번들을 의존하게 된다.

이것을 의존성이라 한다.

이 상황에서 A, C 번들만 있고 B가 없을 경우 Material이 빠지기 때문에 a 오브젝트는 unity editor 상에서 보라색으로 나올 것이다.. 허허ㅋㅋ [당연하다.]

* 여기서 중요하게 파악해야 하는 점은 A 안에 있는 오브젝트를 제대로 사용하려면 A 번들만 로드가 돼야 하는 게 아니라 B, C도 로드가 되어야 한다는 점이다.

그렇다면 이것들은 코드로는 어떻게 표현하면 좋을까

번들의 manifest(번들에 관련된 정보들이 있다.)에 의존성 정보를 이용하여 의존성이 걸려있는 번들을 로드한다.

즉 꼭 써야 하는 필요한 번들만 로드해서 메모리 낭비를 줄인다.

물론 메모리 낭비도 에셋 번들을 제대로 사용했을 경우에나 해당한다.

의존성을 어떻게 구성하느냐는 에셋 번들에서 메모리를 위해 굉장히 중요하다.

예로

에셋 번들이 1, 2, 3로 3개 존재하고

1과 2 안에 각각 material이 하나씩 존재한다.

에셋 번들 3에는 texture이 하나 존재한다.

여기서 1, 2안에 있는 material이 에셋 번들 3에 있는 texture에 의존하고 있다면 에셋 번들 3을 로드하면 되지만

에셋 번들 3에 있는 texture가 번들화되지 않았다면 에셋 번들 1, 2가 로드됐을 때 각 번들 안에 있는 material 은 각각 texture을 가져와야 하는데 이 texture은 번들이 아니기 때문에 에셋 번들 1, 2에 있는 material은 각각 texture을 가진 체 번들이 로드된다. [texture가 1 나면 될 것을 2개가 메모리에 올라간다.]

+ 에셋 번들의 Variant 개념도 확실히 알고 넘어가야 합니다.

https://kukuta.tistory.com/192

– 이분이 정말 자세히 설명을 해주셨어요 🙂

그렇다면 최적의 에셋 번들의 개수는?

[영상에서도 그랬지만 결국엔 현재 프로젝트의 상황과 개발자의 판단이 전부이다. 그래도 어느 정도의 기준은 있다.]

1. 너무 적은 에셋 번들을 가지고 있을 경우

– 실행 시 메모리 사용량이 증가할 수도 있다.(Lookup Table은 모든 Asset들을 지정하기 때문에)

asset이 많이 늘어나면 늘어날수록 에셋 번들의 Header가 커질 것이고 에셋 번들을 로드할 때 LZ4나 압축하지 않은 에셋 번들은 Header 부분만 가져오게 된다.(header만 메모리에 올림, 사실 이 부분은 최적화되어있기 때문에 메모리에 여러 개 올려도 상관없지만 그러면 안됨) 그런데 에셋 번들이 너무 적을 경우, 특히 극단적으로 번들을 하나만 만들었는데 이 안에 모든 에셋이 있는 경우를 가정하게 되면 Header의 크기가 극단적으로 커질 것이고 이게 메모리에 올라오게 될 것이다. 심지어 최초 로딩 시 한꺼번에 이 큰 헤더 파일이 올라오기 때문에 메모리 낭비가 생길 수 있다.

– 다운로드 양의 증가한다. (업데이트 시 불리)

실질적으로 업데이트를 위해 에셋 번들을 많이 사용하게 되는데 에셋 번들의 분류가 너무 적으면 번들 하나의 크기가 클 것이고 이러면 한번 다운로드할 때 걸리는 시간이 클 것이다.

2. 너무 많은 에셋 번들을 가지고 있을 경우

– 빌드 시간이 증가함

빌드 할 때마다 에셋 번들을 쭉 검사하게 되는데 번들이 많을 경우 당연히 빌드 시간이 증가한다.

-개발을 복잡하게 만들 수 있음

의존성을 생각해야 한다. 에셋 번들이 많아질 경우 당연히 의존성도 많아질 수밖에 없다. 번들에 들어있는 에셋을 로드할 때 의존하고 있는 다른 에셋 번들들도 미리 로드를 해야 하는데 의존성이 많을 경우 복잡도가 올라간다.

– 전체 다운로드 시간을 증가시킴

에셋 번들을 너무 많이 나눌 경우에는 추가적인 오버헤드 정보들이 많이 들어가기 때문에 전체 사이즈가 커지고 다운로드 시간을 증가시킨다.

위와 같은 문제들을 최대한으로 최적화하기 위해 그룹화를 권장한다.

-그룹화-

1. 논리적 그룹화

– UI, 캐릭터, 환경 등 논리적으로 묶을 수 있는 요소

(근데 웃긴 게 사실 말이 좋아 그룹화지 개발자가 판단을 잘해서 잘 나누는 게 중요하다.)

2. Downloadable Content(DLC)에 가장 적합

– 내가 필요한 부분만 바꿀 수 있기 때문에 적합함 이유는

예를 들어 1부터 100까지 컨텐츠가 있을 경우 각 레벨이 번들로 나누어 있다 가정할 때 추가가 되거나 각 레벨별로 바뀔 경우 각 레벨의 번들만 바꿔주면 된다.

3. 언제 어디서 사용될지 잘 알고 있어야 한다. (정확히 알고 있어야 함)

– 당연한 이야기겠지만 정확히 알아야 낭비 없이 불러서 사용할 수 있다.

2. 종류별 그룹화

– 오디오 트랙 또는 국가별 언어 파일 등 같은 타입 별 그룹화

– 동시 사용하는 컨텐츠별 그룹화 [예로 콘텐츠의 레벨을 나눈 것처럼 각 레벨에서 한 번에 동시에 부를 그런 것들]

– 각 레벨별 사용하는 모든 캐릭터, 텍스처, 음원을 하나로 그룹화

but 단점은 레벨 1, 2, 3에 공통적으로 사용하는 것도 따로 레벨 1, 2, 3으로 분류돼야 한다.

여기서 추가로 준 팁은

– 자주 변경되는 것과 변경되지 않는 것들을 분리

– 모델과 연관된 텍스처, 애니메이션 등을 그룹화

– 여러 에셋 번들이 참조하는 에셋은 공용 에셋 번들로 이동 (이게 중요한 듯)

[이게 무슨 말이냐면 번들이 A, B, C가 있고 A, B, C가 D를 참조할 때 D를 공용 에셋 번들로 빼버리는 게 좋단 소리!]

-절대 동시에 로드하지 않는 에셋들을 그룹화

-번들 내 50% 이하의 에셋이 같이 로드되지 않는 경우 분리를 고려

– 적은 수의 에셋을 가지며 자주 로드하는 에셋 번들은 통합을 고려

등등 여러 방식이 있지만 사실 개발하면서 그 프로젝트에 맞는 가장 적합한 방식을 개발자가 찾아서 잘 나누는 것이 중요한 듯하다.

AssetBundle 로드 API

– WWW.LoadFromCacheOrDownload

어떤 URL로부터 에셋 번들을 다운로드하고 그걸 로컬 스토리지에 캐싱 해서 저장한다.

여기서 만약에 번들이 압축되어 있으면 캐싱 될 때 번들의 압축을 풀어서 저장된다.

다만 에셋 번들을 다운로드할 때 데이터를 메모리에 계속 올려둔다. -> 번들 크기만큼 메모리에 올라가게 된다.

그렇기에 unity 5.3 이상에서는 UnityWebRequest 클래스를 사용하길 권장하는데 영상이 3년 전이라 그런 건지 5점대 버전이 있었네.. 뭐 하튼

UnityWebRequest 클레스는 www 클래스를 대체할 목적으로 만들어진 것이다.

다운로드하는 동안에 메모리 문제를 완화해 준다.

여기서 에셋 번들을 로드할 때 모바일과 에디터의 방식이 조금은 다른데

모바일의 경우는 에셋 번들의 헤더 정보만 메모리에 올리게 되고(실제 오브젝트를 로드하는 메서드를 부를 때 메모리에 오브젝트도 올라간다. 그렇다고 해서 모바일에서 모든 에셋 번들을 로드해 두면 안 됨 모바일 자체가 메모리가 넉넉지 않고 에셋 번들의 헤더 정보도 생각보다 메모리가 높기 때문이다. 특히 안드로이드가 아이폰보다 헤더 정보의 메모리가 더 높은 현상이 있다.) 에디터는 번들을 통째로 메모리에 올리게 된다.

즉 에셋 번들에 대한 메모리 프로파일링을 할 때 에디터에서 하는 게 의미가 없다.

반드시 타겟 기기에서 해봐야 하야한다.

이처럼 메모리 관리에 온 신경이 집중되어야 하는데 메모리 문제가 가장 많이 생기는 경우는 알고 보면 씬을 전환할 경우이다.

일단 씬전환의 사이클을 알아야 한다.

씬이 전환될 때 Resources.UnloadUnusedAsset()이 함수가 불리게 되고 사용되지 않은 리소스들이 제거가 된다.

씬이 전환될 때 유니티에서 내부적으로 자동적으로 이 함수를 호출한다.

그렇다면 이 함수가 내부적으로 불리는데 왜 메모리의 문제가 발생할까?

이유는 Resources.UnloadUnusedAsset()이 호출되는 시점에서 발생한다.

예로 Scene a가 로드되어 있고 Scene b를 로드해야 할 때

Scene a의 리소스를 제거하고 Scene b가 로드되는 것이 아니라

Scene b가 로드된 후에 Scene a의 리소스들이 제거된다는 점이다.

즉 중간에 Scene a와 b의 리소스들이 메모리에 같이 올라오는 순간이 존재한다.

그렇기에 중간에 로드하는 씬이 존재하는 것이다.

Scene a에서 Scene b를 로드할 때 Scene c (로드 화면만 띄어주는 메모리가 적은 간단한 씬)을 먼저 로드해서 scene a의 메모리를 먼저 내리고 Scene b를 로드하는 것!

즉 Scene a -> Scene c 로드 -> Scene a 메모리 내리고 -> Scene b 로드 -> Scene c의 메모리 내리고

요렇게 된다.

지금까지는 메모리를 로드하는 내용을 알아봤다.

메모리 관리를 위해 메모리를 로드했으면 당연히 Unload 또한 해주어야 한다.

AssetBundle.Unload – 번들 내의 모든 에셋을 언로드 한다.

언로드 함으로써 에셋 번들에 있느 오브젝트에 대한 메모리를 전부 해제한다.

만약 인자가 false로 둘 경우 에셋 번들 안에 있는 압축된 에셋의 파일 데이터는 언로드 되지만, 이 에셋 번들에 의해 로드된 실제 오브젝트는 그대로 유지된다. 당연히 이 에셋 번들에서 추가적으로 오브젝트를 로드할 수 없게 된다. true일 경우 이미 로드된 오브젝트도 포함되어 제거된다.

이는

에셋 번들 A가 있고 안에 m이라는 material이 있을 때 A를 로드 후 m을 로드하면 m은 A에서부터 파생되었다는 링크 정보를 가지게 된다. 즉 Unload를 true로 했다면 번들이 제거되면서 m도 같이 제거되는데, Unload를 false로 했다면 링크 정보가 끊기기 때문에 번들이 제거돼도 m은 메모리상에 올라가 있다.

여기서 다시 에셋 번들을 로드하고 m을 로드하면 A에서부터 로드된 m은 A에 연결되어 있지만 전에 제거하지 못했던 m은 다시 링크되지 않고 그대로 홀로 메모리에 남아있게 된다. [m이 메모리상에 2개가 있게 된다.]

-끗-

그닥 지금 시점에서까지 알 필요가 없는 내용들을 최대한 줄여가며 빼오다 보니 조금 애매하게 끝난 감이 있다.

위 내용은

+

+

구글링에서 찾은 여러 자료들을 바탕으로 작성하였습니다.

위 내용을 1시간 동안 정독하신다면 2시간의 youtube 영상의 내용과 구글링을 통해 나오는 내용들을 얻어 가시게 됩니다!

[얼 추 개 념 만]

반응형

[Unity3D] 에셋번들(AssetBundle) 빌드

반응형

에셋번들(AssetBundle)

출처 : https://docs.unity3d.com/kr/530/Manual/AssetBundlesIntro.html

에셋번들은 에셋(모델, 텍스처, 프리팹, 오디오 클립, 씬 등)의 묶음을 의미합니다.

에셋번들을 이용하면 프로그램 실행중에 동적으로 에셋을 로드할 수 있습니다.

에셋번들은 게임 등에서 콘텐츠를 다운로드 할 경우 유용하게 사용될 수 있습니다.

에셋번들(AssetBundle) 빌드

에셋번들은 두가지 방법으로 빌드할 수 있습니다.

스크립트로 에셋번들 빌드 에셋 번들 브라우저(Asset Bundle Browser)로 에셋번들 빌드

2번째 방법은 유니티에서 지원하는 에셋 번들 브라우저를 활용하면

코드를 사용하지 않고 간단하게 에셋번들을 만들 수 있습니다.

에셋 번들 브라우저를 활용하면 훨씬 편하고 쉽게 에셋번들을 빌드할 수 있지만

여기서는 스크립트로 에셋번들을 빌드하는 방법에 대해 설명하겠습니다.

머티리얼이 적용된 두 개의 게임오브젝트를 에셋번들로 만들겠습니다.

먼저 두 개의 게임오브젝트를 프리팹으로 만들어 줍니다.

Stone(좌), Brick(우) 게임오브젝트

프리팹을 만든 후 각각의 프리팹의 에셋번들 이름을 지정합니다.

에셋번들 이름을 모두 bundle로 지정하겠습니다.

프로젝트뷰 프리팹 선택 -> 인스펙터 에셋번들 드롭다운 클릭 -> New 클릭 -> 에셋번들 이름 입력

Stone 프리팹도 위와 같은 방법을 반복합니다.

※ 에셋번들 이름은 대문자로 입력해도 모두 소문자로 변경됩니다.

에셋번들 이름 입력 후 에셋번들을 빌드할 수 있는 스크립트를 작성합니다.

스크립트는 Editor 폴더에 위치시킵니다.

BuildBuildPipeline.BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetbundleOptions, BuildTarget targetPlatform) 인자 설명

string outputPath : 에셋번들 생성 경로

BuildAssetBundleOptions assetbundleOptions : 에셋번들 빌드 옵션

BuildTarget targetPlatform : 빌드 대상 플랫폼

스크립트를 작성하고 나면 Assets / Build AssetBundles 메뉴가 생성이 됩니다.

Build AssetBundles 메뉴를 클릭합니다.

Build AssetBundles 메뉴를 클릭하면 에셋번들 빌드 진행상태가 표시되면서 에셋번들을 빌드합니다.

에셋번들 빌드가 완료되면 Assets/AssetBundles 폴더에

bundle, bundle.manifest 파일이 생성된 것을 확인할 수 있습니다.

bundle : 에셋번들 파일

: 에셋번들 파일 bundle.manifest : 포함된 에셋, 종속성, 기타 정보를 나타내는 파일

bundle.manifest 파일을 열어보면 에셋번들에 포함된 에셋의 정보를 확인할 수 있습니다.

참고

반응형

유니티 Asset Bundle

https://docs.unity3d.com/kr/530/Manual/AssetBundlesIntro.html

https://docs.unity3d.com/kr/530/ScriptReference/AssetBundle.html

https://learn.unity.com/tutorial/introduction-to-asset-bundles

참고 사이트

—-

에셋 번들

에셋번들은 에셋(모델, 텍스처, 프리팹, 오디오 클립, 씬 등)의 묶음을 의미한다

에셋번들을 이용하면 프로그램 실행중에 동적으로 에셋을 로드할 수 있다

에셋번들은 게임 등에서 콘텐츠를 다운로드 할 경우 유용하게 사용될 수 있다

게임 할 때 추가 리소스를 다운 받는 것들이 에셋 번들임

유니티 새로운 프로젝트를 만들어서

sd 시티즌을 임포트 해준다.

캐릭터 프리팹 끌어다가 두고, 언팩해주기

리소스 – 프리팹 폴더 만들어서 넣어주고

하이라키지워준다.

회사에서는 로컬, 서버 환경 두 가지로 테스트를 많이한다.

웨폰도 똑같이 해준다.

그래서 캐릭터 에셋 번들, 웨폰 에셋 번들 이 두 가지를 만들 것이다.

new 눌러서 Characters 라고 적어준다.

무기도 똑같이 만들어준다.

새로운 스크립터 만들어주고

에셋번들(AssetBundle) 빌드

스크립트

에셋 번들 브라우저(Asset Bundle Browser)

(코드를 사용하지 않고 간단하게 에셋번들을 만들 수 있습니다.)

https://docs.unity3d.com/Manual/AssetBundles-Browser.html

— 이런 것도 있다

하지만 우리는 코드를 친다.

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class CreateAssetBundles { [MenuItem(“Assets/Build AssetBundles”)] static void BuildAllAssetBundles() { Debug.Log(“Assets/Build AssetBundles”); } }

유니티 에디터

위에 메뉴에 창이 생기고, 누르면 로그 뜨게한다.

using UnityEngine; using UnityEditor; using System.IO; public class CreateAssetBundles { [MenuItem(“Assets/Build AssetBundles”)] static void BuildAllAssetBundles() { string path = “Assets/AssetBundles”; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } BuildPipeline.BuildAssetBundles(path, BuildAssetBundleOptions.None, BuildTarget.Android); } }

스크립터는 꼭 에디터 폴더 들어가있어야함

생김

manifest 열어보면

어떤게 들어가있는지확인할 수 있다.

얘는 전체 어셋번들의 정보가 들어 가 있음

이런식으로

FTP나 드라이브에 올릴때는

.meta 형식을 제외한 것을 올리면 된다.

—-

먼저 로컬부터 테스트 해본다.

스크립터들 만들기

스크립터 작성

AssetManager – 싱글턴으로 사용

using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; public class AssetManager : MonoBehaviour { public static AssetManager instance; private void Awake() { AssetManager.instance = this; } public IEnumerator LoadFromMemoryAsynce(string path, System.Action callback) { //파일을 바이트 배열로 읽어서 비동기 방식로 로드한다. byte[] binary = File.ReadAllBytes(path); AssetBundleCreateRequest req = AssetBundle.LoadFromMemoryAsync(binary); yield return req; callback(req.assetBundle); } }

APP 에서 코루틴으로 소환

using System.Collections; using System.Collections.Generic; using UnityEngine; public class App : MonoBehaviour { //List bundle = new List(); //Dictionary dicBundles = new Dictionary(); // Start is called before the first frame update void Start() { StartCoroutine( AssetManager.instance.LoadFromMemoryAsynce(“Assets/AssetBundles/characters”, (bundle) => { Debug.LogFormat(“bundle: {0}”, bundle); var prefab = bundle.LoadAsset(“ch_01_01”); var model = Instantiate(prefab); }) ); } }

생성이 된다.

—–

https://github.com/Unity-Technologies/AssetBundles-Browser

다운 받아서

생성됨

——

서버에서 생성

학원 게시물 확인하기

Asset Bundle 에셋번들

Unity AssetBundle 생성/불러오기

Unity에서 AssetBundle을 사용하는데 많이 어려움을 겪었다. 나는 FBX를 AssetBundle로 저장해서 서버에 올린다음에 WebGL로 불러오는 작업을 했었다. 정말 어려웠다… 다 어려운방법들을 알려줘서.. 이해

opchacha.tistory.com

(Unity) 유니티 에셋번들

반응형

에셋이란 ?

코드에서 변경하는 자원들 (보통 리소스 폴더에 있는 것들 – 프리팹, 사운드, 텍스쳐 등등 )

에셋번들이란 ?

위에서 설명한 에셋들을 가공(?)해서 묶어놓은 것들

에셋번들을 사용한다란 ?

리소스 폴더가 아닌 따로 지정한 경로(서버도 될 수 있음)에 있는 에셋들을 가져와서 사용하는 방법 (보통 모바일게임에서 게임 다운로드 후 접속하면 추가 다운로드를 하는 경우가 있는데 서버에서 에셋들을 추가 다운로드를 하는 것)

에셋번들을 사용하는 이유 ?

여러가지 이유가 있는데 기본적으로는 앱의 용량을 줄이기 위해서고 추가적으로는 업데이트가 용이 하기 떄문(서버에 에셋번들을 올려 받게 해두면 업데이트시 어플을 재설치할 필요없이 서버에 있는 에셋만 바꾸면 된다.)

1. 에셋번들의 2가지 구성요소

해더 에셋번들의 식별자. 에셋번들이 압축된 상태인지 아닌지, 매니페스터 같은 에셋번들 정보 (매니페스트는 오브젝트의 이름이 키로 저장되어있는 검색 테이블) 세그먼트 테이블의 각 엔트리(entry)는 에셋번들의 데이터 세그먼트에서 해당 오브젝트의 위치를 찾을 수 있는 인덱스를 제공한다.

(대부분 균형 검색 트리 사용(balanced search tree), Windows 와 OSX계열 (IOS포함)플랫폼은 레드 블랙트리 사용)

*) 압축포맷

LZMA – 모든 에셋이 직렬화 한 다음, 전체 바이트 배열 압축, 전체 에셋번들 압축해제 필요

LZ4 – 에셋번들 내의 에셋을 개별적으로 압축, 개별오브젝트의 압축 해제 가능, 유니티 권장 압축방식

2. 에셋번들 압축하기

BuildAssetBundleOptions.None LZMA 압축포맷 사용

파일 크기는 가장 작다. 전체를 압축 해제 하기때문에 압축 해제에 시간이 조금 더 걸린다. BuildAssetBundleOptions.UncompressedAssetBundle 데이터가 전혀 압축되지 않음

파일 크기가 가장 크다. 비교적 압축해제 속도가 빠르다. BuildAssetBundleOptions.ChunkBasedCompression LZ4 압축 포맷 사용

파일 크기 보통, 압축 해제속도 보통이다. 부분적으로 압축을 해제 한다.

3. 에셋번들 로딩 하기

AssetBundle.LoadFromMemoryAsync 사용 권장 X

이렇게 불러온 에셋은 메모리에 총 3번 복사돠가 때문에 사용하지 말자 – 아주 오래된 방식 AssetBundle.LoadFromFile – 로컬영역에 있는 에셋을 불러올때 사용 권장 O

하드디스크나 로컬 저장소에서 비압축 에셋번들을 로딩하기 위해 설계됨

LZMA 압축방식의 압축해제를 지원하기 않음

LZMA 압축방식 일시 번들을 메모리에 로드하기 전에 압축이 해제됨

5.3 이하 버전에서는 사용 불가 5.4 이상 버전만 사용가능 WWW.LoadFromCacheOrDownload – 서버에 있는 에셋을 불러올때 5.2이하 버전에서 사용 O

원격 서버 및 로컬 저장소에서 오브젝트를 로드 할때 유용

에셋번들의 크기가 크면 메모리 오버해드가 일어남 (최대 몇 메가 바이트)

호출할 때 쓰레드가 생성되기 때문에 동시에 호출 조심 UnityWebRequest (AssetBundleDownloadHandler) – 서버에 있는 에셋을 불러올때 5.3이상 버전에서 사용 O

원격 서버 및 로컬 저장소에서 오브젝트를 로드 할때 유용

WWW.LoadFromCacheOrDownload 와 비슷한 방식으로 캐싱 지원

호출할 때 쓰레드가 무한히 생기는 것을 막기 위해서 최대 크기가 고정된 쓰레드 풀을 가지고있음

*) 권장 사항

1-1. 일반적으로 AssetBundle.LoadFromFile 사용 (하드디스크 로컬디스크)

1-2. 에셋번들을 다운로드 하거나 패치해야 하는 경우(원격서버, 로컬서버)에는

버전 5.3 이상 AssetBundleDownloadHandler 사용 / 5.2 이하 WWW.LoadFromCacheOrDownload 사용

2. (1-2) 방법을 사용했을때 적절하게 Dispose 메소드를 호출했는지 확인

3. 에셋번들의 크기가 5MB를 넘지 않도록하는게 좋다.

4. 동시의 2개 이상의 에셋번들을 다운로드 하지 않는게 좋다. (async await 를 사용하기도 한다.)

4. 에셋번들에서 에셋 로딩하기

방법 LoadAsset

-> 아래에 해당하지 않는 경우 사용

LoadAllAsset

-> 에셋번들내 대부분의 오브젝트들을 로드 할때만 사용

LoadAssetWithSubAssets

-> 애니메이션이나 스프라이트 아틀라스(다수의 스프라이트)를 사용하는 FBX 같은

여러 내장 오브젝트를 포함하는 복합에셋인 경우 사용 로드해야하는 에셋의 수가 많고 한번에 로드해야하는 숫자가 에셋번들이 가진 전체 콘텐츠의 2/3 미만인 경우 에셋번들을 여러개의 작은 번들로 분리하고 LoadAllAssets을 사용하는 것을 고려해 보는 것도 좋다. Async를 붙이는 비동기와 안 붙이는 동기와의 메모리 효율성 차이점이 5.2 버전 이후 부터는 사라졌다. 상황에 맞춰 동기 비동기 사용하면 된다.

에셋번들 의존성 부모에셋번들이 로드 될때 자식에셋번들을 자동으로 로드해주지않는다.

1번 에셋보다 2번 에셋을 먼저 로드 하라는 말이 아니라 (자동으로 해주지도 않는다.)

1번 에셋 A 오브젝트를 로드하기전에 명시적으로 B 머테리얼이 있는 2번 에셋을 로드해야된다. 에셋번들 매니패스트 에셋번들을 빌드 할때 유니티는 각 에셋번들의 의존성 정보를 포함하는 오브젝트를 직렬화한다.

AssetBundleManigaest.GetAllDependencies

-> 모든 의존성 정보 반환, 자식정보와 자식의 자식 등 정보 도 포함

-> 모든 의존성 정보 반환, 자식정보와 자식의 자식 등 정보 도 포함 AssetBundleManifest.GetDirectDependencise

-> 바로 하위의 자식정보만 반환 권장사항 사용자가 프로그램의 성능이 중요한 부분에 진입하기 전에 가능한한 많은 오브젝트를 로드 하는것이 좋다. (캐싱해 두는 것도 좋은 방법)

5. 설치 후 다운로드 (로드된 에셋 번들 관리)

AssetBundle이 LZMA 압축파일인 경우 향후 로딩속도를 높이기 위해서 LZ4로 압축 혹은 비압축상태로 캐시에 저장 된다.

캐시가 가득차면 가장 오랫동안 사용되지 않은 AssetBundle을 캐시에서 제거한다.

에셋번들을 로드하고 언로드 할 시기를 아는 것이 중요하다. (잘못 언로드 하면 오브젝트가 중복으로 저장되거나 텍스쳐가 누락되는 안좋은 상황이 발생한다.)

AssetBundle.Unload(bool value) 안에 true를 넣어 주는게 기본적으로 가비지가 생길 확률이 적다.(각 에셋종속성에 대해 잘 파악하고 있어야 한다.)

6. 중복

에셋 중복 서로 다른 에셋 번들에 할당되어 있는 두 개의 오브젝트 모두 공통 종속성 오브젝트에 대한 레퍼런스가 포함되어 있는 경우, 해당 종속성 오브젝트가 두 에셋 번들에 모두 복사된다. (이렇게 되면 총 에셋번들의 크기가 커진다.)

종속성을 공유하지 않도록 한다.(공유되는 종속성이 많은 프로젝트에서는 실용적이지 않다.)

모든 종송된 에셋이 자체적인 에셋번들에 내장되어 있어록 한다. (중복될 위험은 사라지지만 복잡성이 발생한다.)

에셋 번들에 할당되지 않은 종속성을 공유하지 않도록 보장하는 에디터 스크립트를 작성해서 모든 프로젝트에서 사용하는 것이 좋다. 스프라이트 아틀라스 중복 동일한 스프라이트 아틀라스 안에 사용되는 스프라이트 들은 모두 동일한 에셋 번들에 할당해야한다.

7. 패치 시스템

패치 시스템에서 필요한 정보 현재 다운로드된 에셋번들과 각각의 버전정보 리스트

서버에 있는 에셋번들과 각각의 버전 정보 리스트 순서 서버 측 에셋번들 리스트를 다운받고 로컬에 있는 에셋번들 리스트를 비교한다.

버전정보가 변경된 에셋번들은 로컬에서 지운다.

로컬영역에 없는 에셋번들을 다운 받는다. 방법 에셋번들 파일리스트에 JSON 같은 표준데이터 포맷을 사용하고 체크섬 컴퓨팅에는 MD5같은 C#을 사용한다.

8. 캐싱

UnityWebRequest API를 통해 다운로드 된 AssetBundle을 캐시하는데 사용 가능한 캐싱 시스템이 있다. (AssetBundle 내부 X, AssetBundle 시스템으로 생성 X) 마지막 번호를 계속 추척하며 번호가 일치하지 않거나 캐시된 AssetBundle 이 없으면 새로 다운로드 한다. 캐싱 시스템은 AssetBundle의 파일 이름으로만 식별되며 URL로 구분되지 않는다. (여러장소에 저장할 수 있다, 이름이 같으면 같은 AssetBundle로 인식한다.) AssetBundleManifest.GetAssetBundleHash() 사용은 추천하지 않는다. – 추정값을 제공할 뿐 실제 hash 연산을 하지 않는다.

9. 사용 방법

UnityWebRequest.GetAssetBundle(String BundleURL, int version) 함수를 이용하면 이름 그대로 캐시로부터 로드 or 다운로드 로드 = 프로젝트 내부에 url의 에셋번들과 이름이 같고 버젼이 같은 에셋번들이 존재

다운로드 = 존재 하지 않으면 URL로 이동하여 에셋번들을 다운로드하여 캐싱 한번 더 UnityWebRequest.GetAssetBundle(String BundleURL, int version) 호출하여 캐싱된 에셋을 로드 LoadAssetSync(비동기)로 로드하면 여러 에셋을 동시에 로드할 수 있습니다.

ex) 예제

UnityWebRequest request = UnityWebRequest.GetAssetBundle(URL,0)

AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);

bundle.LoadAsset(“Cube”);

* 웹서버에 저장해둔 에셋번들의 링크를 BundleURL에 넣기

10. 쉽게 빌드 하는 방법인 Assetbundle Browser

window -> Assetbundle Browser 를 킨다. Configure 탭을 눌러 사용할 에셋들을 드래그로 올린다. Build 탭을 눌러 Build Target을 플래폼에 맞추고 (현재 나의 사용 플래폼은 Standalone Windows 64)

아래 Ouput Path 에 경로를 지정해준다. (현재 나의 경로는 Assets/_AssetBundle) Assets 폴더에 _AssetBundle 폴더가 없을 경우 알아서 생성된다. 아래 Build 버튼을 눌러준다. (경로에 파일을 생성한다.) 사용방법은 Configure로 돌아와서 오른쪽에 보면 [Asset] , [Bundle], [Size] 가 보이는데 이 string 정보를 토대로 스크립트에서 아래와 같이 적용하면 된다.

AssetBundle bundle = AssetBundle.LoadFromFileAsync(에셋번들 경로 + [Bundle])

//ex)에셋번들 경로 (Path.Combine(Application.dataPath, “_AssetBundle”, [Bundle]))

var asset = bundle.LoadAsset< 불러올 타입 ex) GameObject, Sprite 등 >([[Asset]]); 주의 사항으로는 AssetBundle.LoadFrodmFileAsync 이게 비동기로 이뤄지기 때문에 async await 를 사용하는걸 추천한다. (Async await Task 공부해보자)

스크립트를 제외한 씬, 프리팹, 텍스쳐 등을 수정했다면 (스크립트도 public 연결등 무언가 바뀌었다면) AssetBundle Browser에 들어가서 다시 Build 버튼을 눌러줘야 바뀐정보다 저장이 된다.

참고 링크

유니티 메뉴얼 링크

https://docs.unity3d.com/kr/2018.2/Manual/AssetBundles-Browser.html

반응형

열린강좌<온라인교육< 에듀코카

동영상(나레이션): 김현우

유니티가 멀티 플랫폼을 지원하는 게임 엔진이기 때문에 이런 멀티 플랫폼의 기능을 이용해서 다양한 플랫폼에 디플로이 시키기 위해서는 리소스도 맞춰서 제공이 돼야 되는 부분이 있는데요. 이런 것들하고 관련해서 유니티에서 제공하는 기능 중에 하나가 에셋 번들인데 상대적으로 유니티의 기본적인 툴을 가지고 제작을 하는 것이 아니라 직접 용도에 맞게 상대적으로 어렵게 생각하시는 분들이 많은데요. 이번에는 유니티에서 제공하는 에셋 번들을 어떻게 사용하고 에셋 번들을 활용할 때 관련해서 팁이라던가 사용방법에 대해서 살펴보도록 하겠습니다.

(자막)

김현우

경력: G9 이사

네시삼십삼분 이사

CCR RF-Online 개발실 실장

한국 콘텐츠 진흥원 게임아카데미 외래 교수

개발: haderX5“Shader System Integration:

Nebula2 and 3DS Max“

(자막)

유니티(Unity) 3D 5

-에셋 번들(Asset Bundle)

질문. 에셋 번들(Asset Bundle)은 무엇인가요?(1:16)

답변. 유니티에서는 여러 가지형태의 리소스를 제공하고 있는데요. 실제로 게임 제작할 때 사용하는 리소스들이 굉장히 다양합니다. 예를 들어서 텍스쳐라던가 아니면 모델데이터라던가 유니티에서 텍스처나, 모델 데이터, 우리가 필요할 때 쉽게 효율적으로 사용하기 위해서 Prefab이라는 것도 제공하는데요, 이런 것들까지 혹은 에셋이라고도 부르는 스크립트 오브젝트 형태에 있어서도 존재하는데요. 이런 사용자가 필요로 하는 다양한 리소스들을 실제로 사용하다 보면 양이 많아지고 아니면 조금 더 효과적으로 사용할 수 있는 방법 그리고 서비스할 때 보면 이런 소스들을 별개의 형태로 묶어서 제공을 한다든가 사용을 해야 되는 경우가 있게 되는데요. 그러한 사용 용도를 위해서 유니티에서 개별적인 형태의 리소스 대신 이런 것들 외에 에셋 번들이라고 불리는 별도의 형태의 리소스를 제공하고 있습니다.

그림에서 보게 되면 프로젝트 뷰에 보이는 텍스쳐라던가 모델 데이터, Prefab들 혹은 그 외의 리소스들 번들이라는 이름이 의미하는바와 같이 이러한 것들을 유니티의 Build Pipeline에 빌드 에셋 번들이라는 이런 형태의 API를 사용해서 하나의 에셋 번들로 묶어서 새로운 형태의 에셋 번들이라고 얘기하는 리소스를 만들 수 있는데요. 이런 프로젝트 뷰에 데이터를 새로운 에셋 번들 형태로 만드는 것들 이러한 과정을 통해서 나온 것들을 우리가 에셋 번들이라고 얘기하고 있습니다. 이 에셋 번들은 기본적으로 유니티 에디터 내에서 유니티의 툴을 이용해서 제작을 하는 것은 아니고요. 사용하는 게임의 리소스들이 워낙에 다양하기 때문에 그러한 것들을 용도에 맞게 그리고 리소스의 종류라던가 아니면 사용하는 시점에 맞게 사용자가 알아서 직접 스크립트 에디터를 통해서 번들을 제작해줘야 합니다.

질문. 에셋 번들은 왜 필요한가요?(3:42)

답변. 에셋 번들 같은 경우에는 기존의 에셋들, 리소스하고 완전히 별개의 리소스는 아니고요. 기존에 있던 리소스들을 번들형태로 묶어서 새로운 리소스를 만든 형태이기 때문에 사용방법이라던가 용도는 기존에 에셋들이 게임에서 사용되는 방법과는 다르진 않지만 이러한 에셋 번들을 왜 만드는지에 대해서 고민할 필요가 있는데요. 실제로 첫 번째 용도에 대해서 살펴보면 에셋 번들을 이용하게 되면 유니티에서는 스트리밍 방식으로 리소스들을 네트워크라던가 다른 곳에서 다운로딩할 수 있는 방법들을 제공하게 되는데요. 개별적인 리소스들은 이 스트리밍 방식을 사용 할 수 없고 에셋 번들로 만들 경우에는 유니티 내부에서 만들어진 에셋 번들을 스트리밍 방식으로 바로 가져와서 필요할 때 사용할 수 있습니다. 필요할 때 사용을 할 수 있다는 이 부분이 중요한데요. 예를 들어서 유니티를 가지고 웹 브라우저에서 돌아가는 그러한 형태의 게임을 개발한다고 했을 때 페이스북 게임이라던가 이런 것들이 하나의 예라고 할 수 있겠죠. 이러한 게임에서는 사용자입장에서 게임을 할 때 내가 브라우저를 띄운 다음에 원하는 시점에서 바로 게임을 하는 그런 형태가 굉장히 중요한데 만약에 인스톨용량이 많아서 인스톨 시간까지 굉장히 많은 시간이 소요된다고 한다면 사용자 입장에서는 게임을 할 때 대기를 해야 되기 때문에 굉장히 많은 시간을 대기할 수 있는데요. 이렇게 에셋 번들을 사용해서 필요한 데이터들을 사용하는 시점별로 구분해서 그때 사용하는 시점에서만 우리가 다운로드 해서 게임을 플레이 할 수 있도록 만들어서 준다는 얘기죠. 예를 들어서 사용자 입장에서는 인스톨 용량이 굉장히 줄어들기 때문에 로딩 한다든가 일련의 과정을 통해서 바로 게임을 시작할 수 있고요. 첫 번째 챕터로 들어왔을 때는 스테이지에 해당되는 게임의 에셋 번들만 다운받아서 첫 번째 스테이지를 진행 하다가 만약에 두 번째 스테이지로 간다고 하면 두 번째 스테이지에 에셋 번들만 다운받아서 게임을 진행하게 된다면 게임을 하는 사용자 입장에서는 인스톨부터 게임을 하기까지의 시간을 줄 일수있기때문에 훨씬 더 쾌적한 환경에서 게임을 할 수 있다는 장점이 있습니다. 큰 용량을 한 번에 게임의 어떤 콘텐츠를 나눠서 쪼갠 다음에 필요한 시점에서만 스트리밍 방식으로 게임을 진행할 수 있다는 것이 에셋 번들의 첫 번째 용도 중에 하나가 되겠고요. 이렇게 스트리밍 방식으로만 이렇게 에셋 번들을 사용하는 건 아니고요. 이렇게 에셋번들을 사용하다가 패치가 필요한 경우에 다운받아놨지만 다운받은 첫 번째 콘텐츠가 새로운 콘텐츠로 업데이트 된다던가 내용이 일부 변경된 경우에도 전체를 다운받지 않고 변경된 부분만 패치를 한다고 하면 이 패치한 것 같은 경우에도 에셋 번들을 이용해서 필요한 부분만 에셋 번들을 바꿔서 진행 할 수 있기 때문에 에셋 번들을 사용하는 경우에는 패치 경우에도 훨씬 더 유리하게 작업할 수 있겠습니다. 그리고 에셋 번들은 스트리밍 방식으로 다운받을 수 있는 특징 외에 도요. 에셋 번들 자체를 비동기 방식을 로딩할 수 있습니다. 유니티에서는 모든 데이터를 비동기방식으로 로딩하는게 가능한건 아니고요. 특정한 몇몇 형태의 리소스에 대해서만 비동기 방식으로 로딩이 가능하도록 지원하고 있습니다. 그런 형태 중에 하나는 씬을 로딩할 때 씬 데이터가 비동기로 로딩할수있는게 있고요. 그다음으로는 에셋 번들을 비동기로 로딩할수있도록 지원하고 있습니다. 비동기로 로딩을 한다는 얘기는요. 실제 우리가 게임의 타이틀화면이라던가 메뉴를 보고 있는 시점에서도 백그라운드에서도 로딩이 가능하다는 것인데요. 이런 특징 같은 경우에는 모바일 게임들, 유니티를 가지고 많이 사용을 하시는 경우가 모바일 게임제작에 많이 사용하고 있는데요. 모바일 게임 같은 경우에 사용자 입장에서는 굉장히 빠르게 게임이 실행되는 게 중요한대요. 게임의 실행을 위해서 데이터가 많은 경우에 순차적으로 데이터를 매번 로딩을 해야 하는 경우에는 메뉴를 보고 그다음에 메뉴에서 첫 번째 스테이지 들어갈 때 첫 번째 스테이지 혹은 두 번째 스테이지의 에셋들, 콘텐츠들을 다시 로딩하고 로딩 하는 시간동안 다시 기다렸다가 다시 로딩하고 이런 일련의 과정들이 필요하게 되는데요. 비동기로 만약에 백그라운드에서 로딩이 가능하다고 하면 실제로 사용자가 게임의 타이틀화면을 보고있는 시점이라던가 아니면 메뉴를 보고 있는 시점에서도 사용자가 게임에 필요한 데이터들을 미리 백그라운드에서 로딩을 해둬서 실제로 사용자가 스테이지에 진입해서 플레이 할 시점에서는 별도의 다른 로딩시간 없이 빠르게 게임을 플레이 할 수가 있기 때문에 이런 비동기 로딩에도 에셋 번들을 이용해서 우리가 만드는 게임에 적용을 하게 되면 사용자한테 게임 플레이가 진행할 때는 훨씬 더 효율적으로 편하게 게임을 진행시킬 수 있는 방법 중에 하나가 되겠습니다.

질문. 에셋 번들은 어떻게 만들고 사용하면 되나요?(9:58)

답변. 에셋 번들 같은 경우에는 유니티에서 다른 리소스라던가 오브젝트 편집과는 다르게 유니티 자체에 에셋 번들을 만들 수 있는 툴이라던가 기능은 없고 실제로는 스크립트를 통해서 게임에 사용할 리소스들을 직접 에셋 번들을 빌드해서 제작을 해줘야 됩니다. 즉 에셋 번들을 만들기 위한 스크립트 명령어들은 유니티에서 제공하고 있지만 실제로 작업은 유니티에서 직접 제작을 툴을 만들어서 작업을 진행해줘야합니다. 그러면 그 방법에 대해서 살펴보도록 하겠습니다. 실제로 유니티에서 에셋 번들은 스크립트를 통해서 간단한 몇 개의 에셋 번들만을 제작을 하는 경우에 스크립트를 통해서 간단하게 작업을 하셔도 상관이 없지만 실제로 에셋 번들은 사용이라던가 아니면 개수가 많은 게 일반적이기 때문에 개발을 해가면서 에셋 번들에 리스트가 종류가 많아진다 할 경우에 굉장히 번거롭게 될 수 있기 때문에 가장 간단하게는 그런 것들을 해결하기 위해서 툴을 하나 직접 만드셔서 작업을 하는 동안 에셋 번들이 필요할 때마다 툴을 통해서 에셋 번들을 제작을 하는 것이 가장 좋습니다. 툴 같은 경우에도 제작 방법이 여러 가지가 있지만 간단하게 어떤 형태로 에셋 번들의 툴을 제작하면 좋은지 살펴보도록 하겠습니다. 기본적으로는 에셋 번들에 포함할 프리팹들을 리스트들을 확보한 다음에 여기있는것들은 게임의 텍스쳐가 될 수도 있고 모델 데이터들 여러 가지 것들이 올 수 있는데요. 이러한 것들을 포함할 에셋 번들을 하나 지정하도록 하겠습니다. 이것은 현재 사용할 에셋 번들 프리팹 리스트라고 이름을 지은 다음에도 여기에 추가가 될 프리팹들은 하나의 에셋 번들에 담겨질 수 있도록 작업을 하도록 하겠습니다. 이 에셋 번들 같은 경우에는 플랫폼 별로 별도의 에셋 번들이 필요하기 때문에 예를 들어서 스탠드얼론형의 OSX형의 피시라던가 맥OS에서 돌아가는 에셋 번들이 다르고요. 또 아이폰용 에셋 번들, 아이OS용 별도로 아이오에스용으로 작업을 해주셔야 되고 아이OS용으로 작업한 에셋 번들은 안드로이드 디바이스에서는 사용할 수 없습니다. 이렇게 플랫폼이 여러 개로 나눠지는 경우에는 각각의 플랫폼별로 에셋 번들을 별도로 만들어야 하는데 종류는 같지만 별도의 플랫폼 별로 에셋 번들을 만들게 되면 더 번거롭기 때문에 툴 같은 경우에도 플랫폼별로 구분을 해서 에셋 번들, 현재 이 유니티의 빌드셋팅에서 설정된 플랫폼에 맞게 바로바로 자동으로 에셋 번들을 만들 수 있도록 툴을 작성을 해주는 것이 좋겠습니다. 이렇게 에셋 번들 프리팹들을 에셋 번들화 하기 위한 리스트를 만든 다음에 여기에 보이는 것도 툴의 하나의 인터페이스가 되겠는데요. 이렇게 해서 필요한 프리팹들을 등록해주게 되면 현재 세팅이 되어있는 플랫폼에 맞게 에셋 번들이 자동으로 제작이 되어지게됩니다. 지금 플렛폼은 디폴트 스텐드얼론형의 OSX에 맞게 세팅이 되어있기 때문에 이렇게 빌드해서 에셋 번들을 만들게 될 때는 스탠드얼론 OSX에 맞는 생성되는 에셋 번들 이 하나 생성되게 됩니다. 이런 생성되는 에셋 번들 같은 경우에도 실제 생성되는 폴더 같은 것들을 따로 지정을 할 수 있도록 툴에서 지정을 했어요. 디렉터리라던가 이런데 생성되는 에셋 번들은 따로 관리를 해주시는 것이 좋습니다. 지금은 프로젝트 파일에 해당되는 곳에 에셋 번들이 빌드가 되도록 툴에 설정이 되어있는데요. 이 경우에는 번들이라는 폴더 안에 플랫폼 리스트에 플랫폼이름 디폴트로 확장자가 유니티 3D라는 확장자를 포함한 형태의 에셋 번들이 하나 생성이 되게 됩니다. 자 이렇게 에셋번들 툴을 이런 형태로 만들어 놓게 되면 지금 추가한 프리팹이외에도 별도의 다른 프리팹들 리스트들이 개발을 하면서 목록이 늘어난 경우에도 이런 형태로 목록을 새로 추가해서 프리팹들만 추가하면 되기 때문에 일일이 스크립트 늘어날 때마다 프리팹목록들이 늘어날 때마다 스크립트에서 수정해서 작업할 필요 없이 간단하게 수정할 수 있습니다. 한 가지 팁을 얘기하자면 에셋 번들이 만들 때 이 에셋 번들이 네트워크를 통해서 이동을 해야 하는 경우에는 네트워크 속도를 생각해서 파일의 크기가 작으면 훨씬 더 빠르게 전송이 가능하기 때문에 압축해서 에셋 번들을 만드는 것이 좋은데 이런 경우에는 이 컴플렉시블 옵션을 넣어서 기본적으로 에셋 번들이 만들어질 때 LZMA압축을 사용해서 파일의 용량을 작게 해주는 것이 좋지만 그러한 형태가 아니고 로컬에서 바로 로딩 되는 형태의 에셋 같은 경우에는 이러한 압축 옵션을 끈 상태에서 에셋 번들을 만들게 되면 파일 크기는 압축을 했을 때보다 다소 크겠지만 실제 로딩하면서 압축을 해지한다던가 이런 경우가 없기 때문에 훨씬 더 빠르게 로딩할 수 있습니다. 이 경우에 압축 옵션 같은 경우에는 에셋 번들을 만들 때 기본적으로는 압축을 하도록 에셋 번들 명령어에 설정이 되어있기 때문에 이 부분 같은 경우에는 압축이 필요 없는 부분은 압축을 하지 않도록 옵션을 설정해줘야됩니다. 지금까지 살펴본 것과 같이 여러 형태의 적합한 툴을 만드는 방법은 원하는 형태로 다양하게 나올 수 있지만 이러한 기능들 에셋 번들의 특징을 잘 기억해두었다가 원하는 형태로 에셋 번들 툴을 만들어서 툴 방식으로 에셋 번들을 작업을 하시는 것이 에셋 번들을 사용할 때는 가장 효과적인, 효율적인 방법이라고 할 수 있겠습니다. 에셋 번들 같은 경우에는 유니티에서 리소스데이터를 관리하는 방법 중에 조금 툴화 되어있지 않아서 어떻게 보면 여기저기 스크립트도 만들어 줘야 되고 본인이 직접 작성을 해야 하는 부분이기 때문에 처음에는 사용하기 까다로운 부분이 있지만 유니티의 리소스 형태 중에서도 비동기로 로딩을 할 수 있다는 점하고 또 네트워크를 통해서 에셋 번들 리스트를 가져올 수 있는 방법이기 때문에요. 예를 들면 안드로이드 같은 경우에는 실제로 제작한 결과물이 오십 메가가 넘는 경우에는 별도의 방법을 통해서 분할해서 apk로 올린다던가 이런 방법을 사용해야하는데 만약에 에셋 번들, 리소스의 많은 부분을 에셋 번들로 외부에 저장해놓고 필요한 부분만 오십 메가 이하로 줄여서 나머지 데이터는 그때그때 필요할 때 네트워크를 통해서 다운을 받을 수 있는 부분이 있기 때문에 실제로 활용하기에 따라서는 매우 편리하게 리소스 관리를 할 수 있는 부분이 되겠습니다. 그러한 에셋 번들의 특징을 기억해두시고 실제로 제작할 때도 툴을 만들어서 제작하게 되면 크게 복잡하지 않고 에셋 번들을 관리하고 제작해서 게임에 적용할 수 있겠습니다.

키워드에 대한 정보 유니티 에셋 번들

다음은 Bing에서 유니티 에셋 번들 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 초보자를 위한 에셋번들 – 개념 설명 및 기본 구현

  • 유니티
  • Unity
  • 에셋번들
  • assetbundle

초보자를 #위한 #에셋번들 #- #개념 #설명 #및 #기본 #구현


YouTube에서 유니티 에셋 번들 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 초보자를 위한 에셋번들 – 개념 설명 및 기본 구현 | 유니티 에셋 번들, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  브로콜리 삶는 시간 | 브로콜리 삶지 마세요! [영양분 파괴없이 알차게 먹는 방법] 세척이 까다로운 브로콜리 깨끗하게 세척하는 법! Steamed Broccoli 모든 답변

Leave a Comment