기본적으로 어드레서블을 빌드하거나 사용하려는 프로젝트내에서는 Addressable 패키지가 설치되어 있어야함. (기본설치가 아니므로 설정을 해야함.)

에디터에서는 쉐이더가 문제가 생긴다 (빌드된 에셋의 쉐이더는 안드로이드로 pack 되어있는데 에디터는 윈도우이기 때문에 링크가 끊기는것 같아보인다.. 해당부분을 어드레서블에 같이 포함시켜 로드될때 쉐이더 할당을 해주거나 해야할것으로 보임 (해당부분은 어드레서블에 포함되는 프리팹쪽 마테리얼에 쉐이더 어드레서블 체크하는 부분이 있다 마찬가지로 설정해주면된다. 근데 유니티 디폴트 URP 쉐이더는 따로 로드하는방법은 찾아봐야할것같음.) https://sunpil.tistory.com/506 실제 안드로이드 기기에서 빌드해서 볼떄는 문제가 생기지 않는다고한다. (이는 기존에 있던 에셋번들에서도 동일한 현상이 나왔던 경험이 있다)

타 프로젝트내에서 빌드된 어드레서블에셋들을 빌트인으로 사용하려면 프로젝트의 어드레서블 에셋로드 설정 한다음 로컬로드되는 (리모트 빌드가 아닌) 설정값의 위치로 해당 폴더 옮겨야함. 디폴트는 프로젝트 폴더내에 Library/com.unity.addressable/aa/플랫폼명임. (마찬가지로 타 프로젝트내에서 빌드된 파일도 해당위치에 존재하게된다. 따로 설정하지 않았다면)

LoadAssetAsync와 InstantiateAsync의 차이라고 하면 후자는 동적으로 생성까지 해준다는 점에 차이가 있다.

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

public class BasicAPITest : MonoBehaviour
{
    // Start is called before the first frame update
    IEnumerator Start()
    {
        yield return Addressables.InitializeAsync();
        // 여기서 리소스프로바이더, 리소스로케이터 등의 도움을 받음 ( 해당부분은 각 에셋의 로드 방식에 따라 나뉘므로 유니티에서 나뉘어놨다 ( 해당 어드레서블 그룹을 누르고 인스펙터에서 해당 어드레서블 그룹이 어떤식으로 되어있는지 확인 ) ) 
        // settings.json 파일에서 어드레서블 catalog.json(해당 에셋번들들의 path정보)를 불러옴

        // 실제 에디터에서는 바로 불러올수 있지만 실 기기에서는 빌트인 어드레서블이라도 빌드를 해서 apk파일안에 빌드시 포함되게 해야함 local (인앱) ( 어드레서블 그룹에서 빌드 )

        AsyncOperationHandle AssetObjectLoadHandler = Addressables.LoadAssetAsync<GameObject>("Test1");
        // catalog.json에서 해당 이름의 오브젝트를 불러옴 여기서 레퍼런스카운트 +1

        yield return AssetObjectLoadHandler;

        AsyncOperationHandle<GameObject> AssetObjectInstatateHandler = Addressables.InstantiateAsync("Test1");
        GameObject newObject = null;
        AssetObjectInstatateHandler.Completed += (AsyncOperationHandle<GameObject> _result) =>
        {
            newObject = _result.Result;
        };
        // 위에서 불러온 오브젝트 instance를 복사함. (번들자체에 있는 instance자체를 사용할수 없음) 
        // 여기서도 레퍼런스 카운트 +1

        yield return AssetObjectInstatateHandler;

        yield return new WaitForSeconds(3);

        if(Addressables.ReleaseInstance(newObject) == true)
        {
            Debug.Log("릴리즈 완료");
        }
        // 위에서 복사한 오브젝트를 Destory시킴 
        // 여기서 레퍼런스 카운트 -1

        Addressables.Release(AssetObjectLoadHandler); // 에셋언로드
        // 제일 처음에 로드한 Object Instance 로드 해제 
        // 여기서 레퍼런스 카운트 -1

        yield return new WaitForSeconds(2);
        StartCoroutine(Start());
    }

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