FacebookでUnityのゲーム広告を配信するまで

Unityで製作したFacebookで広告を配信する方法が書かれた記事が少なかったため、情報共有のため書きます。

# 全体の流れ

1. Facebookへの登録
1. Meta for Developersへの登録
1. Facebook SDKをUnityにインポートする
1. ATT(App Tracking Transparency)への対応
1. AndroidでBuildする時の注意点
1. 広告を出稿する

# 環境
MacBook Pro Monterey 12.0
Unity 2020.3.24f1
Facebook SDK 11.0

なお、Facebookは設定方法やWebのレイアウトが頻繁に更新されるので、手順が違った場合、適宜自分で調べてください。

# Facebookへの登録

まず、Facebook Business Managerへの登録をします。Facebook Business Managerとは、広告アカウント、Facebookページ、アカウントの権限などを全て一か所で設定できるサイトです。

https://business.facebook.com/

次に、**広告アカウント**と**支払方法**を追加していきます。
詳しいやり方は省きますので、こちらの動画を参考にしてください。Business Managerは構造が複雑ですが、それが適切に説明されているので理解しやすいと思います。また、やってはいけない広告出稿についても言及されています。

https://www.youtube.com/watch?v=ExOC3YwEUOM

https://www.youtube.com/watch?v=JyPsDBp_114&t=153s

:::note info
また、Instagramのアカウントも作っておくと後々便利かと思います。FacebookはInstagramへの広告も自動でしてくれます。
:::




# Meta for Developersへの登録

Meta for Developersへの登録をします。Meta for Developersとは、Facebookを使ったログインなどを簡単に実装できるツール群です。これで、アプリとFacebook Business Managerを紐づけます。

https://developers.facebook.com/

### アプリの作成

1. ログインする
1. 右上の**マイアプリ**をクリック
1. **アプリの作成**をクリック
1. **ゲーム**を選択
1. 必要な情報を入力する

とりあえず以上です。Facebook SDKをインポートしたら、また戻ってきます。




# Facebook SDKをUnityにインポートする

下記のリンクからFacebook SDK for Unityを入手します。

https://developers.facebook.com/docs/unity

unity packageをインポートします。
タブに**Facebook**が追加されるので、**Edit Settings**を選択。
![スクリーンショット 2022-01-31 9.46.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679785/fb4fe42d-34f3-5ea7-eb7f-a594b94f346d.png)

するとインスペクターに表示されるので、先ほどMeta for Developersで作ったアプリの**Facebook App Id**をインスペクターに入力します。**Facebook App Id**は**設定＞ベーシック**から見れます。

また、androidでローンチする場合は、**Debug Android Key Hash**も後に必要なのでメモしておきます。
![スクリーンショット 2022-01-31 9.48.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679785/cc917c79-a1e7-3462-5a47-180dca5764ff.png)


Meta for Developersに戻り、**設定＞ベーシック**から、必要な情報を入手します。
その後、ページの下部の**プラットフォームを追加**から任意のプラットフォームを選択します。必要な情報を入手してください。

iOSの場合、**iPhoneストアID**や**iPadストアID**を記入する欄があるのですが、それはAppleStoreのURLの**id**と書かれた番号になります。
![スクリーンショット 2022-01-31 101111_LI (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679785/50b7585e-d53c-402b-8a78-a7ad59feb6ea.jpeg)
Androidの場合、**キーハッシュ**が先ほどメモした**Debug Android Key Hash**になります。

# ATT(App Tracking Transparency)への対応

広告からアプリへの流入を計測するためにFacebook SDKをInisializeする必要があります。これをしないと広告出稿出来ません。


https://developers.facebook.com/docs/unity/examples

https://developers.facebook.com/docs/app-events/guides/advertising-tracking-enabled

また、iOS14.5以降ATT(App Tracking Transparency)へ対応するために、ダイアログを表示します。
自分はAdmobも使用しているので、そこに付け足す形で実装しました。詳しい解説は下記のリンクをご覧ください。

http://blog.be-style.jpn.com/article/188329627.html

一応コードも置いておきますが、これが正しい使い方か分かりません・・・
正しい情報知っている方がいらしたら、情報提供お願いします。

```C#:ATT.cs
using UnityEngine;
using UnityEngine.SceneManagement;
using GoogleMobileAds.Api;
using GoogleMobileAds.Common;
using GoogleMobileAds.Placement;
using Facebook.Unity;
using System;

public class ATT : MonoBehaviour
{


    private void Awake()
    {
#if UNITY_IOS
        int status = ATTUtili.GetTrackingAuthorizationStatus();
        Debug.Log("ATT状態 = " + status);
        // ATT状態は4択
        // ATTrackingManagerAuthorizationStatusNotDetermined = 0
        // ATTrackingManagerAuthorizationStatusRestricted    = 1
        // ATTrackingManagerAuthorizationStatusDenied        = 2
        // ATTrackingManagerAuthorizationStatusAuthorized    = 3
        if (status == 0)
        {
            // ATT設定可能 & 未承認なのでATT承認要求アラートを表示
            ATTUtili.RequestTrackingAuthorization(CallbackFunction);
        }
        else
        {
            if (status == 1 || status == 2)
            {
                // ATT設定不可なので、ATT承認が必要になる旨をユーザーに伝える
            }
            else if(status == 3)
            {
                FB.Init(this.OnInitComplete, this.OnHideUnity);
            }
            // Google Mobile Ads SDK を初期化
            MobileAds.Initialize(initStatus =>
            {
                // AdMobからのコールバックはメインスレッドで呼び出される保証がないため、次のUpdate()で呼ばれるようにMobileAdsEventExecutorを使用
                MobileAdsEventExecutor.ExecuteInUpdate(() =>
                {
                    // バナーをリクエスト
                    RequestAds();
                });
            });
        }

#elif UNITY_ANDROID
        MobileAds.Initialize(initStatus =>
        {
            // AdMobからのコールバックはメインスレッドで呼び出される保証がないため、次のUpdate()で呼ばれるようにMobileAdsEventExecutorを使用
            MobileAdsEventExecutor.ExecuteInUpdate(() =>
            {
                // バナーをリクエスト
                RequestAds();
            });
        });
#endif
    }

    private void OnHideUnity(bool isUnityShown)
    {

    }

    private void OnInitComplete()
    {
        if (FB.IsInitialized)
        {
            FB.ActivateApp();
        }
        else
        {
            //Handle FB.Init
            FB.Init(() => {
                FB.ActivateApp();
                FB.Mobile.SetAdvertiserTrackingEnabled(true);
            });
        }
    }

    void CallbackFunction(int status)
    {
        Debug.Log("ATT最新状況 --> " + status);
        // ATTの状況を待ってから Google Mobile Ads SDK を初期化
        MobileAds.Initialize(initStatus => {
            // AdMobからのコールバックはメインスレッドで呼び出される保証がないため、次のUpdate()で呼ばれるようにMobileAdsEventExecutorを使用
            MobileAdsEventExecutor.ExecuteInUpdate(() => {
                // バナーをリクエスト
                RequestAds();
            });
        });

        // Facebook SDK
        if (status == 1 || status == 2)
        {
            // 設定不可
        }
        else if (status == 3)
        {
            FB.Init(this.OnInitComplete, this.OnHideUnity);
        }
    }

    void RequestAds()
    {
        //バナーをリクエスト
    }

```

# AndroidでBuildする時の注意点

AndroidをBuildする際、Facebook SDKが他のUnityPackageと競合を起こすので解消します。そのままBuild通る方はやらなくても大丈夫だと思います。

## 1. Error
 `Configure project :launcher WARNING: The option setting 'android.enableR8=false' is deprecated`

#### 対策 
Project Settings＞Player＞Android＞Publish Settings＞Build＞Custom Gradle Properties Templateをチェック。表示されるファイルのR8該当行の先頭に#を追加

``` 
#android.enableR8=MINIFY_WITH_R_EIGHT
```
## 2. Error
` D8: Cannot fit requested classes in a single dex file (# methods: xxxxx > 65536) com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: The number of method references in a .dex file cannot exceed 64K.`

#### 対策
Project Settings＞Player＞Android＞Publish Settings＞Build＞Custom Launcher Gradle Templateを開く。表示されるファイルに以下の行を追加する。

```:build.gradle
android {
    defaultConfig {
        ...
        minSdkVersion 15
        targetSdkVersion 28
        multiDexEnabled true  <<これ
    }
    ...
}

dependencies {
    implementation "androidx.multidex:multidex:2.0.1" <<これ
}
```


対策は下記のリンクを参考にしました。

https://qiita.com/flysaki/items/f022ae9a714db2b16674



# 広告を出稿する

長くなったので別記事です。

https://qiita.com/1mono2/items/348cb2619a28e927edfd






# 参考にしたドキュメント

https://anagrams.jp/blog/facebook-mobile-app-ad-campaign/#i-4

https://3dcg-school.pro/unity-hyper-casual-game-development-tutorial/


https://developers.facebook.com/docs/unity/gettingstarted


# 自己紹介
ハイパーカジュアルゲームを個人製作してます！
フォローお願いします！
[@1MoNo2Prod](https://twitter.com/1MoNo2Prod)


以上です。情報漏れや意見などございましたら、気軽にコメントしてください。フィードバック待ってます！