20%
30,800원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결유니티 Addressable 을 이용한 패치 시스템 구현
animator안의 animatorcontroller를 불러올수없어요
상황은 이렇습니다.어떤 캐릭터 프립펩이 있고그 프리펩안에 animator 컴포넌트를 넣어두었습니다.그리고 그 animator컴포넌트안에 animatorcontroller를 만들어서 넣어놓은 상황입니다. animatorcontroller안에는 여러가지 애니메이션을 넣어둔상태입니다. 이상태에서 캐릭터 프리펩을 addressable에 할당했습니다.animatorcontroller파일도 addressable에 할당했습니다.두개를 같은 어드레서블 그룹에 넣은후에어드레서블을 빌드한후에 서버에 올렸고using System.Collections;using System.Collections.Generic;using System.Linq;using UnityEngine;using UnityEngine.AddressableAssets;using UnityEngine.UI;public class DownManager : MonoBehaviour{ [Header("UI")] public GameObject waitMessage; public GameObject downMessage; public Slider downSlider; public Text sizeInfoText; public Text downValText; [Header("Label")] public AssetLabelReference prefabLabel; public AssetLabelReference materialLabel; public AssetLabelReference animationLabel; public AssetLabelReference textureLabel; private long patchSize; private Dictionary<string, long> patchMap = new Dictionary<string, long>(); void Start() { waitMessage.SetActive(true); downMessage.SetActive(false); StartCoroutine(InitAddressable()); StartCoroutine(CheckUpdateFiles()); } IEnumerator InitAddressable() { var init = Addressables.InitializeAsync(); yield return init; } #region Chek Down IEnumerator CheckUpdateFiles() { var labels = new List<string>() { prefabLabel.labelString, materialLabel.labelString, animationLabel.labelString, textureLabel.labelString}; patchSize = default; foreach (var label in labels) { var handle = Addressables.GetDownloadSizeAsync(label); yield return handle; patchSize += handle.Result; } if (patchSize > decimal.Zero) { //Down waitMessage.SetActive(false); downMessage.SetActive(true); sizeInfoText.text = GetFileSize(patchSize); } else { downValText.text = " 100 % "; downSlider.value = 1f; yield return new WaitForSeconds(2f); LoadingManager.LoadScene("MainLobby"); } } private string GetFileSize(long byteCnt) { string size = "0 Bytes"; if (byteCnt >= 1073741824.0) { size = string.Format("{0:##.##}", byteCnt / 1073741824.0) + " GB"; } else if (byteCnt >= 1048576.0) { size = string.Format("{0:##.##}", byteCnt / 1048576.0) + " MB"; } else if (byteCnt >= 1024.0) { size = string.Format("{0:##.##}", byteCnt / 1024.0) + " KB"; } else if (byteCnt > 0 && byteCnt < 1024.0) { size = byteCnt.ToString() + " Bytes"; } return size; } #endregion #region DownLoad public void Button_DownLoad() { StartCoroutine(PatchFiles()); } IEnumerator PatchFiles() { var labels = new List<string>() { prefabLabel.labelString, materialLabel.labelString, animationLabel.labelString, textureLabel.labelString}; foreach (var label in labels) { var handle = Addressables.GetDownloadSizeAsync(label); yield return handle; if (handle.Result != decimal.Zero) { StartCoroutine(DownLoadLabel(label)); } } yield return CheckDownLoad(); } IEnumerator DownLoadLabel(string label) { patchMap.Add(label, 0); var handle = Addressables.DownloadDependenciesAsync(label, false); while (!handle.IsDone) { patchMap[label] = handle.GetDownloadStatus().DownloadedBytes; yield return new WaitForEndOfFrame(); } patchMap[label] = handle.GetDownloadStatus().TotalBytes; Addressables.Release(handle); } IEnumerator CheckDownLoad() { var total = 0f; downValText.text = "0 %"; while (true) { total += patchMap.Sum(tmp => tmp.Value); downSlider.value = total / patchSize; downValText.text = (int)(downSlider.value * 100) + " %"; if (total == patchSize) { yield return new WaitForSeconds(1f); // 지연 시간 추가 LoadingManager.LoadScene("MainLobby"); break; } total = 0f; yield return new WaitForEndOfFrame(); } } #endregion}이렇게 다운로드를 받았습니다. 그리고나서 using System.Collections;using System.Collections.Generic;using System.IO;using UnityEngine;using UnityEngine.AddressableAssets;using UnityEngine.ResourceManagement.AsyncOperations;public class GameManager : MonoBehaviour{ public GameObject _player; public Dictionary<string, string> stateNameMap = new Dictionary<string, string>(); private IEnumerator CreateCharacter() { var initializeOperation = Addressables.InitializeAsync(); yield return initializeOperation; if (initializeOperation.Status == AsyncOperationStatus.Succeeded) { Debug.Log("Addressables initialized successfully"); LocalPlayerLoad(); } } private void Start() { StartCoroutine(CreateCharacter()); } public void LocalPlayerLoad() { Addressables.InstantiateAsync("Assets/Project/Asset/Prefab/Human.prefab", new Vector3(0, 0, 0), Quaternion.identity).Completed += callback => { if (callback.Status == AsyncOperationStatus.Succeeded) { _player = callback.Result; } }; }}이렇게 Human이라는 프리펩을 불러왔는데 animator창을 열고 불러와진 Human캐릭터를 하이어라키에서 선택을하면 현재 애니메이션의 상태가 보여야하는데 이런식으로 나오는겁니다.. 이건 animatorcontroller를못불러온건가요? 아니면 addressable로 지정하면 원래 볼수없는건가요? 근데 이렇게 나오면 애니메이션 상태를 볼수없기때문에 디버깅이 너무 어려워지는데.. 제가 뭔가 잘못한게 맞겠죠?
- 미해결유니티 Addressable 을 이용한 패치 시스템 구현
혹시 문제해결을 파일올리면 봐주실수있나요?
혹시 제가 아무리해도 문제가 해결이 안되서 그런데 따로 프로젝트를 구글드라이브 링크로 올리면 봐주실수있나요?..
- 미해결유니티 Addressable 을 이용한 패치 시스템 구현
4:53 어드레서블 번들-에셋 메모리 로드 관련 설명에 오류가 있는것같습니다.
유니티의 어드레서블 에셋 그룹에서 특정 에셋을 참조할 때 해당 에셋이 포함된 번들 전체가 런타임에 메모리에 로드되는 것은 아닌것으로 알고있습니다. 번들 전체가 메모리에 로드되는 것이 아니라 해당 프리팹의 인스턴스화에 필요한 에셋만 로드되는게 아닌가요?
- 미해결유니티 Addressable 을 이용한 패치 시스템 구현
Unable to load dependent bundle from....
원래는 아무 문제 없이 다운로드 받고 로드도 됐었습니다..근데.. 첫 다운로드(aws s3 버킷) LoadAssetAsync로 로드하면 갑자기 이렇게 뜹니다..원래는 안이랫는데..아무 코드도 고치지 않았어요... 예제에 나온대로 그대로 했고 이거구요 json 파일 확인해보면이렇게 있고..(형광펜으로 칠한 부분) 앱을 껐다 키고 다시 실행하면 로딩 성공합니다.. 이유를 모르겠어요... 에디터 2021 lts -> 2022 lts로 업데이트 하고 어드레서블도 1.21 버전으로 업그레이드 했어요. 1.21 버전부터 DownloadDependenciesAsync가 바뀌었고 더 이상 에셋 번들을 메모리에 불러오지 않는 것으로 바뀌어서 LoadAssetAsync 하면 unable to load 오류가 뜨게 되었어요 해당 문제 글은 많지만 해결책이 없네요..어떻게 해야 할까요 해당 글 출처(https://forum.unity.com/threads/unable-to-load-dependent-bundle-from-location.1493702/)
- 미해결유니티 Addressable 을 이용한 패치 시스템 구현
캐싱을 할때 캐싱 진행상황을 제대로 표시하고싶어요
안녕하세요. 제가 어드레서블을 사용해서 다운을 받고 생성하는거까지 해봤는데요.여기서 몇가지 궁금한게 생겨서요.제가 포톤 pun2를 사용하고있어서 에셋을 바로 PhotonNetwork.Instantiate를 사용할수가 없는 상황이더라구요..그래서 찾아보다가 포톤에서 프리펩풀이라는게있어서 수동으로 생성을 할수있다고 하더라구요DefaultPool defaultPool = PhotonNetwork.PrefabPool as DefaultPool;Task<GameObject> task = character.LoadAssetAsync<GameObject>().Task; // 불러옵니다.await task; //대기.defaultPool.ResourceCache.Add("player01", task.Result); // 넣기_player = PhotonNetwork.Instantiate("player01", Vector3.zero, Quaternion.identity);그래서 이런식으로 프리펩풀에 넣어놓고 불러오는 방식을 사용하게됐습니다.그리고 불러와지는걸 확인을 했죠! 그런데 여기서 문제가 발생하더라구요.. 안드로이드로 스위칭을 한상태라서그런지쉐이더라 에디터상에서는 깨지는문제가 발생하더라구요그래서 playmode script를 simulategroup을하게되면 에디터상에서 정상적으로 보이기는 하는데.. 그전에는 쉐이더가 안불러와져서 그런지 핑크색이긴하지만 바로바로 불러와졌는데씬을 불러오니까 캐릭터가 생성되기까지 시간이 2~3초정도 걸리더라구요그래서 무슨문제일까 찾아보다가 씬에 미리 캐싱을 해두고 써야한다는말이 있어서 public IEnumerator LoadMultipleAssetAsync(List<string> AssetNames, string scene){foreach (string asset in AssetNames){// Addressables.DownloadDependenciesAsync를 사용하여 씬 캐싱AsyncOperationHandle handle = Addressables.DownloadDependenciesAsync(asset);// 캐싱 완료될 때까지 대기while (!handle.IsDone){Debug.Log(handle.PercentComplete); yield return null;}// 씬 로드SceneManager.LoadScene(scene);}// 씬 로드 완료 후 처리}이렇게 진행상황을 표시하는걸 만들고StartCoroutine(LoadMultipleAssetAsync(assets, "Tutorial"));이렇게 씬을 불러오게 만들었는데여기서 문제가 발생합니다. player01을 불러올때 0.8부터 불러온다는 문제가 생기더라구요..그리고 불러오고 나서도 씬이 자연스럽게 나오는게 아니라 뭔가 부자연스럽게 한..0.2~3초정도 눈에 보일정도로 딜레이가생기면서 생성되더라구요.. 제가 여기서 궁금한건 0.8부터 불러지는거랑 딜레이가 생기는부분이 궁금한건데요.. 어떤 문제가 있는걸까요?
- 미해결유니티 Addressable 을 이용한 패치 시스템 구현
어드레서블을 사용해서 받은 에셋이 전부 핑크색으로 나와요
안드로이드로 스위치 했구요. 모델링하나를 씬에 올리고 재질을 하나 만들어서 재질은 mobile/unlit(support lightmap)이라는걸로 넣었구요. 그상태로 그걸 프리펩으로 만들고 어드레서블을 지정했습니다. 기본 디폴트 그룹에 지정되어있구요. 들어가있는 재질도 어드레서블을 지정해서 넣었습니다. 그리고나서 어드레서블을 사용해서 다운을 받고 불러오기까지 했습니다. 여기서 문제가 하나 생기더라구요.. 불러오니까 핑크색으로 나오는거에요.. 그래서 리얼타임에서 불러온상태에서 재질쪽으로 가니까 재질은 들어가있는데 쉐이더쪽이 핑크색인거에요.. 그래서 쉐이더를 다시 unlit으로 지정을 해주니까 잘나오더라구요.. 그렇다는건 쉐이더도 어드레서블에 포함을 해야한다는 이야기인건가요?진짜 이것저것 시도를 다해보고있는데 해결이 안되네요.. 빌트인에 unlit쉐이더를 포함하면 된다고 하는 말도있어서 그것도 해봤는데 그것마저도 안되더라구요..ㅜㅜ
- 미해결유니티 Addressable 을 이용한 패치 시스템 구현
다운로드 후 InGame에서 스프라이트 이미지 반영이 바로 되지않는 현상
앱 실행 > 첫 다운로드 시작 > 다운로드 완료 > InGame 신으로 넘어가면 이미지가 반영되지 않네요.앱을 재 실행 > 다운로드 없이 바로 게임시작 > InGame 신으로 넘어오면 이미지가 반영되는 현상이 있습니다. 어떤 문제인지 모르겠네요.
- 미해결유니티 Addressable 을 이용한 패치 시스템 구현
윈도우 빌드 파일에 업데이트가 반영되지 않습니다
안녕하세요 선생님, 강의 잘들었습니다!윈도우 빌드로 진행했고, 업데이트가 잘 되는지 확인하려고 아래 과정을 거쳤습니다.AddressableAsset을 추가해 Update a Previous Build로 에셋 빌드하고, play mode > use existing build로 이상 없이 파일 업데이트 하고 잘 진행됨.하지만 빌드 파일에서는 이 업데이트 내용이 전혀 반영되지 않아 질문 드립니다.hash값도 제대로 바뀐걸 확인했고, 서버에도 파일도 잘 업로드가 되었는데, 빌드 파일에서는 다운받을 데이터를 전혀 찾지 못합니다. 이름을 덮어쓴 파일은 반영이 잘되는데, 새로 에셋을 추가한 부분에 대해서는 전혀 읽어오질 못합니다.use existing build로 플레이한 경우랑 어떤점이 달라서 작동하지 않는지 궁금합니다! (+그리고 Build > Update a Previous Build 선택했을때 팝업창이 뜨는게 아니라 바로 아래의 사진으로 넘어가는데, 이부분은 상관없을까요?)
- 미해결유니티 Addressable 을 이용한 패치 시스템 구현
Addressables.CheckForCatalogUpdates()에 대해서 질문있습니다.
Addressables.CheckForCatalogUpdates()의 결과가 0이라서 다운로드 받을 수는 0인데, Addressables.GetDownloadSizeAsync()의 결과는 제대로 에셋의 크기를 반환해줍니다.다운로드 이후에는 Addressables.CheckForCatalogUpdates()는 0, Addressables.GetDownloadSizeAsync()도 0이라서 다운로드는 된거 같은데, Addressables.CheckForCatalogUpdates()가 0으로 표시되는 이유가 뭔가요?윈도우10 유니티 에디터에서 플레이 모드로 했고, 영상을 보면서 로컬 빌드 건너뛰고, 리모트 빌드로 했습니다.
- 해결됨유니티 Addressable 을 이용한 패치 시스템 구현
앱을 빌드하지 않고 플레이 모드에서 테스트 할수 있나요?
개발이 진행되면서 게임 크기도 커질텐데, 매번 제대로 번들이 다운로드 되는지 확인하려면 앱을 빌드해야 하는 수고를 덜고 싶습니다. 플레이 모드에서 번들 다운로드 테스트는 어떻게 하나요?
- 미해결유니티 Addressable 을 이용한 패치 시스템 구현
안녕하세요 빌드시... 용량이 줄지 않습니다.
안녕하세요.어드레시블을 사용하여 빌드를 하였는데요.빌드용량이 줄어들지 않아 문의드립니다. 참고 : 리소스 폴더는 없습니다.
- 미해결유니티 Addressable 을 이용한 패치 시스템 구현
/ 가 URI 인코딩 문제로 %5C로 내려 받습니다 ㅠㅠ
안녕하세요 ㅠㅠ 강의대로 했는데용 ...아마존 S3로 내려 받는데 요청 받을때 /Android%5C 부분에서 %5C가 /로 요청을해야하는데 어디에선가 인코딩 문제가 생긴것같습니다 ㅠ.ㅠ 아래에 로그 전체를 보내 드리겠습니다 ! ==============================2023-06-28 04:04:33.168 32354-32393/? E/Unity: System.Exception: Dependency Exception ---> UnityEngine.ResourceManagement.Exceptions.OperationException: GroupOperation failed because one of its dependencies failed ---> UnityEngine.ResourceManagement.Exceptions.RemoteProviderException: RemoteProviderException : Unable to load asset bundle from : https://s3.ap-northeast-2.amazonaws.com/com.blackhammer.assetbundle/Android%5Cremote_bundle_assets_all_f923192b886d03258296e7bc56c4d786.bundle UnityWebRequest result : ProtocolError : HTTP/1.1 403 Forbidden ResponseCode : 403, Method : GET url : https://s3.ap-northeast-2.amazonaws.com/com.blackhammer.assetbundle/Android%5Cremote_bundle_assets_all_f923192b886d03258296e7bc56c4d786.bundle --- End of inner exception stack trace --- --- End of inner exception stack trace --- UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1:set_OperationException(Exception) UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1:Complete(TObject, Boolean, Exception, Boolean) UnityEngine.ResourceMan2023-06-28 04:04:33.168 32354-32393/? E/Unity: Dependency Exception UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1:set_OperationException(Exception) UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1:Complete(TObject, Boolean, Exception, Boolean) UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1:InvokeExecute() UnityEngine.ResourceManagement.AsyncOperations.<>c__DisplayClass57_0:<add_CompletedTypeless>b__0(AsyncOperationHandle`1) System.Action`1:Invoke(T) DelegateList`1:Invoke(T) UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationBase`1:InvokeCompletionEvent() UnityEngine.ResourceManagement.ResourceManager:ExecuteDeferredCallbacks() UnityEngine.ResourceManagement.ResourceManager:Update(Single)
- 미해결유니티 Addressable 을 이용한 패치 시스템 구현
카탈로그 질문..
제가 잘못해서 previous build를 안하고 default build를 해서지금 이렇게 됐고, 앱의 버전은 1.0.7인데, 이 버전의 setting.json은이거인데요...제가 이걸 누르고 previous build를 하고..aws s3 서버에 덮어 씌우기 했는데도...업데이트가 되지 않아요...뭐가 문제인걸까요?...어떻게 해결하면 될까요?ㅠ... 그리고 1.0.1~1.0.6 버전에는 예전 카탈로그를 썼는데,default build 해서 최신 카탈로그로 하고, 1.0.7 버전으로 앱 빌드 하면.1.0.7 버전의 최신 카탈로그로 업데이트 되는거 맞나요?
- 미해결유니티 Addressable 을 이용한 패치 시스템 구현
CheckForCatalogUpdates() 대한 이해
1)Addressables.CheckForCatalogUpdates()를 통해 업데이트 할께 있다. 없다를 판단 하는거 같습니다. 체크를 통해 Count가 0 이상이면 업데이트 할께 있으므로 다운로드 진행으로 알고 있습니다. 그런데 의문점 드는 부분의 코드가 CheckForCatalogUpdates() 체크 후Count 0 이상 > 카탈로그 업데이트 > 다운로드 사이즈 체크 Count 0 이하 > 다운로드 사이즈 체크 2번 같은 경우 카탈로그 체크로 인해 0 이므로 다운로드를 받을 필요가 없는데 굳이 다운로드 사이즈 체크해서 다운로드를 하는 이유가 무엇인가요? 2) 제공 해주신 프로젝트로 카탈로그 테스트 중 이상 현상이 나와 질문 드립니다. 번들 빌드를 한후 서버에 올리고 다운을 받으면, AppData\LocalLow\Unity/프로젝트이름/ 위치로 다운 받아 지는 거 같습니다. 다시 테스트를 위해 위 위치의 캐시를 지운 후 테스트를 하면 카탈로그체크카운트가 0입니다.내 캐쉬에 없는데도 카탈로그체크카운트가 0이상이지 않습니다. 혹시나 몰라 addressables_content_state.bin도 삭제 Group > Clean Build 를 해보아도 카탈로그체크카운트가 카운트 되지 않습니다.최초 실행은 카탈로그체크카운트가 카운트 되지 않나요?아님 리셋 시키는 방법이 있을까요?
- 미해결유니티 Addressable 을 이용한 패치 시스템 구현
멀티 라벨 처리 방식 질문
안녕하세요 선생님! 강의 잘 보고있습니다. 현재 제공해주신 샘플 코드가 한개의 라벨에서 어드레서블을 다운로드하는 방식으로 구현되어있는데요. 여러 라벨을 한번에 다운로드하고 관리하는 샘플도 추가해주실수 없을까요? 그게 조금 어려우시면 좀 번거로우실듯 하지만 ..ㅜㅜ 답변으로 심플 하게라도 현재 제공해주신 코드에서 어떤 코드 (몇번째 라인)에 라벨 스트링 배열 값(라벨 목록) 을 삽입하여 처리하면 되는지 권장하시는 방식을 간단 하게라도 알려주시면 감사하겠습니다! ^^
- 미해결유니티 Addressable 을 이용한 패치 시스템 구현
Exception message 질문
선생님 안녕하세요. 강의 잘 듣고 있습니다.현재 iOS 모바일 Xcode로 테스트하고 있는데, 스트라이트 다운로드를 실패해서 Addressables.UpdateCatalogs 또는 Addressables.GetDownloadSizeAsync에서 실패하게 되는 Exception message를 참고하고 싶은데 이를 어떻게 해야할지 잘 몰라서 이렇게 글을 남기게 되었습니다. (Mac OS Apple silicon에서는 빌드 후 정상적으로 동작되었고, AWS S3를 활용하고 있습니다)
- 미해결유니티 Addressable 을 이용한 패치 시스템 구현
PercentComplete
다운로드 받고, 로드 하는데처음에 다운로드 받고 로드 하는건 문제 없이 되거든요.근데 그 이후 앱을 껐다 키고 다시 로드 받으면PercentComplete가 0.5에 멈춰요..이유가 뭘까요..? 상황을 정확히 설명하자면 씬1에서 내려받고, 씬2로 넘어가 씬1에서 내려받은 에셋을 로드 하는거에요
- 미해결유니티 Addressable 을 이용한 패치 시스템 구현
구매한 아이템을 로드할 때
게임 내에서 아이템 세트를 구매하면 어드레서블로 다운로드 받고 에셋을 로드하는데요. 껐다 켰을 때 영수증 검증 되면서 구매한 아이템들을 또 Load Asset Async로 불러와야 하나요?
- 미해결유니티 Addressable 을 이용한 패치 시스템 구현
sprite atlas를 로드하는데
다운로드는 메인 popup에서 하잖아요 로드를 하려는데로드를 하면 꼭 release를 해줘야 하나요? 게임 켤때 로드 -> 게임 꺼질때 release게임 꺼서 release 해줬으면 다음에 게임 켤때 또 로드 이렇게 해줘야 하나요?
- 미해결유니티 Addressable 을 이용한 패치 시스템 구현
Unloading 5 Unused Serialized files
다운로드 완료 후 씬 로드를 하려고 하는데(씬 파일 자체가 다운로드 파일이에요)Addressables.LoadSceneAsync("~~").Completed+=(result)=> {~~ 이렇게 불러오게 했는데Unloading 5 Unused Serialized files 오류가 뜨면서프로그램이 튕겨져요....ㅠㅠ 에러 이유를 모르겠어요.