본문 바로가기
공허의 유산/표현의 자유

[Unity3d/AssetBundle] 02. Asset Bundle 사용하기

by 바른생활머시마 2023. 3. 19.
728x90
반응형

앞에서 Asset Bundle을 만들어 봤습니다.

https://learn-and-give.tistory.com/92

 

[Unity3d/AssetBundle] 01. Asset Bundle 만들기

Unity3d로 앱을 만들 때 품질이 좋은 에셋을 많이 쓰게 되면 용량이 점점 증가 합니다. 이것은 앱 용량의 증가로 이어져 앱을 다운로드 받을 때 시간이 오래 걸리고 앱을 설치하는데 인내심을 요구

learn-and-give.tistory.com

이제 이것을 사용하는 방법을 알아보겠습니다.

모든 방법을 다 알아보는 것은 아니고 간단히 사용하는 몇 가지 방법만 알아보겠습니다. (아는게 그 정도라서~^^)

여기 소개하는 방법은 본격적으로 최적화 된 방법이라기 보다, 제가 필요해서 필요한 목적으로 쓰기에 적당히 되는 방법들이었어요. 이것을 실마리로 해서 좀 더 좋은 방법을 찾아보셔도 좋겠네요.

 

 

Asset Bundle을 사용하는 프로젝트 만들기

앞에서 소개 한 것 처럼, 어떤 프로젝트에서 사용하는 Asset들의 배포 방법을 달리 하기 위해 Asset Bundle을 이용하여 별도로 분리를 하는 경우라면, Asset Bundle을 빌드하는 프로젝트나 사용하는 프로젝트가 같을 가능성이 높을 것 같습니다. 그런데, 경우에 따라서는 Asset Bundle이 만들어진 프로젝트와 전혀 다른 프로젝트에서 사용 할 경우도 있고, Asset Bundle은 그 특성상 의존성이 있는 것들도 함께 빌드를 하기 때문에 그런 경우에도 잘 활용 할 수 있기 때문에, 겸사겸사 새로운 프로젝트를 만들고 Asset Bundle을 사용하는 방법으로 해보겠습니다.

 

먼저 프로젝트를 만듭니다.

 Asset Bundle을 만들 때는 MakeAssetBundle이라고 했으니, UsingAssetBundle이라는 이름으로 만들어 보겠습니다.

 

 

Sample project

Unity에서 오브젝트를 사용하는 방법이야 한 두가지가 아니기 때문에 사용하는 좋은 방법까지 여기서 고민하는 것은 의미가 없을 것 같아서 가장 간단한 형태로 만들어 보고자 합니다. 즉, 프로그램이 실행되면 Asset Bundle을 읽어 3개의 오브젝트를 만들어 보겠습니다.

 

에셋 번들을 읽는 방법에 대한 내용은 아래 유니티 매뉴얼에 나와 있습니다.

https://docs.unity3d.com/kr/current/Manual/AssetBundles-Native.html

 

에셋 번들의 전문적인 활용 - Unity 매뉴얼

에셋 번들을 로드하는 데 사용할 수 있는 네 가지 API가 있습니다. 각 API의 동작은 번들이 로드되는 플랫폼과 에셋 번들을 만들 때 사용된 압축 방법(비압축, LZMA, LZ4)에 따라 다릅니다.

docs.unity3d.com

 

 

Script 추가

 가장 간단한 형태로 만들기 위해서, 이미 존재하는 오브젝트인 MainCamera에 스크립트를 추가하고, 그 스크립트에서 Asset Bundle을 읽도록 하겠습니다.

 

 아래와 같이 Scripts 폴더를 만들고(이건 필수가 아닙니다. 그냥...널리 사용되는 매너...), 거기에 C# 스크립트를 하나 만든 후, Main Camera에 Drag & Drop을 해서 추가합니다.

 

이제 C# 스크립트를 더블클릭하여 편집기에서 코드를 작성합니다. 코드는 위 참고 매뉴얼의 코드를 복사해서 사용합니다.

아래 코드는 StreamingAssets이라는 폴더 내에 있는 myassetbundle이라는 Asset Bundle을 불러와서 MyObject라는 오브젝트를 객체화 시키는 코드입니다.

using UnityEngine;
using System.Collections;
using System.IO;

public class LoadFromFileExample : MonoBehaviour
{
    void Start()
    {
        var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "myassetBundle"));
        if (myLoadedAssetBundle == null)
        {
            Debug.Log("Failed to load AssetBundle!");
            return;
        }

        var prefab = myLoadedAssetBundle.LoadAsset<GameObject>("MyObject");
        Instantiate(prefab);

        myLoadedAssetBundle.Unload(false);
    }
}

저기서 몇 가지 수정을 하면 되는데요,

먼저 Asset Bundle의 위치에 해당하는 폴더를 만들어줘야 하는데, Assets 폴더 아래에 'Streamingassets'라는 폴더를 만들어 주고, 여기에 앞에서 만들었던 Asset Bundle 파일을 넣어줍니다.

 

코드는 아래와 같이 수정합니다.

읽을 Asset Bundle의 이름을 제가 만들었던 myasset으로 변경하고, 생성할 오브젝트의 이름을 Cube, Sphere, Capsule로, Asset Bundle을 만들 때 사용한 이름을 넣어서 객체를 생성합니다. 그리고, 각각의 X좌표를 다르게 줘서 함께 확인 할 수 있도록 해줍니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;

public class LoadAssetBundles : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "myasset"));
        if (myLoadedAssetBundle == null)
        {
            Debug.Log("Failed to load AssetBundle!");
            return;
        }

        var cube = myLoadedAssetBundle.LoadAsset<GameObject>("Cube");
        cube.transform.position = new Vector3(3,0,0);
        Instantiate(cube);

        var sphere = myLoadedAssetBundle.LoadAsset<GameObject>("Sphere");
        sphere.transform.position = new Vector3(0,0,0);
        Instantiate(sphere);

        var capsule = myLoadedAssetBundle.LoadAsset<GameObject>("capsule");
        capsule.transform.position = new Vector3(-3,0,0);
        Instantiate(capsule);

        myLoadedAssetBundle.Unload(false);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
반응형

 

결과 확인

이제 이 상태에서 실행을 하면, 아래와 같이 다른 프로젝트에서 만들었던 오브젝트가 그 모습 그대로 이 프로젝트에 생성되어 있습니다. 왼쪽의 트리를 보면 이름 뒤에 Clone이 붙어 있는 객체로 생성 된 것을 알 수 있습니다.

 

이렇게 Asset Bundle을 사용하면, 오브젝트 데이터를 프로젝트와 분리하여 별도로 배포 할 수 있으며, 다른 프로젝트에도 활용 할 수 있도록 배포가 가능합니다. 활용 할 수 있는 곳은 참 많죠.

 

 이제 고려 해 봐야 할 것은, 로컬에 있는 에셋 번들이 아니라 웹에 있는 Asset Bundle을 읽는 경우, 로직을 포함한 Asset Bundle을 사용하는 방법을 살펴 보도록 하겠습니다.

 

https://youtu.be/OZh9RXntMR0

 

 

웹에 있는 Asset Bundle 사용하는 방법을 먼저 해보겠습니다.

https://learn-and-give.tistory.com/98

 

[Unity3d/AssetBundle] 03. 온라인 상에 있는 Asset Bundle 다운로드하여 사용하기

앞에서 로컬에 있는 Asset Bundle file을 읽어서 사용하는 방법을 알아보았습니다. https://learn-and-give.tistory.com/93 [Unity3d/AssetBundle] 02. Asset Bundle 사용하기 앞에서 Asset Bundle을 만들어 봤습니다. https://lear

learn-and-give.tistory.com

 

728x90
반응형

댓글