본문 바로가기
Unreal Engine

SaveGameToSlot 실패

by GOOROOM 2021. 8. 6.

이 글은 내 모자른 실력으로 정확한 원인이 파악되지 않아 공개로 하기엔 부끄러운 글이지만,

그래도 혹시나 나와 같은 문제로 어려운 분들에게 내가 머리가 아닌 몸으로 찾은 방법이 조금이라도 도움이 되었으면해서 공개로 올린다.

 

개발중에 에디터와 안드로이드 디바이스에 패키징해서 테스트할때는 아무런 문제없이 작동하던 SaveGameToSlot이

Google AdMob 설정을 해주고 나니 계속 실패가되는 현상이 발생했다. 물론 에디터에서는 여전히 문제가 없었다.

사용 언리얼엔진 버전은 4.25.3 이다.

 

Google AdMob을 설정하기 위해서 Google AdMob에 가입하고 이런저런 설정을 해주고, 테스트를 위해 디바이스를 Test Device에 등록하는 작업들을 해주고 광고가 제대로 나오는 것까지 완성하고 나니 SaveGameToSlot이 작동을 안했다. 정확한 원인이 AdMob 설정인지 아니면 GooglePlay 관련 설정때문에 그런건지 알 수는 없지만 찾아보니 이 문제가 나뿐만이 아닌 과거에도 계속 있던 문제였었다.

 

찾게된 해결 방법들은 아래와 같다.

 

1. Save관련 내용을 GameMode가 아닌 GameInstance에서 처리해라.

2. 저장소에 관한 안드로이드 권한(Permission)을 확인한뒤 권한이 없으면 동적으로 권한을 요청해서 획득해라.

3. 안드로이드 최소 SDK버전과 타겟 버전을 설정해라.

4. Use ExternalFileDir 사용 체크를 해제해라.

 

위 방법들을 다 적용해봤지만 여전히 SaveGameToSlot은 제대로 작동하지 않았다.

우선 각각의 방법들을 간단히 정리해 보았다.

 

 

1. Save관련 내용을 GameMode가 아닌 GameInstance에서 처리

이 내용은 작업 내용들을 옮겨주기만 하면 된다. 우선 GameMode보다는 GameInstance가 게임 실행시 제일 처음에 처리되고 Level이 바뀔때 각 Level마다 GameMode가 다를 수 있으므로, 안전한 GameInstance에서 작업하는걸 추천한것 같다.

 

 

2. 권한(Permission) 확인과 동적 권한 요청

권한 확인 및 동적 권한 요청

위와 같이 CheckAndroidPermission 함수를 이용해서 해당 권한(android.permission.WRITE_EXTERNAL_STORAGE)을 가지고 있는지 확인하고 그 권한이 없으면, 동적으로 다시 권한을 RequestAndroidPermissions 함수를 이용해 요청하고 OnPermissionsGrantedDynamicDelegate에 바인딩하여 요청 결과를 확인한뒤 권한을 획득하면 Save관련 내용이 호출되도록 진행하는 방식이다.

처음에는 해외 사이트에서 RequestAndroidPermissions에 들어가는 string을 WRITE_EXTERNAL_STORAGE만 써놔서 그대로 저 부분만 넣었다가 전혀 권한획득이 동작하지 않아서 조금 고생했다. CheckAndroidPermission에 들어가는 string을 그대로 요청해주면 된다.

그리고 프로젝트 세팅 → 플랫폼 → Andriod → 고급 APK 패키징 항목에서 추가 권한을 아래와 같이 추가했다.

고급 APK 패키징내 추가권한 설정

제대로 동작하는지 확인을 위해 Development로 빌드해서 확인해보니 동적으로 권한을 요청해도 권한 획득에 실패한다. Shipping에서만 동작하지 Shipping으로 빌드해봤으나 똑같이 SaveGameToSlot은 실패한다.

 

 

3. 안드로이드 최소 SDK버전과 타겟 버전 설정

우선 이부분은 사람들마다 버전 설정 내용이 과거와 현재가 다르다.

나는 계속 권한 획득 문제를 해결하는데 바빠서 이것저것 고민하다 지금 생각하면 좀 엉뚱한(?) 생각이지만, 권한 획득에 Google Play 서비스가 관련이 있을까 싶어 Google Play 서비스를 연결하다보니 최소 버전이 26이 되었다.

SDK 버전 설정은 프로젝트 세팅 → 플랫폼 → Android 에서 수정 가능하다.

우선 현재 내 설정은 아래와 같다.

최소 SDK 버전과 타겟 SDK 버전

그리고 프로젝트 세팅→ 플랫폼→ Android SDK 에서 NDK, JDK 버전을 바꿔주었고 SDK/NDK API Level을 아래와 같이 설정해 주었다.

SDK/NDK API Level 설정

※ 안드로이드 SDK와 NDK, JDK 설정에 관해서는 추후 포스팅을 하려고 한다.

 

 

4. Use ExternalFileDir 사용 여부

이 부분이 정말 많이 햇갈리게 만든 부분이었다. 어떤 글에서는 체크를 해제하라고 하고 어떤 글에서는 이것만 체크했더니 해결되었다고 하는 서로 다른 내용들이 있었다.

이 옵션에 마우스 커서를 올려놓고 툴팁으로 나오는 설명은 아래와 같다.

Use ExternalFileDir 설명

여러 글들이 있었지만 한 글에서 직접 에픽 직원과 얘기해서 내린 결론은 언리얼엔진 4.21부터는 저 옵션을 체크해줘야 ApplicationStorage에 저장이 가능하다고 했다고 한다는 말을 믿고 옵션을 체크해주고 계속 권한 획득에 실패해서 Load부터 할 수 없던 위에서 작업한 동적 권한 내용은 건너뛰도록 했다.

이렇게 한 뒤 Development로 빌드했으나 여전히 SaveGameToSlot은 실패한다. 혹시나 싶어 Shipping으로 빌드하고 확인해보니 이제야 SaveGameToSlot이 제대로 작동한다.

저 옵션을 키고 빌드해서 테스트해보고 했었는데 그전에 SaveGameToSlot이 작동안했던건 아마도 Development로 빌드해서 제대로 작동을 안했던것 같다.

 

▶ 결론

현재 SaveGameToSlot이 제대로 작동하는 설정은 따로 권한 요청없이 Use ExternalFileDir을 사용하도록 체크하고, Development빌드가 아닌 Shipping빌드에서만 SaveGameToSlot이 정상 작동한다는 것이다.혼자서 안드로이드 빌드는 처음 해보는거라 정확한 원인 파악은 어려웠으나, 우선은 배포버전에서는 문제없이 작동하므로 문제 해결로 넘어가고 나중에 관련 내용들을 확인해봐야겠다.

원인이 파악되었다. 결국 처음부터 의심되던 광고 관련 플러그인의 문제였다.

플러그인 개발사도 아래와 같이 알려진 이슈로 올려놓은걸 이제야 봤다.

플러그인 설정을 변경하니 Development빌드에서도 SaveGameToSlot이 정상적으로 작동한다.

이번 글은 삭제하려다 그냥 찾아본 정보들 정리한게 아까워서 그냥 두기로 했다.

댓글