-
유니티6 구글 플레이 스토어 출시 마스터북 / Unity Google Play Store Publish Masterbook유니티 2025. 2. 22. 00:09
기대효과
해당 글은 항상 반복되는 모바일 출시 시 리젝이나 재빌드를 최대한 줄이기 위함이며
잘 따라하신다면 무리없이 구글 플레이스토어까지 출시할 것으로 기대합니다.
저는 지금까지 항상 모바일 시장 중 구글 플레이스토어에 대부분의 게임을 출시하며
험난한 출시과정 반복되는 피로감을 줄이기 위해 유니티6에 맞게 노하우를 정리하며 해당 글을 자세히 씁니다.
특히나 다양한 방식으로 리젝을 많이 경험하였기에 리젝을 피하는 노하우들을 모두 알려드리니 꼼꼼히 봐주세요.
스압주의
목차
- 구글 플레이스토어 개발자 등록 조건
- 사업자 등록증 인증
- 유니티6 빌드 셋팅
- 유니티6 프로젝트 셋팅
- 애드몹 광고 셋팅
- 개인정보처리방침 작성
- 구글 플레이 게임 서비스 (선택)
- 구글 플레이 콘솔 앱 설정
- 유니티 에디터에서 영상과 이미지 촬영
- 구글 플레이 콘솔 버전 생성 및 게시
- 출시 후 할일
- 축하드립니다
구글 플레이스토어 개발자 등록 조건
안드로이드 기반 모바일 게임을 개발해 구글 플레이스토어에 출시하기 위해서는
구글 플레이스토어 개발자 콘솔(https://play.google.com/console/developers)에 접근해야 합니다.
등록할 수 있는 조건은 다음과 같습니다.
- 만 18세 이상 성인
- 사업자 등록증
- 최초 등록 수수료 25달러 결제를 위한 비자카드 또는 마스터카드
사업자 등록증 인증
이제는 사업자 등록증이 필수가 되었습니다.
더불어 이미 기존에 구글 플레이스토어 계정이 있더라도
사업자 등록 번호를 입력해야만 기존에 있던 앱이 삭제되지 않습니다.
아직 사업자 등록증이 없다면 일단 90일 기한 연장을 누르시고
기한 내에 만드셔서 소중한 앱이 내려가지 않기를 바라겠습니다.
사업자 등록증을 만드실 때는
업종코드: 722001
업태: 정보통신업
업종: 유선 온라인 게임 소프트웨어 개발 및 공급업
일반과세자로 만들어야 합니다.
사업장 소재지에 사무실이 없으실 경우 본인이 살고 있는 집 주소를 적으시면 되겠습니다.
일반과세의 경우 한 장소에 한 사업자 등록증만 만들수 있기에 만약 내가 다른 장소를 빌려서
추가로 등록하고 싶은 경우에는 비상주 사무실에 요금을 내고 장소를 빌리는 방법도 있습니다.
해당 사업자 등록증은 구글 플레이스토어 뿐 아니라 스팀에서도 공통으로 사용이 가능합니다.
홈택스에서 사업자 등록 증명을 발급받아 열어보면
사업자 등록 번호에는 사업자 등록 번호를 넣으면되고
전자상거래 라이선스 번호에는 접수번호를 넣고
전자상거래 라이선스 대행사에는 담당부서를 넣었습니다.
또 진행중에 연락처 전화번호에는 +8210******** 으로
국가코드를 포함하여 본인 전화번호를 적고 문자나 전화로 인증하면 됩니다.
유니티6 빌드 셋팅
유니티 허브에서는 설치버전에서 안드로이드 모듈도 설치해 줍니다.
Android Build Support, OpenJDK, Android SDK & NDK Tools를 체크하고 설치해줍니다.
유니티 에디터를 열고 File - Build Profiles - Scene List에 빌드할 씬을 넣습니다.
File - Build Profiles - Android로 Switch Platform을 눌러 Active로 해줍니다.
Build App Bundle (Google Play)를 체크해 aab파일로 빌드가 되도록 합니다.
구글 플레이스토어는 aab파일만 업로드 가능하기 때문입니다.
체크하지 않으면 apk 파일로 나오며 안드로이드 모바일 기기에서 테스트할 때 사용할 수 있습니다.
void Awake() { Application.targetFrameRate = 60; }
씬에 존재하는 아무 스크립트에서 Awake에 타겟 프레임을 게임 사양에 맞게 30~60으로 고정합니다.
해당 작업을 하지 않으면 모바일에서 프레임이 아주 많이 끊깁니다.
유니티6 프로젝트 셋팅
Edit - Project Settings... - Player 상단에 회사명, 제품명, 버전, 아이콘을 입력합니다.
Resoltion and Presentation 탭
Resolution Scailng Mode를 Fixed DPI, Target DPI를 300으로 설정합니다.
버벅인다면 더 낮게 설정하실 수도 있습니다.
DPI는 인치당 도트수라는 뜻으로 최신에 나오는 핸드폰들은
크기는 손에 들 정도로 비슷하나 픽셀수가 촘촘해지고 많아지는 고해상도가 되기 때문에
그려야하는 픽셀의 개수가 많아져 버벅일 수가 있습니다.
그래서 크기에 따른 픽셀 개수를 고정하는 방법을 사용합니다.
Default Orientation은 해상도 방향을 설정합니다.
Portrait는 세로가 긴 게임을, Landscape는 가로가 긴 게임을 배치하면 되겠습니다.
AutoRotation을 선택하면 핸드폰 기울기에 따라 자동 회전이 됩니다.
Splash Image 탭
유니티 6가 등장함에 따라 누구든 게임을 실행하면
MADE WITH Unity라고 뜨는 스플래시 이미지를 끌 수 있게 되었습니다.
필요에 따라 Show Splash Screen을 체크해제합니다.
Other Settings 탭
Identification 부분에는
Override Default Package Name을 체크하고
Package Name에 모두 소문자로 `com.회사명.제품명`으로 작성합니다.
Bundle Version Code는 구글 플레이스토어에 올리고나서 업데이트를 할 때마다 1씩 증가시켜주어야 합니다.
Mininum API Level은 API level 23 이상으로 합니다.
구글 플레이스토어가 점점 구버전 지원을 중단하고 최소 지원버전을 올리고 있기에 업데이트 될 때 써 두겠습니다.
알 수 있는 방법은 aab빌드 파일을 구글 플레이스토어에 올릴 때 알려줍니다.
Configuration 부분에는
Scription Backend를 IL2CPP로 합니다.
IL2CPP란?
C# 스크립트를 C++스크립트로 변환하여 리버스 엔지니어링(핵, 치팅)이 어려워지고 성능이 향상됩니다.
기존 Mono 방식에 비해 보안강화, 성능 향상, 플랫폼 호환성 증가, 메모리 관리 최적화가 됩니다.API Compatibility Level은 .NET Standard 2.1로 하는게 더 넓은 범위여서 호환이 좋은데
.NET Framework는 .NET 4 API 및 .NET Framework 클래스 라이브러리를 포함하기에 최신 API가 필요하다면 바꾸세요.
Target Architectures에는 32비트와 64비트 메모리에서 모두 작동되도록 ARMv7과 ARM64를 체크합니다.
Publishing Settings 탭
본인 프로젝트임을 인증하기 위해 디지털 서명파일인 키스토어가 필요합니다.
각 프로젝트마다 하나씩 만드는 걸 추천드리며 저장된 파일 .keystore를 잃어버리면
더이상 구글 플레이스토어에서 업데이트가 불가하니 컴퓨터 폴더 경로에 잘 보관해두세요.
키스토어가 없는 상태일때
Keystore Manager... - Keystore... - Create New - Anywhere... - 저장할 폴더경로와 이름 지정
이름은 프로젝트명과 같게 소문자로 적어주면 구분하기 편합니다.
Alias에 user라고 하며 비밀번호를 입력하는 네 곳 모두 같게 입력하고 Add Key를 누릅니다.
키스토어가 있는 상태일 때
프로젝트를 닫다가 열어도 비밀번호가 지워져 있습니다.
빌드할 때 비밀번호를 입력해야 하므로 연결이 안되어 있다면
Select... - Browse...에서 프로젝트에서 사용했던 키스토어를 불러옵니다.
Alias는 user이고 비밀번호를 모두 입력합니다.
애드몹 광고 셋팅
여러분들이 구글 플레이스토어에 게임을 출시하실 때 아마 대부분 인앱결제는 없더라도
광고는 넣으실 거라고 생각하여 애드몹에 관한 내용에 대해서도 설명을 드리겠습니다.
모바일에서 광고가 뜨는 것 중 가장 유명하고 단가가 싸며 경쟁이 많은 곳은 단연 구글 애드몹(Admob)입니다.
모바일 게임 중 통상적으로 수익을 얻는 수단이기도 하구요.
구글 애드몹(https://admob.google.com/)에 구글로 로그인합니다.
지급 정보나 주소 확인 등 본인인증을 진행합니다.
앱 탭 - 앱 추가에서 플랫폼과 등록 여부를 선택합니다.
만약 iOS도 할거다 하시면 새 앱으로 또 만드시고 플랫폼을 iOS를 선택하면 됩니다.
유니티 에디터에서 작성한 패키지명과 동일하게 앱 이름을 입력합니다.
유니티 에디터 Edit - Project Settings... - Player - Other Settings - Identification - Package Name에서 찾을 수 있습니다.
앱 탭 - 본인의 패키지명 선택 - 광고단위 - 광고단위 추가
표시 광고수익 조건 표시 타이밍 배너 상단 혹은 하단 화면에 작게 표시 클릭시 아무때나 전면 화면을 꽉 채우는 5초이내의 짧게 표시 클릭시 아무때나 리워드 30초이내의 긴 영상이 표시 끝까지 시청한 경우 광고버튼 아이콘이 광고 모양이거나 문구여야 하며 광고버튼을 눌러야만 표시되어야 리젝당하지 않음 광고 단위 이름으로는 전면은 front, 리워드는 reward로 표기해도 됩니다.
그리고 애드몹 이외의 유니티 애즈나 페이스북등 다른 경쟁 광고사와 경쟁을 붙히는 방법으로
미디에이션이라는 게 존재하며 따로 연구도 진행하였지만
복잡하고 애드몹에 비해 단가가 많이 안좋아서 그냥 애드몹만 쓰는 게 나은 거 같습니다.
앱 설정 탭에서 앱 ID를 확인할 수 있으며 `~` 기호가 존재합니다.
광고단위 탭에서 광고단위 ID를 확인할 수 있으며 `/` 기호가 존재합니다.
본인의 앱 - 차단 관리 - 광고 콘텐츠 등급에서 잘 운영하던 게임이 광고 등급과 구글 개발자 콘솔에서 진행한 등급이 달라
한번 성인 광고가 떴다며 부적절한 등급으로 리젝당했기에 수정해줍니다.
계정 수준 설정 일치를 체크 해제하고 구글 플레이스토어 콘솔 등급 목적에 맞게 바꿉니다.
G: ~12세, 아동
T: 13~17세, 청소년
MA: 만 18세 이상, 성인
해당 이미지는 나중에 진행할 구글 타겟층 설정 설문지인데요.
만약 구글 타겟층을 13~15세, 16~17세, 만 18세 이상을 체크하실거라면
애드몹 광고 콘텐츠 등급은 가장 낮은 연령대의 등급인 T로 적용하셔야 합니다.
모든 연령대를 체크하실거라면 아동인 G로 하셔야 합니다.
테스트 기기를 설정하겠습니다.
이걸 하지 않으면 구글 개발자 콘솔의 계정과 본인 스마트폰의 구글 계정이 일치한 상태로 실제 광고를 보면
정지 사유가 되기에 꼭 애드몹 설정에서 테스트 기기를 설정해줍니다.
애드몹 전역 설정으로 한번 셋팅하면 다음에 또 셋팅하지 않아도 되어 안전합니다.
설정 탭 - 기기 테스트 - 테스트 기기 추가
기기 이름과 플랫폼, 광고 ID를 찾아서 넣어야 하는데요.
테스트 기기를 추가할 스마트폰 설정 - Google
모든 서비스 - 광고
이 기기의 광고 ID를 넣으시고 저장하면 됩니다.
유니티를 설정할 차례입니다.
구글 모바일 애즈(https://github.com/googleads/googleads-mobile-unity/releases)
깃 Releases에 있는 가장 최신버전의 .unitypackage파일을 다운받습니다.
다운받은 .unitypackage파일을 유니티 에디터의 Project로 드래그하고 Import합니다.
External Dependency Manager란?
외부 라이브러리를 관리하고 최신으로 유지합니다.
Google Play Services, Firebase 같은 곳에서 쓰이는데 패키지 Import할 때
기존에 External Dependency Manager가 존재했다면 덮어씌우지 않도록 체크해제하시기 바랍니다.Assets - External Dependency Manager - Android Resolver - Settings
맨 마지막으로 내리면 Verbose Logging을 체크해제하고 OK를 눌러 쓸데없는 콘솔로그가 찍히지 않도록 합니다.
Assets - Google Mobile Ads - Settings... - Google Mobile Ads App ID - Android에
애드몹 사이트 - 앱 설정 탭에 있는 앱 ID를 복붙합니다. `~`기호가 포함되어 있습니다.
만약 iOS도 만드셨다면 iOS에도 추가합니다.
AdmobManager.cs
using UnityEngine; using System; using System.Threading; using GoogleMobileAds.Api; public class AdmobManager : MonoBehaviour { [SerializeField] bool isRaunch; [SerializeField] bool isDetailLog; [SerializeField] string[] testDeviceIds; [SerializeField] string bannerIdAndroid; [SerializeField] string bannerIdIos; [SerializeField] string frontIdAndroid; [SerializeField] string frontIdIos; [SerializeField] string rewardIdAndroid; [SerializeField] string rewardIdIos; SynchronizationContext context; void Start() { context = SynchronizationContext.Current; if (IsAndroidAPK() && isRaunch) { isRaunch = false; if (isDetailLog) { Debug.Log("Android APK detected, disabling raunch mode."); } } RequestConfiguration requestConfiguration = new RequestConfiguration(); requestConfiguration.TestDeviceIds.AddRange(testDeviceIds); MobileAds.SetRequestConfiguration(requestConfiguration); MobileAds.Initialize(initStatus => { if (!string.IsNullOrEmpty(bannerIdAndroid) || !string.IsNullOrEmpty(bannerIdIos)) { LoadBannerAd(); } if (!string.IsNullOrEmpty(frontIdAndroid) || !string.IsNullOrEmpty(frontIdIos)) { LoadFrontAd(); } if (!string.IsNullOrEmpty(rewardIdAndroid) || !string.IsNullOrEmpty(rewardIdIos)) { LoadRewardAd(); } }); } bool IsAndroidAPK() { string bundleId = Application.identifier; return bundleId.EndsWith(".apk"); } #region Banner Ad BannerView bannerAd; public void LoadBannerAd() { #if UNITY_ANDROID string bannerId = bannerIdAndroid; string bannerIdTest = "ca-app-pub-3940256099942544/6300978111"; #elif UNITY_IPHONE || UNITY_IOS string bannerId = bannerIdIos; string bannerIdTest = "ca-app-pub-3940256099942544/2934735716"; #endif string finalBannerId = isRaunch ? bannerId : bannerIdTest; if (bannerAd != null) { bannerAd.Destroy(); } bannerAd = new BannerView(finalBannerId, AdSize.Banner, AdPosition.Bottom); bannerAd.LoadAd(new AdRequest()); if (isDetailLog) { Debug.Log("Banner ad loading..."); } } public void ShowBannerAd(bool show) { if (bannerAd != null) { if (show) { bannerAd.Show(); } else { bannerAd.Hide(); } } else { if (isDetailLog) { Debug.Log("Banner ad not loaded."); } if (show) { LoadBannerAd(); } } } #endregion #region Front Ad InterstitialAd frontAd; public void LoadFrontAd() { #if UNITY_ANDROID string frontId = frontIdAndroid; string frontIdTest = "ca-app-pub-3940256099942544/1033173712"; #elif UNITY_IPHONE || UNITY_IOS string frontId = frontIdIos; string frontIdTest = "ca-app-pub-3940256099942544/4411468910"; #endif string finalFrontId = isRaunch ? frontId : frontIdTest; InterstitialAd.Load(finalFrontId, new AdRequest(), (InterstitialAd ad, LoadAdError loadError) => { if (ad == null || loadError != null) { if (isDetailLog) { Debug.Log($"Interstitial ad failed to load: {loadError?.GetMessage()}"); } return; } if (isDetailLog) { Debug.Log("Interstitial ad loaded."); } frontAd = ad; }); } public void ShowFrontAd() { if (frontAd != null && frontAd.CanShowAd()) { frontAd.Show(); } else { if (isDetailLog) { Debug.Log("Interstitial ad cannot be shown."); } } LoadFrontAd(); } #endregion #region Reward Ad RewardedAd rewardAd; public void LoadRewardAd() { #if UNITY_ANDROID string rewardId = rewardIdAndroid; string rewardIdTest = "ca-app-pub-3940256099942544/5224354917"; #elif UNITY_IPHONE || UNITY_IOS string rewardId = rewardIdIos; string rewardIdTest = "ca-app-pub-3940256099942544/1712485313"; #endif string finalRewardId = isRaunch ? rewardId : rewardIdTest; RewardedAd.Load(finalRewardId, new AdRequest(), (RewardedAd ad, LoadAdError loadError) => { if (ad == null || loadError != null) { if (isDetailLog) { Debug.Log($"Rewarded ad failed to load: {loadError?.GetMessage()}"); } return; } if (isDetailLog) { Debug.Log("Rewarded ad loaded."); } rewardAd = ad; }); } public void ShowRewardAd(Action<bool> completed) { if (rewardAd != null && rewardAd.CanShowAd()) { rewardAd.Show((Reward reward) => { context.Post(o => { if (isDetailLog) { Debug.Log($"Rewarded ad granted a reward: {reward.Amount}"); } completed?.Invoke(true); }, null); }); } else { if (isDetailLog) { Debug.Log("Rewarded ad cannot be shown."); } completed?.Invoke(false); } LoadRewardAd(); } #endregion }
AdmobManager 스크립트를 작성후 씬에 빈 게임오브젝트 AdmobManager라고 이름을 변경하고 해당 스크립트를 넣습니다.
테스트용 광고 아이디는 https://developers.google.com/admob/unity/test-ads 에서 확인가능합니다.
Start에서 배너, 전면, 리워드 아이디 중 존재하는 영역의 광고를 로드합니다.
Load에서는 각 광고를 불러옵니다.
Show에서는 각 광고를 띄웁니다. Show를 호출하자마자 내부적으로 다음 광고를 Load 합니다.
isRaunch: 실제 구글 플레이스토어 업로드 할 때 true, apk로 테스트 광고를 띄울 때 false
isDetailLog: 상세 로그를 보고 싶을 때 true
testDeviceIds: 테스트 디바이스 아이디를 넣는데 찾기가 까다로우므로
위에서 진행했던 애드몹에 테스트 기기를 추가하는 설정을 하셨다면 안하셔도 됩니다.
bannerIdAndroid: 배너광고 ID 안드로이드
bannerIdIos: 배너광고 ID IOS
frontIdAndroid: 전면광고 ID 안드로이드
frontIdIos: 전면광고 ID IOS
rewardIdAndroid: 리워드광고 ID 안드로이드
rewardIdIos: 리워드광고 ID IOS없을경우 빈칸으로 남겨두시면 됩니다.
광고까지 넣었으면 프로젝트 셋팅에서도 광고가 포함되었음을 메타데이터로 알려줘야 리젝당하지 않습니다.
Edit - Project Settings... - Player - Publishing Settings에서
Custom Main Manifest를 체크하고 바로 아래줄에 나타난 경로에 있는
Assets\Plugins\Android\AndroidManifest.xml파일을 엽니다.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player" xmlns:tools="http://schemas.android.com/tools"> <application> <activity android:name="com.unity3d.player.UnityPlayerActivity" android:theme="@style/UnityThemeSelector"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> </activity> </application> <uses-permission android:name="com.google.android.gms.permission.AD_ID" /> </manifest>
manifest 블럭 바로 하위에
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />
를 추가하여 광고가 포함되어있음을 메타데이터에 포함시킵니다.
application 블럭에 넣으시면 안됩니다.
이제 애드몹 광고 셋팅이 완료되었습니다.
개인정보처리방침 작성
개인정보처리방침을 한번 만들어 놓으면 여러 게임에 공통으로 사용하실 수 있습니다.
특정 개인정보 접근 권한이 다른 경우 따로 만들 수 있습니다.
<COMPANY_NAME>('SITE_LINK '이하 'COMPANY_NAME') 은(는) 「개인정보 보호법」 제30조에 따라 정보주체의 개인정보를 보호하고 이와 관련한 고충을 신속하고 원활하게 처리할 수 있도록 하기 위하여 다음과 같이 개인정보 처리방침을 수립·공개합니다. ○ 이 개인정보처리방침은 DATE부터 적용됩니다. 제1조(개인정보의 처리 목적) <COMPANY_NAME>('SITE_LINK'이하 'COMPANY_NAME') 은(는) 다음의 목적을 위하여 개인정보를 처리합니다. 처리하고 있는 개인정보는 다음의 목적 이외의 용도로는 이용되지 않으며 이용 목적이 변경되는 경우에는 「개인정보 보호법」 제18조에 따라 별도의 동의를 받는 등 필요한 조치를 이행할 예정입니다. 1. 재화 또는 서비스 제공 앱 사용 서비스 제공을 목적으로 개인정보를 처리합니다. 제2조(개인정보의 처리 및 보유 기간) ① <COMPANY_NAME> 은(는) 법령에 따른 개인정보 보유·이용기간 또는 정보주체로부터 개인정보를 수집 시에 동의받은 개인정보 보유·이용기간 내에서 개인정보를 처리·보유합니다. ② 각각의 개인정보 처리 및 보유 기간은 다음과 같습니다. 제3조(처리하는 개인정보의 항목) ① <COMPANY_NAME> 은(는) 다음의 개인정보 항목을 처리하고 있습니다. 제4조(개인정보의 파기절차 및 파기방법) ① <COMPANY_NAME>은(는) 개인정보 보유기간의 경과, 처리목적 달성 등 개인정보가 불필요하게 되었을 때에는 지체없이 해당 개인정보를 파기합니다. ② 정보주체로부터 동의받은 개인정보 보유기간이 경과하거나 처리목적이 달성되었음에도 불구하고 다른 법령에 따라 개인정보를 계속 보존하여야 하는 경우에는, 해당 개인정보를 별도의 데이터베이스(DB)로 옮기거나 보관장소를 달리하여 보존합니다. 1. 법령 근거 : 2. 보존하는 개인정보 항목 : 계좌정보, 거래날짜 ③ 개인정보 파기의 절차 및 방법은 다음과 같습니다. 1. 파기절차 <COMPANY_NAME> 은(는) 파기 사유가 발생한 개인정보를 선정하고, <COMPANY_NAME>의 개인정보 보호책임자의 승인을 받아 개인정보를 파기합니다. 2. 파기방법 제5조(정보주체와 법정대리인의 권리·의무 및 그 행사방법에 관한 사항) ① 정보주체는 COMPANY_NAME에 대해 언제든지 개인정보 열람·정정·삭제·처리정지 요구 등의 권리를 행사할 수 있습니다. ② 제1항에 따른 권리 행사는COMPANY_NAME에 대해 「개인정보 보호법」 시행령 제41조제1항에 따라 서면, 전자우편, 모사전송(FAX) 등을 통하여 하실 수 있으며 COMPANY_NAME은(는) 이에 대해 지체 없이 조치하겠습니다. ③ 제1항에 따른 권리 행사는 정보주체의 법정대리인이나 위임을 받은 자 등 대리인을 통하여 하실 수 있습니다.이 경우 “개인정보 처리 방법에 관한 고시(제2020-7호)” 별지 제11호 서식에 따른 위임장을 제출하셔야 합니다. ④ 개인정보 열람 및 처리정지 요구는 「개인정보 보호법」 제35조 제4항, 제37조 제2항에 의하여 정보주체의 권리가 제한 될 수 있습니다. ⑤ 개인정보의 정정 및 삭제 요구는 다른 법령에서 그 개인정보가 수집 대상으로 명시되어 있는 경우에는 그 삭제를 요구할 수 없습니다. ⑥ COMPANY_NAME은(는) 정보주체 권리에 따른 열람의 요구, 정정·삭제의 요구, 처리정지의 요구 시 열람 등 요구를 한 자가 본인이거나 정당한 대리인인지를 확인합니다. 제6조(개인정보의 안전성 확보조치에 관한 사항) <COMPANY_NAME> 은(는) 개인정보의 안전성 확보를 위해 다음과 같은 조치를 취하고 있습니다. 1. 내부관리계획의 수립 및 시행 개인정보의 안전한 처리를 위하여 내부관리계획을 수립하고 시행하고 있습니다. 2. 개인정보 취급 직원의 최소화 및 교육 개인정보를 취급하는 직원을 지정하고 담당자에 한정시켜 최소화 하여 개인정보를 관리하는 대책을 시행하고 있습니다. 제7조(개인정보를 자동으로 수집하는 장치의 설치·운영 및 그 거부에 관한 사항) COMPANY_NAME 은(는) 정보주체의 이용정보를 저장하고 수시로 불러오는 ‘쿠키(cookie)’를 사용하지 않습니다. 제8조(행태정보의 수집·이용·제공 및 거부 등에 관한 사항) 행태정보의 수집·이용·제공 및 거부등에 관한 사항 <개인정보처리자명>은(는) 온라인 맞춤형 광고 등을 위한 행태정보를 수집·이용·제공하지 않습니다. 제9조(추가적인 이용·제공 판단기준) <COMPANY_NAME> 은(는) 「개인정보 보호법」 제15조제3항 및 제17조제4항에 따라 「개인정보 보호법 시행령」 제14조의2에 따른 사항을 고려하여 정보주체의 동의 없이 개인정보를 추가적으로 이용·제공할 수 있습니다. 이에 따라 <COMPANY_NAME>가(이) 정보주체의 동의 없이 추가적인 이용·제공을 하기 위해서 다음과 같은 사항을 고려하였습니다. ▶ 개인정보를 추가적으로 이용·제공하려는 목적이 당초 수집 목적과 관련성이 있는지 여부 ▶ 개인정보를 수집한 정황 또는 처리 관행에 비추어 볼 때 추가적인 이용·제공에 대한 예측 가능성이 있는지 여부 ▶ 개인정보의 추가적인 이용·제공이 정보주체의 이익을 부당하게 침해하는지 여부 ▶ 가명처리 또는 암호화 등 안전성 확보에 필요한 조치를 하였는지 여부 ※ 추가적인 이용·제공 시 고려사항에 대한 판단기준은 사업자/단체 스스로 자율적으로 판단하여 작성·공개함 제10조(가명정보를 처리하는 경우 가명정보 처리에 관한 사항) <COMPANY_NAME>은(는) 다음과 같은 목적으로 가명정보를 처리하고 있습니다. ▶ 가명정보의 처리 목적 - 직접작성 가능합니다. ▶ 가명정보의 처리 및 보유기간 - 직접작성 가능합니다. ▶ 가명정보의 제3자 제공에 관한 사항(해당되는 경우에만 작성) - 직접작성 가능합니다. ▶ 가명정보 처리의 위탁에 관한 사항(해당되는 경우에만 작성) - 직접작성 가능합니다. ▶ 가명처리하는 개인정보의 항목 - 직접작성 가능합니다. ▶ 법 제28조의4(가명정보에 대한 안전조치 의무 등)에 따른 가명정보의 안전성 확보조치에 관한 사항 - 직접작성 가능합니다. 제11조 (개인정보 보호책임자에 관한 사항) ① COMPANY_NAME 은(는) 개인정보 처리에 관한 업무를 총괄해서 책임지고, 개인정보 처리와 관련한 정보주체의 불만처리 및 피해구제 등을 위하여 아래와 같이 개인정보 보호책임자를 지정하고 있습니다. ▶ 개인정보 보호책임자 성명 :YOUR_NAME 직책 :YOUR_POSITION 직급 :YOUR_POSITION 연락처 :YOUR_PHONE, YOUR_EMAIL, ※ 개인정보 보호 담당부서로 연결됩니다. ▶ 개인정보 보호 담당부서 부서명 : 담당자 : 연락처 :, , ② 정보주체께서는 COMPANY_NAME 의 서비스(또는 사업)을 이용하시면서 발생한 모든 개인정보 보호 관련 문의, 불만처리, 피해구제 등에 관한 사항을 개인정보 보호책임자 및 담당부서로 문의하실 수 있습니다. COMPANY_NAME 은(는) 정보주체의 문의에 대해 지체 없이 답변 및 처리해드릴 것입니다. 제12조(국내대리인의 지정) 정보주체는 「개인정보 보호법」 제39조의11에 따라 지정된 <COMPANY_NAME> 의 국내대리인에게 개인정보 관련 고충처리 등의 업무를 위하여 연락을 취할 수 있습니다. <COMPANY_NAME> 은(는) 정보주체의 개인정보 관련 고충처리 등 개인정보 보호책임자의 업무 등을 신속하게 처리할 수 있도록 노력하겠습니다. ▶ <COMPANY_NAME>은(는) 「개인정보 보호법」 제39조의11에 따라 국내대리인을 지정하였습니다. - 국내대리인의 성명 : [대리인 성명_직접입력] (법인의 경우 법인명, 대표자의 성명) - 국내대리인의 주소 : [대리인 주소_직접입력] (법인의 경우 영업소 소재지) - 국내대리인의 전화번호 : [대리인 전화번호_직접입력] - 국내대리인의 전자우편 주소 : [대리인 전자우편_직접입력] 제13조(개인정보의 열람청구를 접수·처리하는 부서) 정보주체는 「개인정보 보호법」 제35조에 따른 개인정보의 열람 청구를 아래의 부서에 할 수 있습니다. <COMPANY_NAME> 은(는) 정보주체의 개인정보 열람청구가 신속하게 처리되도록 노력하겠습니다. ▶ 개인정보 열람청구 접수·처리 부서 부서명 : 담당자 : 연락처 : , , 제14조(정보주체의 권익침해에 대한 구제방법) 정보주체는 개인정보침해로 인한 구제를 받기 위하여 개인정보분쟁조정위원회, 한국인터넷진흥원 개인정보침해신고센터 등에 분쟁해결이나 상담 등을 신청할 수 있습니다. 이 밖에 기타 개인정보침해의 신고, 상담에 대하여는 아래의 기관에 문의하시기 바랍니다. 1. 개인정보분쟁조정위원회 : (국번없이) 1833-6972 (www.kopico.go.kr) 2. 개인정보침해신고센터 : (국번없이) 118 (privacy.kisa.or.kr) 3. 대검찰청 : (국번없이) 1301 (www.spo.go.kr) 4. 경찰청 : (국번없이) 182 (ecrm.cyber.go.kr) 「개인정보보호법」제35조(개인정보의 열람), 제36조(개인정보의 정정·삭제), 제37조(개인정보의 처리정지 등)의 규정에 의한 요구에 대 하여 공공기관의 장이 행한 처분 또는 부작위로 인하여 권리 또는 이익의 침해를 받은 자는 행정심판법이 정하는 바에 따라 행정심판을 청구할 수 있습니다. ※ 행정심판에 대해 자세한 사항은 중앙행정심판위원회(www.simpan.go.kr) 홈페이지를 참고하시기 바랍니다. 제15조(영상정보처리기기 운영·관리에 관한 사항) ① <COMPANY_NAME>은(는) 아래와 같이 영상정보처리기기를 설치·운영하고 있습니다. 1.영상정보처리기기 설치근거·목적 : <COMPANY_NAME> 의 2.설치 대수, 설치 위치, 촬영 범위 : 설치대수 : 대 설치위치 : 촬영범위 : 3.관리책임자, 담당부서 및 영상정보에 대한 접근권한자 : 4.영상정보 촬영시간, 보관기간, 보관장소, 처리방법 촬영시간 : 시간 보관기간 : 촬영시부터 보관장소 및 처리방법 : 5.영상정보 확인 방법 및 장소 : 6.정보주체의 영상정보 열람등요구에 대한 조치 : 개인영상정보 열람.존재확인 청구서로 신청하여야 하며, 정보주체 자신이 촬영된 경우 또는 명백히 정보주체의 생명.신체.재산 이익을 위해 필요한 경우에 한해 열람을 허용함 7.영상정보처리기기 설치근거·목적 : 제16조(개인정보 처리방침 변경) ① 이 개인정보처리방침은 DATE부터 적용됩니다. ② 이전의 개인정보 처리방침은 아래에서 확인하실 수 있습니다. 예시 ) - 20XX. X. X ~ 20XX. X. X 적용 (클릭) 예시 ) - 20XX. X. X ~ 20XX. X. X 적용 (클릭) 예시 ) - 20XX. X. X ~ 20XX. X. X 적용 (클릭)
위 개인정보처리방침 템플릿은 구글 플레이스토어에 올라가는 일반적인 앱과 게임에 관련한 템플릿입니다.
한번 읽어보시고 수정해야할 사항이 있으시면 수정하셔도 좋습니다.
COMPANY_NAME : 회사명, 사업자 등록증 이름도 좋습니다.
SITE_LINK : 본인을 표현하는 사이트 대표 링크, 블로그 링크도 괜찮습니다.
DATE : 날짜, 예시) 2025년 1월 1일
YOUR_NAME : 성명
YOUR_POSITION : 직책, 예시) 대표
YOUR_PHONE : 연락처, 예시) 010********
YOUR_EMAIL : 이메일메모장에 복붙하시고 대문자로 쓰인 부분을 Ctrl + H를 눌러 본인 것으로 모두 바꾸기로 바꾸세요.
접근가능한 URL 링크로 구글플레이스토어에 등록해야 하므로
본인이 운영하는 사이트, 네이버 블로그, 티스토리 블로그, 구글 블로그에
제목을 `개인정보처리방침`이라고 쓰고 공개된 링크를 제공하는 방법도 있으나
구글 사이트를 이용해 간지나게 할 수도 있습니다.
구글 사이트(https://sites.google.com/)에서 빈 사이트를 누릅니다.
제목과 상단에 텍스트박스에 `개인정보처리방침`이라고 작성합니다.
아래 내용부분에 텍스트상자를 하나 넣어서 여러분이 메모장으로 편집한 개인정보처리방침 내용을 넣으시면 됩니다.
게시 - 웹 주소를 입력합니다. 보통 `회사명영문이름-privacy`라고 작성합니다.
공개 검색엔진에 내 사이트가 표시되지 않도록 요청을 상황에 따라 체크하고 게시를 누릅니다.
게시 옆에 화살표를 눌러 게시된 사이트 보기를 누르면
https://sites.google.com/view/당신의사이트명/%ED%99%88 스타일로 나옵니다.
이제 이 링크를 구했으니 개인정보처리방침이 완료되었습니다.
구글 플레이 게임 서비스 (선택)
유니티 GPGS 구글 플레이 게임 서비스의 모든것 - 2021.11월 (https://youtu.be/aCG5nixgyVw?si=mKo57VwLhz5GdIn9)
구글 플레이 게임 서비스(Google Play Game Service) 줄여서 GPGS는
구글 플레이 스토어 전용 로그인 클라우드 저장, 업적, 리더보드, 이벤트가 포함되어 있는데요. 무료입니다.
필수는 아니나 꼭 필요하다면 해당 영상을 참고하시기 바랍니다.
오래된 영상이니 방법만 아시면 되겠습니다.
저는 포함시키지 않았습니다.
구글 플레이 콘솔 앱 설정
이제 구글 플레이 콘솔(https://play.google.com/console)에 등록하겠습니다.
구글 플레이 콘솔은 수시로 UI와 이름이 바뀌기 때문에 여러분들도 그에 맞게 대응하시면 됩니다.
통째로 짚고 넘어가도록 하겠습니다.
홈 탭 - 앱 만들기
앱 세부정보를 입력합니다.
대시보드 - 앱 설정 - 할 일 보기를 보면 굉장히 설정할게 많죠.
저걸 다 진행해야 하니 하나하나 클릭해서 진행하고 저장 후 대시보드 돌아와서 다음 진행하는 걸 반복하시면 됩니다.
개인정보처리방침 설정
개인정보처리방침 URL을 넣습니다.
앱 액세스 권한
앱 액세스 권한을 설정합니다.
광고
광고가 있는지 설정합니다.
콘텐츠 등급
IARC에서 무료로 등급 분류를 해줍니다.
설문지 시작을 누릅니다.
카테고리를 설정합니다.
설문지를 진행합니다.
등급을 부여받았습니다.
타겟층
13세 미만 아동을 대상으로 하면 개발자 정책센터(https://play.google/developer-content-policy/)의 가족 정책을 만족해야 합니다.
특히 애드몹 광고에서 아동 타겟만 광고가 나오도록 설정해야 하며 그렇지 않은 경우 리젝됩니다.
위에서 진행했던 등급을 기준으로 청소년과 만 18세 이상 성인을 구분지으면 됩니다.
모든 연령대를 대상으로 하면 특히 애드몹 광고 타겟이 아동 타겟으로 나오도록 하셔야 합니다.
뉴스 앱
뉴스 앱인지 설정합니다.
데이터 보안
필수 사용자 데이터 유형을 수집하는 질문이 나옵니다.
구글 플레이 데이터보안 섹션 정보 제공(https://support.google.com/googleplay/android-developer/answer/10787469?hl=ko#types&zippy=%2C%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9C%A0%ED%98%95)
로컬 저장을 제외한 위치, 개인정보, 금융정보, 사진, 동영상, 오디오파일, 연락처 등을 수집하는지 설문을 진행합니다.
필수 사용자 데이터 유형을 수집하는지 설정합니다.
정부 앱
정부 앱인지 설정합니다.
금융 기능
금융 기능이 있는지 설정합니다.
건강
건강 기능이 있는지 설정합니다.
앱 카테고리 선택 및 연락처 세부정보 제공
수정과 태그 관리를 눌러 입력합니다.
애드몹 광고 수익 제한을 해제하기 위해선 웹사이트에 본인 사이트임을 인증하는 작업이 필요한데요.
이 페이지의 맨 아래 있는 출시 후 할일 부분을 최초 한번 하시고 웹사이트에 등록하시길 추천드립니다.
스토어 등록정보
맨 위에 기본 언어를 설정하실 수 있고 언어를 여러개 선택해 다양한 언어에도 대응할 수 있습니다.
등록정보를 작성합니다.
앱 아이콘은 PNG 또는 JPEG, 최대 1MB, 512 X 512px 이어야 합니다.
권장하는 메인 아이콘 크기는 512px의 0.75배인 384px 크기가 적합합니다.
디자인 사양 참고 (https://developer.android.com/distribute/google-play/resources/icon-design-specifications?hl=ko)
그래픽 이미지는 PNG 또는 JPEG, 최대 15MB, 1024px X 500px 이어야 합니다.
동영상 미리보기의 표지 이미지, 공유할 때 나타나는 가로가 긴 그래픽 이미지입니다.
동영상은 선택입니다.
가로가 긴 게임은 가로 유튜브 영상으로, 세로가 긴 영상은 유튜브 쇼츠로 트레일러를 보여줍니다.
유튜브 공유링크를 넣으시면 되고 공개 또는 일부 공개여야 하며 광고는 사용 중지되어 있고 연령 제한이 없어야 합니다.
권장하는 이미지 크기 요약
- 앱 아이콘 1개: PNG 또는 JPEG, 최대 1MB, 512 X 512px, 메인 아이콘 384px
- 그래픽 이미지 1개: PNG 또는 JPEG, 최대 15MB, 1024px X 500px
- 스크린샷 4~8개: PNG 또는 JPEG, 장당 최대 8MB, 가로세로 비율 16:9 또는 9:16, 1080px ~ 3840px 사이유니티 에디터에서 영상과 이미지 촬영
권장 사이즈 스크린샷이나 동영상을 어떻게 촬영하지 하는 막막한 고민을 해결해주는 방법이 있는데요.
유니티 에디터에서 고해상도로 스크린샷이나 영상 촬영을 하실 수 있습니다.
바로 유니티 Recorder입니다.
저는 이걸 알기 전에 세로 고화질 영상 촬영을 위해 모니터를 90도 뒤집에서 OBS로 촬영했었답니다 T^T
Window - Package Manager - Unity Registry에서 Recorder 검색 및 설치
Window - General - Recorder - Recorder Window
Exit Play Mode 체크해제, Target FPS 30 ~ 60으로 설정합니다.
+ Add Recorder를 눌러서 Movie는 영상 촬영, Image Sequence는 스크린샷 촬영, Audio는 소리 추출입니다.
추가한 레코더는 우클릭 Delete로 삭제하실 수 있습니다.
Movie로 선택하면 영상촬영을 진행합니다.
Recording Mode를 Manual로 설정합니다.
게임뷰 해상도 크기만큼으로 녹화가 됩니다.
게임 플레이 중간에서 촬영해도 되고 START RECORDING을 눌러 시작과 함께 촬영해도 됩니다.
녹화를 시작하고 싶을 때 START RECORDING, 종료하고 싶을 때 STOP RECORDING을 누릅니다.
Output File의 Path 경로 바로가기 버튼을 눌러 저장된 파일을 확인하실 수 있습니다.
Image Sequence로 선택하면 스크린샷 촬영을 진행합니다.
한 프레임만 촬영하고 싶으니 Recording Mode를 Single Frame으로 합니다.
Media File Format을 JPEG나 PNG로 합니다.
게임 플레이 중에 스크린샷 촬영을 하고 싶을 때 START RECORDING을 누르면 됩니다.
Output File의 Path 경로 바로가기 버튼을 눌러 저장된 파일을 확인하실 수 있습니다.
구글 플레이 콘솔 버전 생성 및 게시
구글 플레이스토어 앱 설정 과정을 완료하였으면 이제는 aab파일을 업로드할 차례입니다.
대시보드로 돌아가면 내부테스트, 사전 등록, 버전 생성 및 게시, Play 게임즈 서비스 등 다양한 게 많은데요.
우리는 바로 게임을 출시하고 싶기 때문에 버전 생성 및 게시를 하겠습니다.
할 일 보기를 누르고 하나씩 진행합니다.
하나씩 할 일을 하고 저장 후 대시보드로 돌아와 다음걸 진행하는 걸 반복하면 됩니다.
국가 및 지역 선택
국가/지역 추가 클릭
출시할 국가들을 선택합니다.
새 버전 만들기
새 버전 만들기 클릭
앱 무결성에 자동 보호 할건지 물어보면 사용해 줍니다.
App Bundle에 유니티에서 빌드한 최종 aab파일을 업로드 하시면 됩니다.
추후 앱 업데이트 시 유니티 에디터의 Edit - Project Settings... - Player - Other Settings에서
Version과 Bundle Version Code를 증가시키고 aab 빌드후 업로드 하시기 바랍니다.
출시명은 자동으로 되며 출시 노트에 새 버전에 뭐가 추가되었는지 적어줍니다.
이전 버전에서 복사 버튼을 누르면 이전버전이 복사가 됩니다.
출시 노트 언어코드 예시
<ko-KR>
출시 노트를 여기에 입력하세요.
</ko-KR>
<en-US>
Enter your release notes here.
</en-US>
<ja-JP>
リリースノートをここに入力してください。
</ja-JP>출시 개요
이제 대시보드에 가보면 바뀌어 있습니다.
게시 개요로 이동을 누릅니다.
AndroidManifest에서 광고를 사용했다 선언하면 빨강으로 발견된 문제 1개가 뜨니 문제보기를 누릅니다.
선언 작성 클릭
상황에 맞게 선택해줍니다.
검토를 위해 변경사항 N개 전송을 클릭하여 검토를 맡깁니다.
만약 리젝사유가 있다거나 문제가 있으면 앱 설정에서 입력한 이메일로 메일이 올 것이니 확인 후 다시 앱을 업로드 하시면 됩니다.
정상적으로 출시되면 출시됐다는 메일이 옵니다.
구글 개발자 콘솔 - 홈 탭으로 가면 업데이트 상태에 `검토 중`이라고 뜹니다.
하루이상 기다리시면 심사가 완료됩니다.
출시 후 할일
앱 설정에서 입력한 메일로 IARC 심사가 정상적으로 완료되었다고 하면 완료된 것입니다.
정상적으로 출시되면 앱 상태에 `프로덕션`이라고 뜨게 됩니다.
이 과정만으로도 앱이 정상적으로 작동하지만 우리는 웹사이트가 인증되지 않으면 광고가 더 적게 송출됩니다.
애드몹 수익에 최대효과를 끌어내기 위해 웹 사이트에 ads.txt가 있음을 인증해주는 작업이 필요한데요.
구글 애드몹 사이트 앱 탭 - 모든 앱 보기에서 app-ads.txt 설정하기 클릭
다음 나타난 코드 스니펫을 복사합니다.
구글 블로그(https://www.blogger.com/)에 새 블로그를 만들겠습니다.
기존 구글 블로그가 있다면 기존 구글 블로그에 하셔도 됩니다.
설정 - 수익 창출 - 맞춤 ads.txt 사용 설정 체크 - 맞춤 ads.txt 클릭
애드몹에서 복사한 코드 스니펫을 붙혀 넣고 저장합니다.
또 설정 탭에 오류 및 리디렉션 - 맞춤 리디렉션 - 추가 클릭
올린이 `app-ads.txt`, 받는사람 `ads.txt`로 적고 확정도 체크하고 확인 - 저장합니다.
블로그 보기 탭을 누릅니다.
주소창 맨 뒤에 /ads.txt를 검색하면 정상적으로 코드 스니펫이 나와야 합니다.
구글 플레이 콘솔 - 출시된 앱을 누르고 사용자늘리기 - 앱 정보 - 스토어 설정 클릭
스토어 등록정보 연락처 세부정보에서 수정 클릭
웹 사이트에 본인의 ads.txt를 확인할 수 있는 사이트 주소 루트경로를 입력합니다.
애드몹 사이트 앱 탭에서 본인의 앱을 선택하고 앱 설정에 들어갑니다.
앱 스토어 세부정보에서 추가를 클릭합니다.
앱 이름이나 패키지명 이름으로 검색해 출시된 앱을 알려줍니다.
구글 플레이 콘솔 스토어 등록정보를 이렇게 나중에 수정하셨다면 바로 확인이 안되기 때문에
1시간이나 하루 이후 업데이트 확인을 해 주시고 인증해 주시기 바랍니다.
앱 탭 - 모든 앱 보기에서 보이는 승인 상태 예시인데요.
준비됨이면 광고 제한이 없습니다.
검토 필요의 경우 광고 게제가 제한이 있어서 ads.txt를 인증하는 작업이 필요합니다.
준비 중이면 검토중인 과정인 것이구요.
축하드립니다
드디어 구글 플레이스토어에 게임을 `하나` 출시했습니다.
구글 플레이스토어에 게임을 출시할 때마다 이 글을 보시는 것도 추천드립니다.
리젝 사유들을 모르신다면 아마 여러분 시간도 많이 날리실 것으로 예상되는데
도움이 되고자 열심히 작성했으니 `좋아요` 하나만 부탁드립니다.
'유니티' 카테고리의 다른 글