본문 바로가기
디지털노마드

챗GPT 게임개발68: Unity에서 Google Mobile Ads로 리워드 광고 구현하기

by 인텔리노마드라이프 2024. 11. 29.
728x90

안녕하세요. 인텔리원스튜디오(IntelliOneStudio)입니다.

 

이번 시간에는 Unity에서 Google Mobile Ads를 활용하여 리워드 광고를 구현하는 방법을 알아보겠습니다. 특히 RewardedAdManager 스크립트를 중심으로, 사용자가 광고를 시청하고 보상을 받을 수 있는 시스템을 구축하는 방법을 소개해 드릴게요.

 

이 스크립트를 통해 게임 내에서 효과적으로 리워드 광고를 관리하고, 사용자 참여를 유도할 수 있습니다. 단계별로 필요한 코드와 설명을 함께 제공하니, 프로젝트에서 바로 적용해 보세요.

 


신개념 메모리 게임의 탄생. 외워라! 창고.

2024.11.14 - [분류 전체보기] - [외워라!창고] 챗GPT를 활용해서 개발한 두 번째 게임을 여러분께 소개합니다!

 

[외워라!창고] 챗GPT를 활용해서 개발한 두 번째 게임을 여러분께 소개합니다!

안녕하세요, 인텔리원스튜디오(IntelliOneStudio)에서 흥미진진한 소식을 가지고 왔어요! 저희가 챗GPT를 활용해서 개발한 두 번째 게임을 여러분께 소개합니다! 이 게임은 챗GPT의 놀라운 AI 기능을

intellinomadlife.tistory.com

 

창고에 물건을 보관하면 더이상 보여주지 않고, 오로지 당신의 기억력으로 찾아야해요.

날이 갈수록 늘어나는 상품들과 주문에도 정확하고 빠르게 물건을 찾아 배송해야해요.

과연 당신은 며칠까지 버틸수 있을까요?

당신의 기억력을 시험해봐요. 지금 다운로드하세요.

 

[아이폰 앱스토어 다운로드]

https://apps.apple.com/kr/app/%EC%99%B8%EC%9B%8C%EB%9D%BC%EC%B0%BD%EA%B3%A0/id6737766088

 

‎외워라창고

‎환영합니다. 우리 창고는 매일 새롭게 들어오는 상품을 각기 다른 각기 다른 상자에 보관해요. 주문이 들어오면 그 상품들을 찾아 포장하고, 정확한 주소로 배송하는 것이 여러분의 임무입니

apps.apple.com

 


 

저희가 챗GPT를 활용해서 개발한 첫 번째 게임을 여러분께 소개합니다! 이 게임은 챗GPT의 놀라운 AI 기능을 활용해 개발했어요. 즐거움이 가득한 이번 게임은, 챗GPT를 활용해서 누구든지 게임을 재미있게 만들 수 있다는 것을 보여줄 거에요.

 

* APP Store 에서 다운로드 

https://apps.apple.com/kr/app/%EB%86%8D%EB%B6%80%EC%9D%98-%EA%BF%88/id6479183930

 

‎농부의 꿈

‎오래된 전설이 숨겨져 있는 [농부의 꿈]목장 한구석에서 ‘비밀의 문'과 '마법 책'이 발견되었어요. [변신하는 동물들] 병아리가 합쳐져 닭이 되고, 닭이 합쳐져 고슴도치로 변신하며, 점점 더

apps.apple.com

 

 

*Google Play 에서 다운로드

https://play.google.com/store/apps/details?id=com.intellione.farmersfirstdream&pcampaignid=web_share

 

농부의 꿈 - Google Play 앱

평화로운 목장에서 신나는 동물 합치기 무료게임 (바람, 뚫어뻥, 밧줄, 무중력 등 매직 아이템 활용해 병아리를 젖소로 키워보세요.)

play.google.com

 

 


 

주요 기능 소개

1. Google Mobile Ads 초기화 및 리워드 광고 로드

2. 광고 SDK를 초기화하고, 리워드 광고를 로드합니다.

3. 리워드 광고 표시 및 사용자 보상 처리

4. 광고를 사용자에게 보여주고, 시청 완료 시 보상을 지급합니다.

5. 이벤트 리스너를 통한 광고 상태 관리

6. 광고 로드 성공, 실패, 광고 시작 및 종료 등의 이벤트를 처리하여 사용자 경험을 향상시킵니다.

 

아래와 같이 ChatGPT에게 질문했어요.

※ ChatGPT 답변 내용 중 제가 별도로 표시한 굵은 글씨를 기준으로 읽으시면 좀 더 이해가 쉽게 될 거예요.

 


 

[질문]

안녕, ChatGPT. Unity에서 Google Mobile Ads를 사용하여 리워드 광고를 구현하고 싶어. RewardedAdManager 스크립트를 작성했는데, 어떻게 동작하는지 자세히 설명해 줄 수 있어?

 


 

[답변]

안녕하세요! RewardedAdManager 스크립트를 통해 Unity에서 리워드 광고를 구현하는 방법을 단계별로 설명해 드릴게요.

 

1. Google Mobile Ads SDK 초기화 및 광고 로드

void Start()
{
    MobileAds.Initialize(initStatus => { LoadAd(); });
}

 

설명:

  • MobileAds.Initialize를 호출하여 Google Mobile Ads SDK를 초기화합니다.
  • 초기화가 완료되면 LoadAd()를 호출하여 리워드 광고를 로드합니다.

 

2. 리워드 광고 로드

public void LoadAd()
{
    if (_rewardedAd != null)
    {
        _rewardedAd.Destroy();
    }

    var adRequest = new AdRequest();

    RewardedAd.Load(_adUnitId, adRequest, (RewardedAd ad, LoadAdError error) =>
    {
        if (error != null || ad == null)
        {
            Debug.LogError("리워드 광고 로드 실패: " + error);
            return;
        }

        _rewardedAd = ad;
        RegisterEventHandlers(ad);

        if (isUserInitiatedAd)
        {
            ShowAd();
            isUserInitiatedAd = false;
        }
    });
}

 

설명:

  • 기존에 로드된 광고가 있으면 _rewardedAd.Destroy()로 제거합니다.
  • AdRequest를 생성하여 광고 요청을 구성합니다.
  • RewardedAd.Load를 사용하여 광고를 비동기로 로드하고, 콜백을 통해 결과를 처리합니다.
  • 광고 로드에 성공하면 _rewardedAd에 할당하고, 이벤트 핸들러를 등록합니다.
  • isUserInitiatedAd 플래그를 사용하여 사용자가 광고 시청을 요청한 경우 즉시 ShowAd()를 호출합니다.

3. 리워드 광고 표시

public void ShowAd()
{
    if (_rewardedAd != null && _rewardedAd.CanShowAd())
    {
        _rewardedAd.Show(reward =>
        {
            Debug.Log($"리워드 광고 시청 완료: {reward.Amount} {reward.Type}");
            StartCoroutine(ExecuteMoneyAndCurrencyActions());
        });
    }
    else
    {
        Debug.LogError("리워드 광고가 아직 준비되지 않았습니다.");
    }
}

 

설명:

  • _rewardedAd가 로드되어 있고, 표시할 수 있는지 확인합니다.
  • Show() 메서드를 호출하여 광고를 표시하고, 사용자가 시청을 완료하면 보상 콜백이 실행됩니다.
  • 보상 처리를 위해 ExecuteMoneyAndCurrencyActions() 코루틴을 시작합니다.

4. 사용자 보상 처리

private IEnumerator ExecuteMoneyAndCurrencyActions()
{
    // 광고 버튼의 위치로부터 돈을 이동시키는 코루틴을 실행
    yield return StartCoroutine(MoneyMover.Instance.MoveMoney(10, adButtonPosition));
    // 코인 또는 점수를 추가하는 로직을 여기에 구현
    // 예: CurrencyManager.Instance.AddCurrency(100);
}

 

설명:

  • 코루틴을 사용하여 보상 처리 과정을 순차적으로 실행합니다.
  • MoneyMover와 CurrencyManager를 통해 시각적 효과와 코인 추가를 구현합니다.
  • 이 부분은 게임의 구체적인 보상 시스템에 맞게 수정할 수 있습니다.

5. 사용자 입력 처리

public void OnItemClicked(Vector3 buttonTransform)
{
    adButtonPosition = buttonTransform;

    if (_rewardedAd != null && _rewardedAd.CanShowAd())
    {
        ShowAd();
    }
    else
    {
        isUserInitiatedAd = true;
        LoadAd();
        // 사용자에게 광고 로딩 중임을 알릴 수 있습니다.
    }
}

 

설명:

  • 광고 버튼이 클릭되었을 때 호출되는 메서드입니다.
  • 버튼의 위치를 adButtonPosition에 저장하여 보상 처리에 활용합니다.
  • 광고가 준비되어 있으면 ShowAd()를 호출하고, 그렇지 않으면 LoadAd()를 시도합니다.
  • isUserInitiatedAd 플래그를 설정하여 로딩 후 광고를 자동으로 표시합니다.

6. 광고 이벤트 처리

private void RegisterEventHandlers(RewardedAd ad)
{
    ad.OnAdFullScreenContentOpened += () =>
    {
        Debug.Log("리워드 광고 전체 화면 열림");
        BackgroundMusicManager.instance.PauseMusic();
    };

    ad.OnAdFullScreenContentClosed += () =>
    {
        Debug.Log("리워드 광고 전체 화면 닫힘");
        BackgroundMusicManager.instance.ResumeMusic();
        AdCooldownManager.Instance.UpdateLastAdWatchTime();
        LoadAd();
    };

    ad.OnAdFullScreenContentFailed += (AdError error) =>
    {
        Debug.LogError("리워드 광고 전체 화면 열기 실패: " + error);
    };
}

 

설명:

  • OnAdFullScreenContentOpened: 광고가 전체 화면으로 표시될 때 호출됩니다. 배경 음악을 일시 중지합니다.
  • OnAdFullScreenContentClosed: 광고가 닫힐 때 호출됩니다. 배경 음악을 재생하고, 광고 쿨다운을 업데이트하며, 새로운 광고를 로드합니다.
  • OnAdFullScreenContentFailed: 광고 표시가 실패할 때 호출됩니다. 에러를 로깅합니다.

7. 광고 제거 및 로그

public void DestroyAd()
{
    if (_rewardedAd != null)
    {
        _rewardedAd.Destroy();
        _rewardedAd = null;
    }
}

public void LogResponseInfo()
{
    if (_rewardedAd != null)
    {
        var responseInfo = _rewardedAd.GetResponseInfo();
        Debug.Log(responseInfo);
    }
}

 

설명:

  • DestroyAd(): 광고를 제거하고 리소스를 해제합니다.
  • LogResponseInfo(): 광고의 응답 정보를 로깅합니다.

전체 코드 정리

using System;
using UnityEngine;
using GoogleMobileAds.Api;
using System.Collections;

namespace WarehouseDeliveryQuest.Managers
{
    public class RewardedAdManager : MonoBehaviour
    {
        private Vector3 adButtonPosition;
        private RewardedAd _rewardedAd;
        private bool isUserInitiatedAd = false;

#if UNITY_ANDROID
        private const string _adUnitId = "YOUR_ANDROID_AD_UNIT_ID"; // 실제 광고 단위 ID로 교체하세요.
#elif UNITY_IPHONE
        private const string _adUnitId = "YOUR_IOS_AD_UNIT_ID"; // 실제 광고 단위 ID로 교체하세요.
#else
        private const string _adUnitId = "unused";
#endif

        void Start()
        {
            MobileAds.Initialize(initStatus => { LoadAd(); });
        }

        public void LoadAd()
        {
            if (_rewardedAd != null)
            {
                _rewardedAd.Destroy();
            }

            var adRequest = new AdRequest();

            RewardedAd.Load(_adUnitId, adRequest, (RewardedAd ad, LoadAdError error) =>
            {
                if (error != null || ad == null)
                {
                    Debug.LogError("리워드 광고 로드 실패: " + error);
                    return;
                }

                _rewardedAd = ad;
                RegisterEventHandlers(ad);

                if (isUserInitiatedAd)
                {
                    ShowAd();
                    isUserInitiatedAd = false;
                }
            });
        }

        public void ShowAd()
        {
            if (_rewardedAd != null && _rewardedAd.CanShowAd())
            {
                _rewardedAd.Show(reward =>
                {
                    Debug.Log($"리워드 광고 시청 완료: {reward.Amount} {reward.Type}");
                    StartCoroutine(ExecuteMoneyAndCurrencyActions());
                });
            }
            else
            {
                Debug.LogError("리워드 광고가 아직 준비되지 않았습니다.");
            }
        }

        private IEnumerator ExecuteMoneyAndCurrencyActions()
        {
            yield return StartCoroutine(MoneyMover.Instance.MoveMoney(10, adButtonPosition));
            // 코인 또는 점수를 추가하는 로직을 여기에 구현
            // 예: CurrencyManager.Instance.AddCurrency(100);
        }

        public void OnItemClicked(Vector3 buttonTransform)
        {
            adButtonPosition = buttonTransform;

            if (_rewardedAd != null && _rewardedAd.CanShowAd())
            {
                ShowAd();
            }
            else
            {
                isUserInitiatedAd = true;
                LoadAd();
            }
        }

        public void DestroyAd()
        {
            if (_rewardedAd != null)
            {
                _rewardedAd.Destroy();
                _rewardedAd = null;
            }
        }

        public void LogResponseInfo()
        {
            if (_rewardedAd != null)
            {
                var responseInfo = _rewardedAd.GetResponseInfo();
                Debug.Log(responseInfo);
            }
        }

        private void RegisterEventHandlers(RewardedAd ad)
        {
            ad.OnAdPaid += (AdValue adValue) =>
            {
                Debug.Log($"리워드 광고 수익 발생: {adValue.Value} {adValue.CurrencyCode}");
            };

            ad.OnAdImpressionRecorded += () =>
            {
                Debug.Log("리워드 광고 노출 기록됨");
            };

            ad.OnAdClicked += () =>
            {
                Debug.Log("리워드 광고 클릭됨");
            };

            ad.OnAdFullScreenContentOpened += () =>
            {
                Debug.Log("리워드 광고 전체 화면 열림");
                BackgroundMusicManager.instance.PauseMusic();
            };

            ad.OnAdFullScreenContentClosed += () =>
            {
                Debug.Log("리워드 광고 전체 화면 닫힘");
                BackgroundMusicManager.instance.ResumeMusic();
                AdCooldownManager.Instance.UpdateLastAdWatchTime();
                LoadAd();
            };

            ad.OnAdFullScreenContentFailed += (AdError error) =>
            {
                Debug.LogError("리워드 광고 전체 화면 열기 실패: " + error);
            };
        }
    }
}

 


 

[추가 질문]

그렇다면, 이 스크립트를 실제 프로젝트에 적용하려면 어떻게 해야 할까?


 

[추가 답변]

좋은 질문이에요! 이 스크립트를 프로젝트에 적용하는 방법을 알려드릴게요.

 

1. 필요한 패키지 및 설정

  • Google Mobile Ads Unity Plugin을 프로젝트에 추가해야 합니다.
  • Google Mobile Ads Unity Plugin GitHub를 방문하여 최신 버전을 다운로드하고 설치하세요.
  • Android 및 iOS 플랫폼별로 광고 단위 ID를 설정해야 합니다.
    • 예시 코드에서는 #if UNITY_ANDROID와 #elif UNITY_IPHONE을 사용하여 플랫폼별 광고 단위 ID를 지정했습니다.

2. 스크립트 적용

  • RewardedAdManager 스크립트를 생성하고, 제공된 코드를 붙여넣습니다.
  • 이 스크립트를 게임 오브젝트에 추가합니다.

3. 광고 단위 ID 설정

  • 실제 광고를 사용하려면 Google AdMob에서 발급받은 광고 단위 ID로 _adUnitId를 변경해야 합니다.
  • 테스트 중에는 Google에서 제공하는 테스트 광고 단위 ID를 사용하는 것이 좋습니다.
    • Android 테스트 광고 단위 ID: ca-app-pub-3940256099942544/5224354917
    • iOS 테스트 광고 단위 ID: ca-app-pub-3940256099942544/1712485313

4. 기타 매니저 클래스 구현

  • BackgroundMusicManager, AdCooldownManager, MoneyMover, CurrencyManager 등 스크립트에서 사용된 매니저 클래스들을 구현하거나 기존 프로젝트의 매니저를 연결해야 합니다.
  • 이 클래스들은 광고 시청 전후의 게임 상태 관리, 보상 지급, 음악 제어 등을 담당합니다.

5. 빌드 및 테스트

  • 에디터에서는 광고가 표시되지 않을 수 있으므로, 실제 기기에서 빌드하여 테스트하세요.
  • 광고가 제대로 로드되고 표시되는지 확인합니다.
  • 광고 시청 완료 후 보상이 정상적으로 지급되는지 확인합니다.

 

오늘은 Unity에서 Google Mobile Ads를 활용하여 리워드 광고를 구현하는 방법을 알아봤어요.

 

RewardedAdManager 스크립트를 통해 사용자가 광고를 시청하고 보상을 받을 수 있는 시스템을 구축할 수 있습니다.

이 시스템을 통해 게임의 수익성을 높이고, 사용자 참여를 유도할 수 있습니다.

 

지금까지 인텔리원스튜디오(IntelliOneStudio)였습니다!

감사합니다.

 

 

728x90