This page needs JavaScript activated to work.
/blog

Unity - AdMob

28. August 2021

Jeder Entwickler, der Geld verdienen möchte, muss sein Spiel entweder für Geld verkaufen oder free-to-play anbieten. Das bedeutet die Spieler können das Spiel gratis spielen, müssen aber Werbung in Kauf nehmen. In diesem Artikel werden wir zeigen, wie dies mit Google AdMob möglich ist.
Packages konfigurieren
Als Erstes setzen wir unser Unityprojekt so auf, dass wir mit der Google AdMob Api arbeiten können. Dafür downloaden wir uns das Unitypackage von GitHub . Dann gehen wir in Unity und importieren das Package in unser Projekt. Dafür gehen wir auf Assets > Import Package > Custom Package. Jetzt klicken wir in Unity auf Assets > External Dependency Manager > Android Resolver > Resolve Die Bibliothek Unity External Dependency Manager kopiert die deklarierten Abhängigkeiten in das Verzeichnis Assets/Plugins/Android von unserem Unityprojekt.
Unter Assets > Google Mobile Ads > Settings können wir jetzt unsere AdMob ID setzen. Diese ID kann unter apps.admob.com gefunden werden. Dafür muss nur eine neue App in dem AdMob Interface erstellt werden. Wenn die ID eingetragen ist, dann sind wir mit der Vorbereitung fertig.
AdManager
Für die Verwaltung unserer Ads verwenden wir einen AdManager. Mit diesem können wir ganz einfach an jeder Stelle unseres Spiels Werbung anzeigen lassen. Das AdManager Skript muss auf ein Empty GameObject hinzugefügt werden, sodass die Instanz von überall abgerufen werden kann. Erstellen wir also zuerst den grundlegenden AdManager.
using System;
using GoogleMobileAds.Api;

public class AdManager : MonoBehaviour {
    public static AdManager Instance;
    public AdManager() {
        Instance = this;
    }

    private void Start() {
        // Google Mobile Ads SDK initialisieren.
        MobileAds.Initialize(initStatus => { });
    }
}        

Banner implementieren

Im folgenden werden wir ein einfaches Banner für unser Unityprojekt erstellen.
private BannerView bannerView;

private void Start() {
    // Google Mobile Ads SDK initialisieren.
    MobileAds.Initialize(initStatus => { });
    this.RequestBanner();
}

public void RequestBanner() {
    // Hier eigene ID einfügen
    string BANNER_ID = "ca-app-pub-3940256099942544/6300978111"; // Standardwert

    // 320x50 Banner am oberen Bildschirmrand erstellen.
    this.bannerView = new BannerView(BANNER_ID, AdSize.Banner, AdPosition.Top);
    // Neue Anfrage für eine Ad erstellen.
    AdRequest request = new AdRequest.Builder().Build();
    // Banner mit der Anfrage laden.
    this.bannerView.LoadAd(request);

}        
Benutzerdefiniertes Banner
Neben der Verwendung einer AdSize-Konstante können wir auch eine benutzerdefinierte Größe für die Anzeige angeben:
AdSize adSize = new AdSize(450, 100);
BannerView bannerView = new BannerView(adUnitId, adSize, AdPosition.Bottom);        

Interstatial implementieren

Ein Interstatial ist ein Werbeblock, der im Vollbild angezeigt wird. Das Interstatial kann Bild, Video und Text als Werbung anzeigen. Dadurch ist es sehr flexibel und kann z.B. nach einem Level angezeigt werden. Der Vorteil ist, das es nicht die ganze Zeit im Bildschirm zu sehen ist und den Spieler weniger belästigt.
private InterstitialAd interstitial;

public void RequestInterstitial() {
    // Hier eigene ID einfügen
    string INTERSTATIAL_AD = "ca-app-pub-3940256099942544/1033173712"; // Standardwert

    // InterstitialAd initialisieren.
    this.interstitial = new InterstitialAd(INTERSTATIAL_AD);

    // Hier optional Events einfügen

    // Neue Anfrage für eine Ad erstellen.
    AdRequest request = new AdRequest.Builder().Build();
    // Interstatial mit Anfrage laden.
    this.interstitial.LoadAd(request);
    // Versuche das InterstatialAd anzuzeigen.
    StartCoroutine(ShowInterstatial());
}

private IEnumerator ShowInterstatial() {
    // 0.25 Sekunden warten
    yield return new WaitForSeconds(0.25f);

    // Zeige Interstatial an, wenn es geladen ist. Wenn nicht versuche es nochmal.
    if (this.interstitial.IsLoaded()) this.interstitial.Show();
    else StartCoroutine(ShowInterstatial());
}        
Events hinzufügen
Um das Verhalten der Anzeige weiter anzupassen, können wir uns eine reihe von Ereignissen zu Nutze machen: Laden, Öffnen, Schließen und so weiter. Um die Events dem Interstatial zuzuschreiben erstellen wir die dafür vorgesehenden Methoden, wie unten dargestellt.
Alle Interstatial Events
OnAdLoaded
Das OnAdLoaded-Ereignis wird ausgeführt, wenn das Laden einer Anzeige abgeschlossen ist.

OnAdFailedToLoad
Das OnAdFailedToLoad-Ereignis wird aufgerufen, wenn eine Anzeige nicht geladen werden kann. Der Message-Parameter beschreibt die Art des aufgetretenen Fehlers.

OnAdOpening
Diese Methode wird aufgerufen, wenn die Anzeige angezeigt wird und den Bildschirm des Geräts bedeckt.

OnAdClosed
Diese Methode wird aufgerufen, wenn die interstitielle Anzeige geschlossen wird, weil der Benutzer auf das Schließen-Symbol tippt oder die Schaltfläche Zurück verwendet. Wenn Ihre Anwendung ihre Audioausgabe oder Spielschleife angehalten hat, ist dies ein guter Ort, um sie fortzusetzen.

OnAdLeavingApplication
Diese Methode wird nach OnAdOpened aufgerufen, wenn ein Benutzer durch Klicken auf OnAdOpened eine andere Anwendung (z. B. den Google Play-Store) öffnet, die die aktuelle Anwendung im Hintergrund anzeigt.
public void RequestInterstitial() {
    // ...

    // Wird aufgerufen, wenn ein Interstatial erfolgreich geladen wurde.
    this.interstitial.OnAdLoaded += HandleOnAdLoaded;
    // Wird aufgerufen, wenn das Aufrufen des Interstatial fehlgeschlagen ist.
    this.interstitial.OnAdFailedToLoad += HandleOnAdFailedToLoad;
    // Wird aufgerufen, wenn das Interstatial angezeigt wird.
    this.interstitial.OnAdOpening += HandleOnAdOpened;
    // Wird aufgerufen, wenn das Interstatial geschlossen wird.
    this.interstitial.OnAdClosed += HandleOnAdClosed;
    // Wird aufgerufen, wenn das Interstatial den Benutzer dazu gebraucht hat die App zu verlassen.
    this.interstitial.OnAdLeavingApplication += HandleOnAdLeavingApplication;

    // ...
}

public void HandleOnAdLoaded(object sender, EventArgs args) {
    Debug.Log("HandleAdLoaded event received");
}

public void HandleOnAdFailedToLoad(object sender, AdFailedToLoadEventArgs args) {
    Debug.Log("HandleFailedToReceiveAd event received with message: " + args.Message);
}

public void HandleOnAdOpened(object sender, EventArgs args) {
    Debug.Log("HandleAdOpened event received");
}

public void HandleOnAdClosed(object sender, EventArgs args) {
    Debug.Log("HandleAdClosed event received");
    interstitial.Destroy();     // Referenz zu Interstatial entfernen, um später ein neues zu erstellen.
}

public void HandleOnAdLeavingApplication(object sender, EventArgs args) {
    Debug.Log("HandleAdLeavingApplication event received");
    interstitial.Destroy();     // Referenz zu Interstatial entfernen, um später ein neues zu erstellen.
}        

RewardedAd implementieren

Rewarded Ads sind Anzeigen, mit denen Benutzer im Austausch gegen In-App-Belohnungen interagieren können. Diese sind sehr lukrativ, denn der Nutzer guckt freiwillig Werbung, mit der wir Geld verdienen können. Zusätzlich erhält er eine Belohnung. Eine Win-Win Situation.
private RewardedAd rewardedAd;

private void Start() {
    // Google Mobile Ads SDK initialisieren.
    MobileAds.Initialize(initStatus => { });

    // RewardedAd vorladen
    CreateAndLoadRewardedAd();
}

private void CreateAndLoadRewardedAd() {
    // Hier eigene ID einfügen
    string REWARDED_AD = "ca-app-pub-3940256099942544/5224354917";     // Standardwert
    
    // RewardedAd initialisieren
    this.rewardedAd = new RewardedAd(REWARDED_AD);

    // Hier optional Events einfügen

    // Neue Anfrage für eine Ad erstellen.
    AdRequest request = new AdRequest.Builder().Build();
    // RewardedAd mit der Anfrage laden.
    this.rewardedAd.LoadAd(request);
}

public void RequestRewardedAd() {
    if (this.reviveRewardedAd.IsLoaded()) {
        this.reviveRewardedAd.Show();
    }
}        
Events hinzufügen
Um das Verhalten der Anzeige weiter anzupassen, können wir uns eine reihe von Ereignissen zu Nutze machen: Laden, Öffnen, Schließen und so weiter. Um die Events dem RewardedAd zuzuschreiben erstellen wir die dafür vorgesehenden Methoden, wie unten dargestellt. Das wichtigste Ereignis ist OnUserEarnedReward, das aufgerufen wird, wenn der Benutzer für das Ansehen eines Videos belohnt wird.
Alle RewardedAd Events
OnAdLoaded
Wird aufgerufen, wenn eine Anzeige fertig geladen ist.

OnAdFailedToLoad
Wird aufgerufen, wenn eine Anzeige nicht geladen werden kann. Die Message-Eigenschaft der bereitgestellten AdErrorEventArgs beschreibt die Art des aufgetretenen Fehlers.

OnAdOpening
Wird aufgerufen, wenn die Anzeige angezeigt wird und den Bildschirm des Geräts bedeckt. Dies ist ein guter Ort, um die Audioausgabe der Anwendung oder die Spielschleife zu unterbrechen, falls erforderlich.

OnAdFailedToShow
Wird aufgerufen, wenn eine Anzeige nicht angezeigt wird. Die Message-Eigenschaft der bereitgestellten AdErrorEventArgs beschreibt die Art des aufgetretenen Fehlers.

OnUserEarnedReward
Wird aufgerufen, wenn ein Benutzer für das Ansehen eines Videos belohnt werden soll. Der Belohnungsparameter beschreibt die Belohnung, die dem Benutzer präsentiert werden soll.

OnAdClosed
Wird aufgerufen, wenn die belohnte Videoanzeige geschlossen wird, weil der Benutzer auf das Schließen-Symbol tippt oder die Schaltfläche Zurück verwendet. Wenn Ihre App die Audioausgabe oder die Spielschleife angehalten hat, ist dies ein guter Ort, um sie fortzusetzen.
private void CreateAndLoadRewardedAd() {
    // ...

    // Wird aufgerufen, wenn ein RewardedAd erfolgreich geladen wurde.
    rewardedAd.OnAdLoaded += HandleRewardedAdLoaded;
    // Wird aufgerufen, wenn das Aufrufen des RewardedAd fehlgeschlagen ist.
    rewardedAd.OnAdFailedToLoad += HandleRewardedAdFailedToLoad;
    // Wird aufgerufen, wenn das RewardedAd angezeigt wird.
    rewardedAd.OnAdOpening += HandleRewardedAdOpening;
    // Wird aufgerufen, wenn das RewardedAd nicht angezeigt werden konnte.
    rewardedAd.OnAdFailedToShow += HandleRewardedAdFailedToShow;
    // Wird aufgerufen, wenn der Benutzer eine Belohnung für die Ad bekommt.
    rewardedAd.OnUserEarnedReward += HandleUserEarnedReward;
    // Wird aufgerufen, wenn die RewardedAd geschlossen wurde.
    rewardedAd.OnAdClosed += HandleRewardedAdClosed;

    // ...
}

public void HandleRewardedAdLoaded(object sender, EventArgs args) {
    Debug.Log("HandleRewardedAdLoaded event received");
}

public void HandleRewardedAdFailedToLoad(object sender, AdErrorEventArgs args) {
    Debug.Log( "HandleRewardedAdFailedToLoad event received with message: " + args.Message);
}

public void HandleRewardedAdOpening(object sender, EventArgs args) {
    Debug.Log("HandleRewardedAdOpening event received");
}

public void HandleRewardedAdFailedToShow(object sender, AdErrorEventArgs args) {
    Debug.Log("HandleRewardedAdFailedToShow event received with message: " + args.Message);
}

public void HandleRewardedAdClosed(object sender, EventArgs args) {
    Debug.Log("HandleRewardedAdClosed event received");
    // Nächste RewardAd vorladen
    CreateAndLoadRewardedAd();
}

public void HandleUserEarnedReward(object sender, Reward args) {
    string type = args.Type;
    double amount = args.Amount;
    coins += amount;        // Hier den Reward dem Spieler geben
    Debug.Log("HandleRewardedAdRewarded event received for " + amount.ToString() + " " + type);
}        

AdManager testen

Im folgenden stehen alle Funktionen, die wir jetzt implementiert haben.
AdManager.Instance.RequestBanner();
AdManager.Instance.RequestInterstatial();
AdManager.Instance.RequestRewardedAd();