Unity Assets 추천/BG Database

유니티 에셋 추천 - BG Database Addressable 사용 #5

개양반 2022. 12. 6.

Addressable은 메모리를 관리할때 매우 편하게 사용하도록 유니티에서 제공해주는 기능이다. BG Database에서도 Addressable을 이용해서 메모리 관리를 할 수 있다. 뿐만 아니라 BG에서 제공해주는 기능을 사용하면 훨씬 간단하게 메모리 관리를 해 줄 수 있다.

 

1. CodeGen 설정

CodeGen을 설정하면 BGDatabase에서 Addressable을 더 편하게 사용할 수 있다.  

BG Database의 Addons 탭으로 이동해서 Enabled를 활성화한다.

 

1-1 Code generator 설정

Code generator 항목의 우측에 Use default를 클릭하면 자동으로 설정된다.

 

1-2 Source File 설정

임의의 폴더에 BGCodeGen.cs를 만든다. BG Database의 Addons 탭으로 돌아가서 Source File 우측의 Choose file을 클릭한다. BGCodeGen.cs를 연결한다.

 

1-3 prefix 설정

Class names prefix와 Field names prefix에 본인이 원하는 문자를 설정한다. 나는 C_, F_로 설정했다. Generate를 클릭하면 CodeGen이 완료된다. 

기억이 가물가물하지만 테이블을 만들거나, 제거할때마다 Generate를 클릭해야 하는 걸로 알고 있다.

Prefix는 짧을수록 좋다.

 

2. Addressable에 오브젝트 등록

2-1 프리팹 만들기

Hierarchy에서 Cube와 Sphere 오브젝트를 생성하고 프리팹으로 만든다. Hierarchy에서 생성한 Cube와 Sphere 는 삭제한다.

 

2-2 Addressable에 등록

 Cube와 Sphere 프리팹의 Inspector에서 Addressable을 활성화한다.

 

 

3. 유니지패키지 임포트

아래의 링크로 이동한다.

https://www.bansheegz.com/BGDatabase/Downloads/RuntimeAddressables/

 

BansheeGz

 

www.bansheegz.com

 

다운로드 페이지에서 link를 클릭하면 유니티패키지 파일이 다운로드된다. 다운받은 BGDatabaseAddressables1.3.unitypackage 파일을 유니티에 임포트한다. 이녀석을 다운받지 않으면 BGDatabase에 Addressable로 등록한 Asset을 추가할 수 없다.

 

 

4. BG Database에 추가하기

4-1 필드 만들기

BG Database의 Configuration 탭으로 이동한다. + 버튼을 눌러 필드를 생성한다. 이때, Loader는 Addressables이며 Field의 Type은 unityPrefab이다.

 

4-2 Assets 등록

Database 탭으로 이동해서 위에서 만든 UnityPrefab 필드에 아까 Addressable로 등록한 프리팹을 연결한다.

 

5. BGAddressablesMonitorGo 만들기

BG Database에서 제공하는 BGAddressablesMonitorGo 를 사용하면 Addressable을 정말 간편하게 사용할 수 있다. Hierarchy뷰에서 빈게임오브젝트를 만들고 이름은 BGAddressablesMonitorGo 로 변경한다. BGAddressablesMonitorGo 의 컴포넌트로 BGAddressablesMonitorGo.cs를 추가한다.

Unload On Row Delete는 파티셔닝 애드온과 함께 쓰면 좋다. 파티셔닝 애드온 나중에 알려주겠다.

 

6. 스크립트 작성

BGAddressableTest.cs를 만들고 아래의 코드를 입력한다.

using UnityEngine;
using BansheeGz.BGDatabase;
using UnityEngine.AddressableAssets;


namespace BG_DatabaseSample
{

    public class BGAddressableTest : MonoBehaviour
    {
        byte[] databaseData;

        private void Awake()
        {
            databaseData = Addressables.LoadAssetAsync<TextAsset>(BGLoaderForRepoCustom.CustomDatabaseGuid).WaitForCompletion().bytes;

            BGRepo.SetDefaultRepoContent(databaseData);
            BGRepo.Load();

            InstantiatePrefab();
        }

        private void InstantiatePrefab()
        {

            // #1 Load{FieldName}Async 메서드 사용
            C_TEST_Field.GetEntity(0).LoadF_UnityPrefabAsync(prefab => Instantiate(prefab));

            // #2 동기 로딩을 위해 생성된 속성 사용
            Instantiate(C_TEST_Field.GetEntity(1).F_UnityPrefab, Vector3.right * 2, Quaternion.identity);

            Invoke("OnReleaseInstance", 1f);
        }

        public void OnReleaseInstance()
        {
            // 생성된 게임오브젝트는 파괴되지 않고 메모리에 로드된 에셋만 없어진다.
            C_TEST_Field.GetEntity(0).ReleaseAddressablesAssets();
            C_TEST_Field.GetEntity(1).ReleaseAddressablesAssets();
        }
    }
}

코드 설명

Addressable에 등록된 자산을 로드 후 인스턴트 하는 방법에는 3가지 방식이 있다. #1 방식은 비동기로 진행되는 코드이다. 그리고 #2는 동기 방식으로 진행되는 코드이다. 나머지 하나는 기존의 Addressable를 이용해서 로드하는 방식인데 이 방식에 대해서는 따로 설명안 한다. 궁금하면 BGDatabase 홈페이지에 가서 직접 봐라.

OnReleaseInstance() 에서 ReleaseAddressablesAssets() 는 메모리에서 해당 데이터를 해제하는 코드이다. 씬에 생성된 게임오브젝트는 파괴되지 않으며 메모리에 로드된 애셋만 메모리에서 해제된다.

 

7. 결과 확인

0.5 초 후에 Addressable에서 BGTesterA와 BGTesterB가 해제된다.

 

메모리에서 해제되었지만 씬에 이미 생성된 게임오브젝트는 파괴되지 않는다.

 

즉, 필요한 만큼 생성한 뒤 메모리를 해제하고 다시 필요하면 메모리에 애셋을 로드하는 방식으로 쓰면 메모리 관리가 훨씬 수월해질거라 판단된다.

 

8. 구매 링크

아래의 링크로 구매하시면 유니티 에필리에이트로 활동하는 저에게 소정의 원고료가 지급되어 큰 힘이 됩니다.

 

댓글

💲 추천 글