모바일 게임 패치.

2021. 3. 26. 17:36참고

 

실시간 패치 에셋을 사용하는데 하루 이틀 작업하면 쉽게 끝날 것으로 생각했다.

작업 특성과 난독화가 발목을 잡기 전까진.

한번 패치를 만들어서 테스트하려면 5~10분 소모해야 한가지 확인.

사냥감이 쓰러지느냐 내가 쓰러지느냐. ㅋ

 

삽질, 디버깅, 절망, 부활을 거쳐,

결론부터 말하자면,

Obfuscator 툴의 Field 난독화를 끄면 잘 된다. (그러나 난독화에서 완전 제외 필요. ㅋ)

그래서 il2cpp + 난독화 기조는 계속 유지할 수 있다.

 

툴의 특징은,

SharedResources : 씬에서 공통 사용하는 리소스를 지정한다.

예를 들어 두 씬이 사운드 컴포넌트에 동일한 사운드를 붙여 쓴다면 사운드 파일을 SharedResource 폴더에 두고 패치 툴에서 해당 폴더를 공유 리소스로 설정한다. 그러면 각 씬에서 공유 리소스를 사용하여 중복 패치되는 용량 증가를 방지할 수 있다.

SGResources : 스크립트로 리소스 로딩하는 부분은 이곳에 둔다.

무설정(위치무관) : 일반 리소스를 씬에 붙여 사용하면 각 씬에 종속, 중복되면 용량 증가의 원인이 된다.

 

이렇게 사용 형태를 분리하는 이유는 결국 패치 툴이 버전에 따라 리소스를 관리하겠다는 것이다.

(게임 리소스는 씬 종속, 씬 공유, 스크립트 로딩 방식으로 분리하여 관리하자.)

 

 

주의 사항.

스크립트 패치는 막혀있다.
직접 스토어에서 갱신해야 하고 나머지는 패치 툴로 실시간 변경할 수 있다.

그리고 il2cpp 사용한다면 unity project setting의 strip engine code 기능은 꺼야 한다.

빌드 할 때는 vpn 끄는 게 좋다. (내 경우)
SGPatcher는 Obfuscator 지원하지 않는다.

할려면 관련 라이브러리를 모두 난독화에서 빼자.
(개발자 왈. 자신의 라이브러리는 난독화하여 빌드했다고 한다.)

 

 

패치 시나리오.

 

패치 초기화 - 서버 점검

1. 최초 버전 빌드 생성.

2. 메인 빌드 생성. (loader.UpdateGame() 사용하여 실행 : loader 씬 참고)

3. 메인 빌드 배포.

 

패치 - 서버 유지

1. 소스코드 이외 변경

2. 패치 빌드 (패치 흐름이 길면 풀빌드로 한 번 끊어준다.)

 

패치 버전업 - 서버 점검

1. 소스코드 변경

2. 메인 빌드 생성 (loader.UpdateGame() 사용하여 실행 : loader 씬 참고)

3. 메인 빌드 배포

 

메인 빌드하면 Main_Build_Update_Required 상태가 된다.

이때 기존 버전을 완전 삭제 후 다시 설치하면 정상 복원 안 된다.

 

 

정상 동작 범위.

최초 빌드 -> 메인 빌드(loader scene) -> 앱 실행 (패치 업데이트 ok)

기타 수정 -> 패치 빌드/풀빌드 -> 기존 앱 실행 (패치 업데이트 ok)

코드 수정 -> 메인 빌드 -> 기존 빌드 있을 때 메인 빌드 설치하여 덮어쓰기 -> 앱 실행 -> ok

코드 수정 -> 메인 빌드 -> 기존 빌드 삭제 -> 최신 메인 빌드 설치 -> 앱 실행 : update error.
(버그 패치 기다림. ㅋ 이런 경우에 대비하여 메인 빌드 후 풀빌드 한다.)

(SharedResources 사용은 자제하자. 씬 공유 리소스 다운로드가 안 될때가 있다. ㅋ 버그가 좀 있군... 쩝.)

 

 

용어.

버전 빌드 : 풀 빌드와 패치 빌드를 통칭한다.

메인 빌드 : Unity Build Settings - Build

풀 빌드 : SG Patcher - Version Menu - Publish + Full version

패치 빌드 : SG Patcher - Version Menu - Publish

 

 

참고

docs.sidgin.com/books/sg-patcher---in-app

 

SG Patcher - In-App | Documentation

Build Settings In order to split your game into two parts (main and downloadable), the system needs to create re...

docs.sidgin.com

 

그리고 최근 구글에서 이런 패치 기능을 직접 지원하는 것 같다.

developer.android.com/codelabs/unity-gamepad#0

 

Using Play Asset Delivery in Unity games  |  Android 개발자

In this codelab, modify a sample Unity project to take advantage of Play Asset Delivery for on-demand asset downloading from Google Play.

developer.android.com

누가 알기 쉽게 튜토리얼 만들어주면 좋겠다. ㅋ

 

 

 

ㄱㄱ

 

 

  • 프로필사진
    감동원2021.07.01 23:10

    제가 지금 에셋을 사서 진행중에 있는데요 혹시 조금 도움을 받을수있을까요?
    진행하면서 몇가지 여쭤보고 싶어서여

  • 프로필사진
    감동원2021.07.01 23:13

    이애셋이 에셋 번들을 만드는게 아니라 폴더정리만한후 각 폴더의 내용을 빌드 하는 툴스 팝업창의 세팅에 각각 넣기만 하면 구글드라이버에 업로드 되고 저는 로더 씬만 따로 유니티 빌드하고 나머지 씬은 다 툴스에서 팝업창띄운후 따로 빌드하면 되는건가여?

    • 프로필사진
      스노우즈2021.07.04 16:16 신고

      네. 에셋 번들과 관계 없는 개인 패치 파일을 개인 서버(aws, ftp 등)에 업로드하는 것입니다. 모바일은 리소스 패치만 되고 코드 패치는 안 됩니다. 프로젝트에 사용하기 전에 충분히 테스트하고 사용하세요. 저는 aws 서버쪽 패치 폴더를 초기화하면서 정확한 패치가 잘 안되는 경우가 있었습니다. 패치 파일이 서버에 캐싱된 경우도 체크 하세요.