강의 정리

[Unity] 빌드하기, 광고 붙이기, 에셋스토어

lhgenol 2025. 2. 3. 22:29

빌드하기(5-4)

apk 빌드하기

  • 오늘은 만들어 놓은 게임을 빌드해 보자.
  • 빌드를 하게 되면 다양한 플랫폼에서 실행시킬 수 있는 파일로 추출이 되고, 이 추출된 파일을 통해서 심사를 받고 론칭을 할 수 있다.
  • 안드로이드 빌드에 대해서 살펴보자.
    • 메뉴에서 File -> Build Settings로 들어가면 현재 MainScene만 있다. 빌드를 해 줄 씬들을 여기에다 추가를 해줘야 함. Add Open Scenes 클릭. 그럼 StartScene이 추가됐다.
    • 그런데 StartScene이 가장 먼저 실행돼야 하니까 맨 위로 끌어올려 준다.
    • 그리고 안드로이드 빌드를 한다고 했으니 플랫폼을 Android로 바꿔주고 Switch Platform 클릭
    • 이러면 플랫폼이 바뀌었다. 플랫폼을 바꾸게 되면 기존에 세팅해 놨던 게임 Scene 창의 설정이 풀리게 됨. 그래서 다시 Phone으로 변경.
    • Phone 비율로 바꾸고 다시 Build Settings으로 들어가서 Player Settings 버튼을 누르면 빌드에 필요한 여러가지 정보들을 세팅할 수 있는 창이 뜨게 된다.
    • Company Name: SpartaCodingClub, Product Name: FindRtan, Version: 1.0
    • Default icon -> spartaMsg로 설정
  • Resolution 설정 창을 열어 세부 세팅을 해주자.
    • 휴대폰은 해상도가 세로로 길다. Portrait가 세로로 길다는 거고 Landscape가 가로로 긴 비율을 말하는 것. Landscape는 꺼 주자.
  • Other Settings 설정 창을 열어 세부 세팅을 해주자.
    • 안드로이드 마켓에 출시하기 위해서는 ARM64 옵션이 추가가 돼야 함. 이 옵션을 활성화하기 위해서는 Scripting Backend 옵션을 IL2CPP로 설정해 준다. 그러면 ARM64가 활성화 됨. 체크해 주자.
    • 이러면 경고창이 뜬다. Package Name을 입력해 주라고 뜨고, 어떤 형식으로 입력하면 되는지 알려줌. com.SpartaCodingClub.FindRtan 입력
  • 마지막으로 Publishing Setting 옵션까지 설정해 주자.
    • Keystore Manager 버튼 클릭 -> Keystore... -> Crate New -> Anywhere -> 프로젝트 만든 경로에 생성
    • Keystore란 안드로이드에서 앱을 배포할 수 있는 일종의 인증키. 임의로 비밀번호 입력하고 New Key Values도 추가하자. 'spartaKey', 비밀번호 입력
    • 이러면 Add Key라는 버튼이 활성화된다. 클릭 -> Yes
  • 이러면 Key 세팅도 완료됐다. 빌드 준비 거의 끝.
  • 메뉴 -> Edit -> Preferences -> External Tool -> 안드로이드 옵션들이 있다. JDK, SDK, NDK 등 다 체크되어 있는지 확인해주면 된다.
  • 이제 Build 버튼을 눌러 파일을 추출해 보자. 이름은 'FindRtan' 지정
  • 그러면 앱을 추출하기 위한 빌드가 시작된다.
  • 빌드 완료 후, FindRtan 프로젝트 폴더를 보면 FindRtan.apk 파일이 하나 추출됐다. 이 파일을 휴대폰에 넣어봐서 테스트해 볼 수도 있고, 이 파일을 가지고 시장에다가 배포/런칭을 할 수 있는 것이다.
  • 이 apk 파일의 경우 안드로이드 플랫폼에서만 가능한데 apk 파일을 PC에서 돌려볼 수 있는 다양한 툴들이 있으니 아이폰 유저는 참고하자.

광고 붙이기(5-5)

게임이 끝날 때 광고 붙이기

  • 이제 앱에다가 광고를 붙여보자.
  • Unity Ads라고 하는 패키지를 통해서 앱에다가 광고를 넣을 것. 이 광고는 나중에 수익화로 이어질 수 있다.
  • 메뉴 -> Window -> General -> Service 클릭
    • 이러면 창이 뜨는데 Advertisement Legacy라는 패키지를 Install 해주고, Configure 클릭
    • 그럼 아까 봤던 Project Settings창이 다시 뜬다. 여기서 Services를 누르면 창이 뜨는데 여기 뜨는 정보들은 보통 자동으로 발급됨. 안된다면 클라우드가 Connected 되어 있지 않은 것. Connected를 해주고 프로젝트를 다시 열면 된다.
  • 유니티 세팅은 했으니 이제 스크립트 작성을 통해서 광고를 붙여보자.
  • 그러기 위해 Member의 Dashboard 링크를 타고 Unity Cloud에 들어가자.
    • 클라우드 대시보드로 가자. 여기서 필요한 건 우리가 핸드폰에서 광고를 띄워줄 수 있게 키 값을 하나씩 받아야 된다. 키 값을 받기 위해서는 Shortcuts -> + -> Unity Ads Monetization 클릭
    • Unity Ads 패키지에 대한 설명이 쭉 나와있다. Enable Ads 클릭 -> I only plan to use Unity Ads -> Next -> Next -> My app is not live in an app store yet -> Add Project
    • 여기까지 하면 애플과 안드로이드 플랫폼에서 쓸 수 있는 키 값이 발급된다. 기억해 두었다가 잠시 후에 활용해보자.
  • 그리고 Setup Guide로 가면 Install the Unity Ads SDK라고 있다. Read Guide라고 되어 있는 버튼 클릭
    • 그러면 이 Unity Ads를 어떻게 적용할 수 있는지 가이드 문서가 나옴. 일단 SDK(Advertisement Legacy)는 설치했다. 그러면 한번 초기화를 시켜줘야 한다. 별도의 코드 작성 없이 여기 가이드 문서에 나와있는 코드를 복붙해 써도 된다.
  • 이제 스크립트를 통해 진짜 광고를 붙여보자.
    • 유니티로 가서 'AdInitialize' 스크립트 생성
    • 광고를 게임 중에, 게임이 끝나면 실행시키고 싶다. 그러면 MainScene에다가 광고 초기화 스크립트를 붙여주자.
    • MainScene에 'AdManager' 오브젝트 생성. 그리고 AdInitialize 스크립트 붙이기
    • AdInitialize 스크립트를 열어 아까 사이트에 있던 코드(Class 안 코드만)를 복사해 넣는다.
    • 넣어보면 빨간줄이 뜬다. 사이트로 가보니 using문이 하나 빠졌다. 추가해 넣어주자
    • 또 상속시켜 줄 인터페이스가 하나 더 있다. MonoBehaviour 옆에 IUnityAdsInitializationListener 코드도 추가해 넣어준다.
  • 유니티로 돌아가서 안드로이드 게임 ID와 iOS 게임 ID를 넣어준다.
  • 플레이 해보면 콘솔 창에 Unity Ads initialization이 complete 됐다고 뜬다.
  • 이렇게 초기화를 완성해 줬으면 이제 광고를 띄워 줘야겠다. 역시 가이드 문서를 보자.
    • Implementing rewarded ads in Unity 페이지를 보자. 버튼을 하나 만들어 주고 그 버튼에다 스크립트를 붙여서 버튼을 클릭했을 때 광고가 나오게 만들어주는 형식으로 작성해주면 될 것 같다.
    • 광고가 끝나면 보상을 줄 수 있다. 나중에 게임 재화를 만들게 되면 게임 재화를 광고 reward로 줄 수 있겠다. 그 부분이 가이드의 OnUnityAdsShowComplete. 광고를 본 것을 완료했을 때 보상을 줄 수 있게끔 미리 코드로 다 만들어져 있다. 이 스크립트도 그대로 가져가서 써보자.
  • 우리는 게임이 끝났을 때 광고가 나오는 걸 원한다. 그러면 게임에서 EndTxt가 나오고 '끝'이라는 버튼을 클릭했을 때 광고가 뜨게 해주면 되겠다. 그리고 광고가 끝나면 다시 게임을 플레이 시켜주면 되겠다.
    • EndTxt 오브젝트에 'RewardedButton'스크립트를 만들어 붙여주자.
    • RewardedButton 스크립트로 가서 가이드에 있던 코드들을 그대로 복붙, using문 추가, MonoBehaviour 옆 인터페이스들도 추가
  • 여기까지 됐다면 이제 코드를 보자. 우리는 광고가 끝난 다음에 게임을 다시 시작해 주는 로직만 추가해주면 된다.
    public void Retry()     // MainScene을 불러와주는 함수
    {
        SceneManager.LoadScene("MainScene");
    }
  • 게임을 다시 시작하는 로직은 RetryButton 스크립트에 있었다.
  • 중괄호 코드를 그대로 복사해서
    // Implement the Show Listener's OnUnityAdsShowComplete callback method to determine if the user gets a reward:
    public void OnUnityAdsShowComplete(string adUnitId, UnityAdsShowCompletionState showCompletionState)
    {
        if (adUnitId.Equals(_adUnitId) && showCompletionState.Equals(UnityAdsShowCompletionState.COMPLETED))
        {
            Debug.Log("Unity Ads Rewarded Ad Completed");
            // Grant a reward.
        }   SceneManager.LoadScene("MainScene");
    }
  • 이 부분에 넣어준다.
  • 빨간줄이 뜬다면 using UnityEngine.SceneManagement; 추가
  • 유니티로 돌아가자. 이전에는 '끝'을 눌렀을 때 바로 게임이 다시 실행됐다.
  • 그런데 이번에는 광고를 보여주고 광고 보는 것을 끝내면 게임을 다시 실행해 줘야 한다.
  • 그러니 EndTxt에 있었던 RetryButton 스크립트와 버튼 설정은 삭제해주고, 대신 RewardedButton 스크립트를 추가해 주자.
  • 여기서 스크립트 수정을 조금 해줘야 한다.
public class RewardedButton : MonoBehaviour, IUnityAdsLoadListener, IUnityAdsShowListener
{
    [SerializeField] Button _showAdButton;
    [SerializeField] string _androidAdUnitId = "Rewarded_Android";
    [SerializeField] string _iOSAdUnitId = "Rewarded_iOS";
    string _adUnitId = null; // This will remain null for unsupported platforms
  • 두번째 줄 showAdButton 부분은 지워주고, 관련된(빨간줄) 코드들도 모두 지운다.
  • 다시 유니티로 돌아와서 버튼에 이벤트를 달아주자. On Click -> + -> EndTxt 넣고 RewardedButton의 ShowAd() 등록
  • 이제 '끝'이라는 버튼을 클릭하게 되면 광고가 뜨겠다. 이 광고가 끝나면 게임은 재실행.
  • 플레이 해보면, 게임이 끝나고 '끝'을 누르면 광고(테스트 창)가 뜨게 된다. 실제 기기에서는 광고가 뜰 것.
  • 광고를 다 봤다 치고 위에 Close 버튼을 누르면 다시 게임이 재실행 된다.

게임이 시작할 때 광고 미리 로드해 주기

  • 출시할 때 조심할 점은 AdManager의 Test Mode를 꼭 꺼줘야 함. 체크되어 있으면 아까처럼 테스트 화면이 나오기 때문에 실제에서도 광고가 나오지 않음
  • 출시했을 때 광고가 안 나오게 되는 문제가 생긴다. 광고의 크기가 너무 클 때가 있다. 광고의 사이즈가 너무 커서, 로드 되지 않은 상태에서 광고를 불러오게 되는 경우가 그렇다. 이 부분을 해결하기 위해서 스크립트를 수정해 보자.
public class RewardedButton : MonoBehaviour, IUnityAdsLoadListener, IUnityAdsShowListener
{
  • 인터페이스를 보면 IUnityAdsLoadListener가 있다.
    public void LoadAd()
    {
        // IMPORTANT! Only load content AFTER initialization (in this example, initialization is handled in a different script).
        Debug.Log("Loading Ad: " + _adUnitId);
        Advertisement.Load(_adUnitId, this);
    }
  • 이 인터페이스 덕분에 만들어진 Load()라는 함수를 쓸 수 있다.
    public void OnUnityAdsShowComplete(string adUnitId, UnityAdsShowCompletionState showCompletionState)
    {
        if (adUnitId.Equals(_adUnitId) && showCompletionState.Equals(UnityAdsShowCompletionState.COMPLETED))
        {
            Debug.Log("Unity Ads Rewarded Ad Completed");
            // Grant a reward.
        }   SceneManager.LoadScene("MainScene");
    }
  • 이 광고를 Load 해주는 부분을 OnUnityAdsShowComplete가 된 후에, 리워드를 주는 이 시점에서 한번 LoadAd() 해주자.
    public void OnUnityAdsShowComplete(string adUnitId, UnityAdsShowCompletionState showCompletionState)
    {
        if (adUnitId.Equals(_adUnitId) && showCompletionState.Equals(UnityAdsShowCompletionState.COMPLETED))
        {
            Debug.Log("Unity Ads Rewarded Ad Completed");
            // Grant a reward.
            LoadAd();
        }   SceneManager.LoadScene("MainScene");
    }
  • 이렇게 해주면 씬이 전환되기 전에 항상 광고를 하나 로드하고 가게 된다. 게임이 진행되는 동안에 광고를 불러오고 '끝' 버튼을 누르면 광고가 실행되게끔 세팅을 해주자.
  • 그리고 여기뿐 아니라 처음에 초기화 할 때도 이 LoadAd() 함수를 넣어줘야 함
    public void LoadAd()
    {
        // IMPORTANT! Only load content AFTER initialization (in this example, initialization is handled in a different script).
        Debug.Log("Loading Ad: " + _adUnitId);
        Advertisement.Load(_adUnitId, this);
    }
  • 이 함수를 통째로 복사해서 AdInitialize 스크립트에 붙여준다.
    [SerializeField] string _androidAdUnitId = "Rewarded_Android";
    [SerializeField] string _iOSAdUnitId = "Rewarded_iOS";
    string _adUnitId = null; // This will remain null for unsupported platforms
  • 위 함수에 필요한 변수들도 통째로 붙여준다.
    public void InitializeAds()
    {
    #if UNITY_IOS
            _gameId = _iOSGameId;
            _adUnitId = _iOSAdUnitId;
    #elif UNITY_ANDROID
            _gameId = _androidGameId;
            _adUnitId = _androidAdUnitId;
    #elif UNITY_EDITOR
            _gameId = _androidGameId; //Only for testing the functionality in the Editor
            _adUnitId = _androidAdUnitId;
  • iSO와 ANDROID, UNITY_EDITOR 부분도 필요한 코드 찾아서 복붙
    public void LoadAd()
    {
        // IMPORTANT! Only load content AFTER initialization (in this example, initialization is handled in a different script).
        Debug.Log("Loading Ad: " + _adUnitId);
        Advertisement.Load(_adUnitId, this);
    }
  • 지금 마지막 this라는 곳에 아직도 빨간줄이 쳐져 있다. IUnityAdsLoadListener 인터페이스도 필요하다고 함..
public class AdInitialize : MonoBehaviour, IUnityAdsInitializationListener, IUnityAdsLoadListener
  • 역시 가져와서 붙여주고 인터페이스 구현까지 해준다.
    public void OnUnityAdsAdLoaded(string placementId)
    {
        throw new System.NotImplementedException();
    }

    public void OnUnityAdsFailedToLoad(string placementId, UnityAdsLoadError error, string message)
    {
        throw new System.NotImplementedException();
    }
  • 밑에 있는
    public void OnUnityAdsAdLoaded(string placementId)
    {

    }

    public void OnUnityAdsFailedToLoad(string placementId, UnityAdsLoadError error, string message)
    {

    }
  • 내부 코드들은 지워준다.
    public void OnInitializationComplete()
    {
        Debug.Log("Unity Ads initialization complete.");
        LoadAd();
    }
  • 그리고 이니셜라이즈가 Complete 됐을 때 Load() 함수를 호출해 주자.
  • 이제 게임이 시작됐을 때 광고 하나가 로드되고, 게임을 진행한 다음 '끝' 버튼을 누르면 광고가 실행되게끔 세팅을 바꿔준 거다.
  • 그럼 실제로 게임을 실행했을 때 광고가 로드 되는지 확인해 보자.
    // If the ad successfully loads, add a listener to the button and enable it:
    public void OnUnityAdsAdLoaded(string adUnitId)
    {
        Debug.Log("Ad Loaded: " + adUnitId);

        if (adUnitId.Equals(_adUnitId))
        {
            // Configure the button to call the ShowAd() method when clicked:
            // Enable the button for users to click:
        }
    }
  • 확인을 위한 코드. 그대로 가지고 가서
    public void OnUnityAdsAdLoaded(string placementId)
    {
        Debug.Log("Ad Loaded: " + placementId);

        if (placementId.Equals(_adUnitId))
        {
            // Configure the button to call the ShowAd() method when clicked:
            // Enable the button for users to click:
        }
    }
  • 내부를 비워줬던 이곳에 붙여준다. adUnitId -> placementId 변경
  • 유니티로 가서 플레이해 로그를 보면 광고가 initialization complete 됐고, Loading Ad 됐고, Ad Loaded까지 됐다.
  • '끝' 버튼을 누르면 광고가 뜨고, Close 버튼을 눌러 게임이 재실행됐을 때도 위의 세 로그가 뜨는 걸 볼 수 있다.
  • 이렇게 게임이 시작할 때 미리 광고를 로드해 준 다음, 게임이 끝났을 때 광고를 실행해주는 로직으로도 바꿔보았다.
  • 광고 기능까지 붙여봤다. 어플로써 갖춰야 할 기능을 대부분 갖춘 것 같다.
  • 이제 유니티와 스크립트를 통해서 제작해볼 건 끝!

게임제작 꿀팁 - 에셋스토어, next step(5-6)

에셋스토어

  • Unity AssetStore
    • 유니티 에셋스토어가 편리한 점은 따로 파일을 받아서 넣어줄 필요 없이 구매 버튼, Import를 누르게 되면 패키지 매니저에 자동으로 추가가 된다.
  • 에셋스토어 저작권 사용법
    • CC-BY, GPL 등 여러 옵션이 있는데, 이것 중 CC0라고 하는 옵션을 선택해 검색하면 됨.
    • CC0: 아무런 제약 없이, 조건 없이 사용할 수 있는 에셋이라는 뜻
  • 이런 무료 에셋스토어에서는 애니메이션이나 캐릭터보단 배경이미지, 효과음, 배경음악을 가져다 쓰는게 좋다.
  • [르탄이 카드 뒤집기] 게임에서 사용했던 음악들도 OpenGameArt에서 가져온 리소스.

  • 그동안 배웠던 내용을 한번 살펴보자.
  • [빗물받는 르탄이] 유니티 기본 사용법
  • [풍선을 지켜라] 유니티 사용법 복습1, 데이터를 저장하는 법
  • [고양이 밥주기] 유니티 사용법 복습2, 레벨링 시스템을 구현하는 법
  • [르탄이 맞추기] 퍼즐게임 만들기 & 로직체험
  • [부가 기능 학습] 사운드와 광고를 넣어주는 법
  • 지금까지 배운 내용을 사용해 만들 수 있는 건 하이퍼 캐주얼 게임.
  • 하이퍼 캐주얼 게임: 대부분 세로로 플레이, 원 버튼(터치, 슬라이드) 플레이, 한 판에 30~60초 진행(빠른 템포)