유니티 버전 : 2020.3.25f1(URP)
작업환경 : Mac (Monterey 12.2.1)
https://docs.unity3d.com/kr/2020.3/Manual/AssetBundles-Workflow.html
에셋 번들 워크플로 - Unity 매뉴얼
에셋 번들을 시작하려면 다음 단계를 따르십시오. 각 워크플로 단계에 대한 자세한 내용을 보려면 문서에서 본 섹션의 다른 페이지를 참조하십시오.
docs.unity3d.com
Unity Doc을 따라하면 사용법 정도는 금방 익힐 수 있습니다.
그렇지만 제가 했던 바보같은 행동과 삽질을 안하기를 바라며 이렇게 남겨 봅니다.
에셋번들 빌드를 하기 위해 스크립트를 작성해야합니다.
스크립트 작성은 Assets폴더에 Editor 폴더를 생성하고 이 폴더 안에 작성하셔야 합니다.
안그러면 MenuItem이나 BuildPipeline 등을 오류로 인식합니다.
BuildTarget은 사용하려는 환경에 맞게 변경해주시면 됩니다.
윈도우에서 작업할땐 BuildTarget.StandaloneWindow로 변경하시면 됩니다.
아래처럼 작성을 하면 상단 메뉴의 Assets에 Build AssetBundles가 생성되어 있을 겁니다.
using UnityEditor;
using System.IO;
public class CreateAssetBundles
{
[MenuItem("Assets/Build AssetBundles")]
static void BuildAllAssetBundles()
{
string assetBundleDirectory = "Assets/AssetBundles";
if(!Directory.Exists(assetBundleDirectory))
{
Directory.CreateDirectory(assetBundleDirectory);
}
BuildPipeline.BuildAssetBundles(assetBundleDirectory,
BuildAssetBundleOptions.None,
BuildTarget.StandaloneOSX);
}
}
이 다음으로 번들로 묶을 오브젝트(프리펩, Prefab)을 설정해야합니다.
프리펩은 게임오브젝트를 하이어라키에서 프로젝트 뷰로 이동하면 되는것 알고 계시죠?
그 외에도 (Asset menu -> Create -> Prefab)으로 생성한 뒤 컴포넌트를 넣어주거나 새로운 Prefab에 사용하려는 Object를 드래그 해서 생성해도 됩니다.
이렇게 Prefab을 만들고 인스펙터창 하단을 보면 두줄?이 있는데 이걸 위로 올리면 Prefab모습과 하단에 AssetBundle 선택할 수 있는 드롭박스가 있습니다. 클릭한뒤 새로운 번들 이름을 생성하거나 기존에 만들어 둔 것을 선택하시면 됩니다.
(이름은 전부 소문자로만 작성됩니다.)
여기 까지 됐으면 이제 번들로 만들고 번들안의 Prefab을 불러오는 작업을 진행해 봅시다.
처음에 만든 스크립트로 생성된 Build AssetBundles를 클릭하면 Bundle 생성이 진행됩니다. 파일 이름은 위 사진에서 작성한 이름으로 생성되는것 같습니다.
생성이 완료되면 스크립트를 작성해서 출력 되는 것을 확인합니다.
GetAllAssetNames()는 현재 bundle로 된 오브젝트의 이름을 가져옵니다.
이건 로컬에서 저장된 상태에서 가져오는 방법인데 저는 서버에 bundle파일을 저장하고 필요할 때 bundle을 다운받고 그 뒤에 사용하려 합니다. 하지만 매뉴얼에는 없더라구요
using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;
public class LoadAssetBundle : MonoBehaviour
{
void Start(){
string path = <Project Path>+"/bundle";
StartCoroutine(LoadFromMemoryAsync(path));
}
IEnumerator LoadFromMemoryAsync(string path) {
AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
yield return request;
AssetBundle bundle = request.assetBundle;
string[] name = bundle.GetAllAssetNames();
for(int i = 0; i < name.Length; i++)
{
Debug.Log(name[i]);
var prefab = bundle.LoadAsset<GameObject>(name[i]);
Instantiate(prefab, new Vector3(0, i+2, 0), Quaternion.identity);
}
}
}
아래는 서버에서 bundle파일을 받아오는 방법이 있습니다.
차이점은 UnityWebRequestAssetBundle.GetAssetBundle이 아닌 UnityWebRequest.Get을 사용한다는 점 입니다.
그리고 저는 bundle파일의 확장자가 확인이 안되서 사용하지 않았는데 아래에선 "*.unity3d"를 사용했습니다.
[Unity3D] UnityWebRequest를 이용해서 원격 서버에서 받아온 에셋 번들을 로컬 저장소에 저장하는 방법
UnityWebRequest를 이용해서 원격 서버에서 받아온 에셋 번들을 로컬 저장소에 저장하는 방법 유니티 5.6 문서에서는 알려주지 않는 로컬 저장소 저장 방법 유니티 5.6 문서에서는 웹 서버에서 에셋
wergia.tistory.com
'유니티' 카테고리의 다른 글
Unity HexGrid (0) | 2022.05.16 |
---|---|
유니티 동영상 재생 + Youtube(유료 에셋) (0) | 2022.04.21 |
유니티 PlanarReflection (0) | 2022.04.20 |
유니티 Laser reflection 구현 (0) | 2022.04.19 |
유니티 오브젝트 움직임 구현 (0) | 2022.04.14 |