본문 바로가기

Godot

Godot 4.4 안드로이드 구글 애드몹(AdMob) 연동 완벽 가이드

반응형

Godot 4.4 환경에서 범용적으로 사용되는 Poing Studios의 AdMob 플러그인을 활용하여 안드로이드 앱에 광고를 연동하는 전체 과정을 정리합니다. Godot 4.3 버전부터 변경된 빌드 시스템(익스포트 창 UI 변경) 내용이 반영되어 있습니다.


1. 사전 준비 사항

  • Godot 4.4 에디터
  • Google AdMob 계정: 가입 및 활성화 완료 상태
  • 안드로이드 빌드 환경: Android SDK 및 JDK 설치, Godot 내 경로 설정 완료 상태

2. 플러그인 설치 및 활성화

  1. Godot 에디터 상단 중앙의 AssetLib 탭으로 이동합니다.
  2. 검색창에 AdMob을 검색하고, 개발자가 poing.studios인 플러그인을 선택합니다.
  3. DownloadInstall을 클릭하여 프로젝트의 res://addons/ 경로에 설치합니다.
  4. 상단 메뉴의 프로젝트(Project) > 프로젝트 설정(Project Settings)을 엽니다.
  5. 플러그인(Plugins) 탭에서 AdMob 항목의 체크박스를 눌러 활성화(Enable) 합니다.

3. 플랫폼 SDK 다운로드 및 App ID 설정

  1. 에디터 상단 툴바에 생성된 AdMob Manager (또는 프로젝트 > 도구 > AdMob Manager)를 클릭합니다.
  2. Android > Download & Install을 클릭하여 안드로이드용 AdMob SDK 바이너리를 프로젝트에 다운로드합니다.
  3. 설정 메뉴에서 APPLICATION_ID 속성에 AdMob 대시보드에서 발급받은 실제 앱 ID(ca-app-pub-XXXXXXXXXXXXXXXX~YYYYYYYYYY)를 입력합니다.

4. 안드로이드 빌드 및 내보내기 설정 (★ Godot 4.3 이상 주의점)

Godot 4.3 버전부터 익스포트 창 하단에 있던 Plugins 체크 목록 UI가 제거되었습니다. 플러그인은 프로젝트 설정에서 활성화되어 있고, Gradle Build를 사용하면 자동으로 포함됩니다.

  1. 상단 메뉴에서 프로젝트(Project) > 설치(Install) > Android Build Template을 클릭합니다. (res://android/build/ 폴더 생성됨)
  2. 프로젝트(Project) > 내보내기(Export) 창을 엽니다.
  3. 상단의 추가(Add) 버튼을 눌러 Android 프리셋을 생성합니다.
  4. 우측 설정 옵션 중 Gradle Build 항목을 찾아 체크합니다.
  5. (과거 버전과 달리 내보내기 창 하단에서 AdMob 플러그인을 수동으로 체크할 필요가 없습니다. 창을 닫습니다.)

5. AdMob 대시보드 필수 설정

실제 광고 송출 및 테스트를 위해 대시보드에서 다음 작업을 수행해야 합니다.

  1. 광고 단위(Ad Unit) 생성:
    • 앱 메뉴 > 광고 단위 추가에서 배너, 전면, 보상형 등 필요한 광고 단위를 생성합니다.
    • 생성된 광고 단위 ID(ca-app-pub-.../...)를 메모합니다.
  2. 테스트 기기 등록 (필수):
    • 설정 > 테스트 기기 메뉴에서 본인 스마트폰을 등록합니다.
    • 스마트폰의 설정 > Google > 광고 메뉴에서 확인한 광고 ID(ADID)를 입력해야 정책 위반(계정 정지)을 피할 수 있습니다.

6. GDScript 광고 호출 코드 구현

광고를 관리할 싱글톤(AutoLoad) 또는 메인 스크립트에 아래 코드를 작성하여 사용합니다. (아래 코드는 Google에서 제공하는 개발용 테스트 ID를 기준으로 작성되었습니다.)


extends Node

var banner_view : BannerView
var interstitial_ad : InterstitialAd
var rewarded_ad : RewardedAd

func _ready() -> void:
    # 1. SDK 초기화 (앱 실행 시 1회만 호출)
    MobileAds.initialize()

# ==========================================
# 2. 배너 광고 (Banner Ad)
# ==========================================
func load_banner() -> void:
    var unit_id = "ca-app-pub-3940256099942544/6300978111" # 안드로이드 배너 테스트 ID
    var ad_request = AdRequest.new()
    var ad_size = AdSize.get_current_orientation_anchored_adaptive_banner_ad_size(AdSize.FULL_WIDTH)

    banner_view = BannerView.new(unit_id, ad_size, AdPosition.Values.BOTTOM)
    banner_view.load_ad(ad_request)
    banner_view.on_ad_loaded.connect(_on_banner_loaded)

func _on_banner_loaded() -> void:
    banner_view.show()

# ==========================================
# 3. 전면 광고 (Interstitial Ad)
# ==========================================
func load_interstitial() -> void:
    var unit_id = "ca-app-pub-3940256099942544/1033173712" # 안드로이드 전면 테스트 ID
    var ad_request = AdRequest.new()

    var loader = InterstitialAdLoader.new()
    loader.on_ad_loaded.connect(_on_interstitial_loaded)
    loader.on_ad_failed_to_load.connect(_on_interstitial_failed)
    loader.load(unit_id, ad_request)

func _on_interstitial_loaded(ad : InterstitialAd) -> void:
    interstitial_ad = ad
    interstitial_ad.on_ad_dismissed_full_screen_content.connect(_on_interstitial_closed)
    interstitial_ad.show()

func _on_interstitial_failed(error : LoadAdError) -> void:
    print("전면 광고 로드 실패: ", error.message)

func _on_interstitial_closed() -> void:
    interstitial_ad = null

# ==========================================
# 4. 보상형 광고 (Rewarded Ad)
# ==========================================
func load_rewarded_ad() -> void:
    var unit_id = "ca-app-pub-3940256099942544/5224354917" # 안드로이드 보상형 테스트 ID
    var ad_request = AdRequest.new()

    var loader = RewardedAdLoader.new()
    loader.on_ad_loaded.connect(_on_rewarded_loaded)
    loader.load(unit_id, ad_request)

func _on_rewarded_loaded(ad : RewardedAd) -> void:
    rewarded_ad = ad
    rewarded_ad.on_user_earned_reward.connect(_on_user_earned_reward)
    rewarded_ad.on_ad_dismissed_full_screen_content.connect(_on_rewarded_closed)
    rewarded_ad.show()

func _on_user_earned_reward(reward : RewardItem) -> void:
    print("보상 지급 처리 - 종류: ", reward.type, " / 수량: ", reward.amount)

func _on_rewarded_closed() -> void:
    rewarded_ad = null

7. 테스트 및 최종 빌드 주의사항

  • 테스트 단계: 위 스크립트에 기재된 ca-app-pub-3940256099942544/... 형태의 테스트용 ID를 반드시 유지해야 합니다. 자신의 실제 광고 단위 ID로 개발 중 과도한 트래픽을 발생시키면 부정 클릭으로 간주되어 계정이 영구 정지될 수 있습니다.
  • 출시 빌드 단계: 플레이 스토어 배포용 AAB/APK 파일을 빌드하기 직전에 스크립트 내의 unit_id 변수값을 대시보드에서 발급받은 본인의 실제 광고 단위 ID로 교체하고 빌드합니다.
반응형