Unity 研究期間の成果

# はじめに
研究期間（実装したことないものを実装する期間）中に実装したものについて、実装方法や参考資料を本記事にまとめました。
他に面白そうな実装物などあれば、是非コメント下さい！





# 目次
１．AdMob起動時広告の実装
２．Google Play In-App Review APIの実装
３．AdMobネイティブ広告の実装
４．AdMob収益受け取り方法
５．Gitの環境構築
６．NetlifyでHP制作








# 1.AdMob起動時広告の実装
公式サンプルスクリプト：https://github.com/googleads/googleads-mobile-unity/tree/main/samples/HelloWorld

①下記サイトから "GoogleMobileAds-v7.1.0.unitypackage" をダウンロードする
※v7.2.0は未確認

https://github.com/googleads/googleads-mobile-unity/releases/tag/v7.1.0

②Unityのプロジェクト内に①でダウンロードした "GoogleMobileAds-v7.1.0.unitypackage" をインポートする

③下記サイトから "MainScene.cs" と "AppOpenAdManager.cs" をダウンロードする

https://github.com/googlecodelabs/admob-appopen-unity/tree/main/complete/Assets/Scripts

④Unityのプロジェクト内に②でダウンロードした "MainScene.cs" と "AppOpenAdManager.cs" をインポートする

⑤広告を表示させたいシーン内に空のオブジェクトを作成し、④でインポートした "MainScene.cs" をアタッチする

■備考
実機テストで表示されない場合、新規プロジェクトを作成し、再度実装し直したところ表示されるようになりました。
原因は不明です。

参考環境：下記サイトの "complete" をダウンロードし、Unity Hubで開く

https://github.com/googlecodelabs/admob-appopen-unity





# 2.Google Play In-App Review APIの実装
①下記サイトから "com.google.play.review-1.8.0.unitypackage" をダウンロードする

https://github.com/google/play-unity-plugins/releases/tag/v1.8.0

②Unityのプロジェクト内に①でダウンロードした "com.google.play.review-1.8.0.unitypackage" をインポートする

③Unityのプロジェクト内に "Review" というC#スクリプトを作成し、中身を下記コードに置き換える

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Google.Play.Review;
using System;
using UnityEngine.Events;

public class Review : MonoBehaviour
{

    [Serializable] public class OnViewedEvent : UnityEvent { }
    [SerializeField] OnViewedEvent _onViewedEvent = default;

    public void StartRate()
    {
        if (Application.platform == RuntimePlatform.Android) {
            // Android
            StartCoroutine(ShowReviewCoroutine());
        } else {
            Debug.Log("Request Store Review is not supported");
            _onViewedEvent.Invoke();
        }
    }

    IEnumerator ShowReviewCoroutine()
    {
        // https://developer.android.com/guide/playcore/in-app-review/unity
        var reviewManager = new ReviewManager();
        var requestFlowOperation = reviewManager.RequestReviewFlow();
        yield return requestFlowOperation;
        if (requestFlowOperation.Error != ReviewErrorCode.NoError) {
            // エラーの場合はここで止まる.
            _onViewedEvent.Invoke();
            yield break;
        }
        var playReviewInfo = requestFlowOperation.GetResult();
        var launchFlowOperation = reviewManager.LaunchReviewFlow(playReviewInfo);
        yield return launchFlowOperation;
        playReviewInfo = null; // Reset the object
        if (launchFlowOperation.Error != ReviewErrorCode.NoError) {
            // エラーの場合はここで止まる.
            _onViewedEvent.Invoke();
            yield break;
        }
        _onViewedEvent.Invoke();
    }

    public void AddViewedCb(UnityAction cb)
    {
        _onViewedEvent.RemoveAllListeners();
        _onViewedEvent.AddListener(cb);
    }
}
```

④レビューを表示させたいシーン内に空のオブジェクトを作成し、③で作成した "Review.cs" をアタッチする

⑤レビューを表示させたいシーン内にUIのボタンを配置し、クリック時の動作に"Review.cs" の ”StartRate” を登録する

⑥④で作成したオブジェクト内の "Review.cs" にレビュー後の動作を登録する

■備考
実機テストで表示される条件
・Google Play Storeからダウンロードしたアプリのみ実機テスト可能
⇒Unity上の "ビルドして実行" では表示されません
・Google Play StoreのアカウントがGoogle Developersのアカウントであることを確認する
⇒Google Developers以外のテスターメンバーでは表示されなかった

参考サイト：

https://carknow.jp/unity/goole-play-in-app-review/





# 3.AdMobネイティブ広告の実装
下記動画に沿って実装を行う

https://youtu.be/M-XdptsCWtQ

※１　AdMobプラグイン/アドオンは下記を利用する

Google Mobile Ads Unity プラグイン 

https://github.com/googleads/googleads-mobile-unity/releases/download/v7.1.0/GoogleMobileAds-v7.1.0.unitypackage

ネイティブ広告アドオン

https://dl.google.com/googleadmobadssdk/GoogleMobileAds-native.unitypackage?hl=ja

※２　ネイティブ広告のスクリプトは下記を利用する

```c#
using UnityEngine;
using UnityEngine.UI;
using GoogleMobileAds.Api;
using System;

public class AdMobNative : MonoBehaviour
{
	private bool nativeAdLoaded;
	private NativeAd nativeAd;
	private string adUnitId;

	[SerializeField] GameObject adNativePanel;
	[SerializeField] RawImage adIcon;
	[SerializeField] RawImage adChoices;
	[SerializeField] Text adHeadline;
	[SerializeField] Text adCallToAction;
	[SerializeField] Text adAdvertiser;

	void Awake()
	{
		adNativePanel.SetActive(false); //hide ad panel
	}

	void Start()
	{
		//AndroidとiOSで広告IDが違うのでプラットフォームで処理を分けます。
		// 参考
		//【Unity】AndroidとiOSで処理を分ける方法
		// https://marumaro7.hatenablog.com/entry/platformsyoriwakeru

#if UNITY_ANDROID
		adUnitId = "ネイティブ広告ID";//ここにAndroidのネイティブ広告IDを入力
#elif UNITY_IPHONE
        adUnitId = "ネイティブ広告ID";//ここにiOSのネイティブ広告IDを入力
#else
        adUnitId = "unexpected_platform";
#endif

		RequestNativeAd();
	}

	void Update()
	{
		if (this.nativeAdLoaded)
		{
			this.nativeAdLoaded = false;

			Texture2D iconTexture = this.nativeAd.GetIconTexture();
			Texture2D iconAdChoices = this.nativeAd.GetAdChoicesLogoTexture();
			string headline = this.nativeAd.GetHeadlineText();
			string cta = this.nativeAd.GetCallToActionText();
			string advertiser = this.nativeAd.GetAdvertiserText();
			adIcon.texture = iconTexture;
			adChoices.texture = iconAdChoices;
			adHeadline.text = headline;
			adAdvertiser.text = advertiser;
			adCallToAction.text = cta;

			//register gameobjects
			nativeAd.RegisterIconImageGameObject(adIcon.gameObject);
			nativeAd.RegisterAdChoicesLogoGameObject(adChoices.gameObject);
			nativeAd.RegisterHeadlineTextGameObject(adHeadline.gameObject);
			nativeAd.RegisterCallToActionGameObject(adCallToAction.gameObject);
			nativeAd.RegisterAdvertiserTextGameObject(adAdvertiser.gameObject);

			adNativePanel.SetActive(true); //show ad panel
		}
	}

	private void RequestNativeAd()
	{
		AdLoader adLoader = new AdLoader.Builder(adUnitId)
			.ForNativeAd()
			.Build();
		adLoader.OnNativeAdLoaded += this.HandleNativeAdLoaded;
		adLoader.OnAdFailedToLoad += this.HandleNativeAdFailedToLoad;
		adLoader.LoadAd(new AdRequest.Builder().Build());
	}

	private void HandleNativeAdLoaded(object sender, NativeAdEventArgs args)
	{
		Debug.Log("Native ad loaded.");
		this.nativeAd = args.nativeAd;
		this.nativeAdLoaded = true;
	}

	private void HandleNativeAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
	{
		Debug.Log("Native ad failed to load: " + args.LoadAdError);
	}
}
```





# 4.AdMob収益受け取り方法
下記サイトを参考にお支払い方法を設定する

https://kumasatoblog.com/admob_setting/





# 5.Gitの環境構築
下記サイトを参考にGitの環境構築を行う

https://prog-8.com/docs/git-env

Gitでプッシュするまでの手順は下記サイトを参考にする

https://qiita.com/yukiyoshimura/items/7aa4a8f8db493ab97c2b

また、コミットの際にviエディタが開いた際は、下記サイトの手順を参考に保存/閉じるを行う

https://www.granfairs.com/blog/staff/git-commit-fix





# 6.NetlifyでHP制作
下記サイトを参考に環境を構築する
※Gitの環境構築は完了しているものとする

https://yojiroo.blogspot.com/2020/02/netlify.html

補足として、VScodeをインストールし、VScodeからリモートリポジトリにプッシュできるようにすると便利である