(Unity) AssetBundle

고현서·2022년 12월 8일
1
post-thumbnail

AssetBundle

Unity AssetBundle에 관해서 알아보자
AssetBundle은 Asset들을 묶어서 Bundle형식으로 만든 것이다.
보통은 메모리 관리할때 활용된다.
이는 내가 모바일 빌드를 할 때, 유용하게 활용하였다.
Resources에서 처럼 Load해서 자산을 가져와서 Instantiate만 하면 된다.

만드는 방법은 코드로 Unity Editor을 만들어서 Editor 상에서 Build Asset Bundle을 하는 것이다.
아래의 코드는 Unity 상단 Menu에서 Build AssetBundles 버튼을 누를 시 특정 경로에 에셋번들로 만들어 주는 코드이다.

AssetBundle Editor Code

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

public class CreateAssetBundles
{
    [MenuItem("Assets/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
        string assetBundleDirectory = "Assets/StreamingAssets/AssetBundles";
        if (!Directory.Exists(Application.streamingAssetsPath))
        {
            Directory.CreateDirectory(assetBundleDirectory);
        }
#if UNITY_STANDALONE
                BuildPipeline.BuildAssetBundles(
                      assetBundleDirectory,
                      BuildAssetBundleOptions.None,
                     EditorUserBuildSettings.activeBuildTarget);
#elif UNITY_ANDROID
                BuildPipeline.BuildAssetBundles(
                        assetBundleDirectory,
                        BuildAssetBundleOptions.None,
                        BuildTarget.Android);
#elif UNITY_IOS
                BuildPipeline.BuildAssetBundles(
                        assetBundleDirectory,
                        BuildAssetBundleOptions.None,
                        BuildTarget.iOS);
#endif
    }
}

여기서 전처리문에서 STANDALONE, ANDROID, UNITY는 각 Device마다 Build Target이 다르기 때문에 전처리문으로 구분하여 Device에 맞게 Build가 됩니다.

1. 파일 안에 Asset 넣기

2. Asset에 AssetBundle에 해당 폴더 이름 넣기


이렇게 하여 해당 landcustombundle 파일 안에 에셋들을 묶어낸다.

3. Build AssetBundles

Unity 상단 Menu Bar에 Build AssetBundles를 누르면 Asset들이 Bundle 형태로 Build된다.

사용부

특정 경로의 AssetBundle을 Load합니다.
단, 여기서 LoadFromFile을 했는데, 다른 곳에서도 LoadFromFile을 한다면 reload했다는 오류가 뜹니다.
그래서 다시 한번 Load하고 싶으면 unload하고 다시 LoadFromFile하면 됩니다.

//커스텀 관련 에셋번들
DataTemporary.assetBundleCustom = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/AssetBundles/landcustombundle");
DataTemporary.assetBundleImg = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/AssetBundles/landcustomimg");

GameObject resource = DataTemporary.assetBundleCustom.LoadAsset<GameObject>(fileName.Split("LandCustom/" + selectCatName + "\\")[1].Split('.')[0]);
GameObject prefab = Instantiate(resource);

+추가

만약에 AssetBundle 안에 정보가 보고 싶다면,
Build AssetBundle 시 같이 생성된 manifest 파일을 보면 된다.

아래와 같이 AssetBundle의 정보들이 보여지니,
안의 정보를 참조하고 싶으면 manifest를 활용하면 된다.

코드에서도 해당 AssetBundle의 manifest를 가져올 수 있는 코드도 있으니 참고하면 잘 활용하면 좋을 것 같다!

ManifestFileVersion: 0
CRC: 4023493198
Hashes:
  AssetFileHash:
    serializedVersion: 2
    Hash: 1f4abd4aada7fe6652d4098237876e5f
  TypeTreeHash:
    serializedVersion: 2
    Hash: 1938dfdd4572fce16873f34f5b0ff447
HashAppended: 0
ClassTypes:
- Class: 1
  Script: {instanceID: 0}
- Class: 4
  Script: {instanceID: 0}
- Class: 21
  Script: {instanceID: 0}
- Class: 23
  Script: {instanceID: 0}
- Class: 28
  Script: {instanceID: 0}
- Class: 33
  Script: {instanceID: 0}
- Class: 43
  Script: {instanceID: 0}
- Class: 48
  Script: {instanceID: 0}
- Class: 64
  Script: {instanceID: 0}
- Class: 65
  Script: {instanceID: 0}
- Class: 74
  Script: {instanceID: 0}
- Class: 91
  Script: {instanceID: 0}
- Class: 95
  Script: {instanceID: 0}
- Class: 114
  Script: {fileID: 11500000, guid: 5fea29bb7c508c244a1f805a5fd3fc4d, type: 3}
- Class: 115
  Script: {instanceID: 0}
- Class: 135
  Script: {instanceID: 0}
- Class: 136
  Script: {instanceID: 0}
- Class: 205
  Script: {instanceID: 0}
SerializeReferenceClassIdentifiers: []
Assets:
- Assets/AssetBundles/landcustombundle/LandCustom_Tree_E.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Tree_A.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Mushroom_E.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Rock_F.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Mushroom_F.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Tree_D.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Rock_B.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Flower_B.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Plant_C.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Mushroom_D.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Plant_F.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Flower_D.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Mushroom_A.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Wooden_B.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Flower_F.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Mushroom_C.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Tree_F.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Rock_A.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Rock_E.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Wooden_F.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Wooden_C.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Wooden_E.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Flower_C.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Tree_B.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Rock_C.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Tree_C.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Rock_D.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Plant_E.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Wooden_D.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Plant_D.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Mushroom_B.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Plant_A.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Plant_B.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Flower_E.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Flower_A.prefab
- Assets/AssetBundles/landcustombundle/LandCustom_Wooden_A.prefab
Dependencies: []
profile
New 현또의 코딩세상 / Unity 개발자

0개의 댓글