サイトアイコン StudioFun

TapTapTap!!!(13)~広告を見てライフを回復させる~

TapTapTap

TapTapTap!!!(12)~ライフ管理機能を追加する~ではソーシャルゲームでよく見かけるライフ管理機能を実装した。今回は Unity Ads を効果的に使用するために Unity Ads を見たらライフを回復するように修正する。

1.画面上にライフ回復用ボタンを追加する

画面上に「ライフを回復」ボタンを追加する。ボタンの追加方法については、TapTapTap!!!(1)~画面上にボタンを設置する~ で行っているため省略する。ボタンの位置は任意の位置に設定すると良いだろう。

2.広告表示用のシーンを作成する

広告を表示するようの「Ads」 シーンを追加する。シーンの追加方法については、TapTapTap!!!(8)~スタート画面を追加する~で行っているためここでは省略する。

3.広告表示用のオブジェクトを作成する

今回の本題はここから。TapTapTap!!!(11)~Unity の Ads 機能を使用する~で Unity Ads のスクリプトは記載したが何もないところにスクリプトは記載できない。そこで、今回は空のオブジェクトを作成してスクリプトを適応する。まず、[Project]タブの「Ads」シーンをダブルクリックし,「Ads」シーンを表示する。その後、[Game Object] > [Create Empty] から空のゲームオブジェクトを生成する。

空のオブジェクト追加

4.広告を見たらライフが回復するようスクリプトを改良する

まずは、「LifeManager」でライフが加算できるように新たに AddLife の関数を加える

[cce_csharp]using System;
using UnityEngine;

public class LifeManager : MonoBehaviour
{   
    /// <summary>
    /// 現在ライフ保存用のキー
    /// </summary>
    private static string CURRENT_LIFE = "CurrentLife";
    /// <summary>
    /// 最新ライフ回復時刻保存用のキー
    /// </summary>
    private static string LAST_RECOVERY_TIME = "RecoveryTime";
    /// <summary>
    /// 最大ライフ数
    /// </summary>
    [SerializeField]
    private int MaxLife;
    /// <summary>
    /// 回復時間
    /// </summary>
    [SerializeField]
    private int RecoveryTime;
    /// <summary>
    /// 現在のライフ
    /// </summary>
    public int CurrentLife { get; private set; }
    /// <summary>
    /// 最新ライフ回復時刻
    /// </summary>
    private DateTime LastRecoveryTime;
    /// <summary>
    /// 最新ライフ回復時刻と現在時刻の差
    /// </summary>
    private int DiffSeconds;



    /// <summary>
    /// 初期化処理。
    /// 最終プレイ時のライフや回復時刻を読み込む。
    /// 読み込めないときは最大ライフとする。
    /// </summary>
    public void Init()
    {
        // ライフの読み込み
        if (PlayerPrefs.HasKey(CURRENT_LIFE))
        {
            CurrentLife = PlayerPrefs.GetInt(CURRENT_LIFE);
        }
        else
        {
            CurrentLife = MaxLife;
        }
        // 最新回復時刻の読み込み
        DateTime NowTime = DateTime.Now;
        if (PlayerPrefs.HasKey(LAST_RECOVERY_TIME))
        {
            string StrRecoveryTime = PlayerPrefs.GetString(LAST_RECOVERY_TIME);
            LastRecoveryTime = DateTime.FromBinary(Convert.ToInt64(StrRecoveryTime));
            DiffSeconds = (int)(NowTime - LastRecoveryTime).TotalSeconds;
            CurrentLife += DiffSeconds / RecoveryTime;
            if (RecoveryTime < DiffSeconds)
            {
                LastRecoveryTime = NowTime;
            }
        }
        else
        {
            PlayerPrefs.SetString(LAST_RECOVERY_TIME, NowTime.ToBinary().ToString());
        }
        if (MaxLife < CurrentLife)
        {
            CurrentLife = MaxLife;
        }
    }
    /// <summary>
    /// 次の回復時刻までの時間取得
    /// </summary>
    /// <returns>次までの回復時間</returns>
    public string GetNextTime()
    {
        if (MaxLife <= CurrentLife)
        {
            return "00:00";
        }
        return ((RecoveryTime- DiffSeconds) / 60) + ":" + ((RecoveryTime - DiffSeconds) % 60);
    }
    /// <summary>
    /// ライフの使用。ゲームを開始する際にライフを使用する
    /// </summary>
    /// <returns>ライフが残っていれば true, 残っていなければ false</returns>
    public bool UseLife()
    {
        if (0 < CurrentLife)
        {
            CurrentLife--;
            PlayerPrefs.SetInt(CURRENT_LIFE, CurrentLife);
            return true;
        }
        return false;
    }
    /// <summary>
    /// ライフの追加
    /// </summary>
    public void AddLife()
    {
        if (CurrentLife < MaxLife)
        {
            DiffSeconds = 0;
            CurrentLife++;
            PlayerPrefs.SetInt(CURRENT_LIFE, CurrentLife);
        }
    }
    /// <summary>
    /// 逐次の更新処理時間の保存やライフ回復処理を行う
    /// </summary>
    void Update()
    {
        if (MaxLife <= CurrentLife)
        {
            DiffSeconds = 0;
            return;
        }
        DateTime NowTime = DateTime.Now;
        DiffSeconds = (int)(NowTime - LastRecoveryTime).TotalSeconds;
        if (RecoveryTime < DiffSeconds)
        {
            CurrentLife++;
            LastRecoveryTime = NowTime;
            PlayerPrefs.SetString(LAST_RECOVERY_TIME, NowTime.ToBinary().ToString());
            PlayerPrefs.SetInt(CURRENT_LIFE,CurrentLife);
        }
    }
}[/cce_csharp]

TapTapTap!!!(11)~Unity の Ads 機能を使用する~で作成したスクリプトに Unity Ads の表示が終わったら、「Start」画面に戻る処理を加える。

[cce_csharp]using System.Collections;
using UnityEngine;
using UnityEngine.Advertisements;
using UnityEngine.SceneManagement;

public class ShowAdOnStart : MonoBehaviour
{
#if !UNITY_ADS // 広告が有効でなかったときの処理
    public string gameId; // Set this value from the inspector.
    public bool enableTestMode = true;
#endif
    /// <summary>
    /// 広告表示開始処理
    /// </summary>
    /// <returns></returns>
    public IEnumerator Start()
    {
#if !UNITY_ADS // 広告が有効でなかったときの処理
        if (Advertisement.isSupported)
        { // If runtime platform is supported...
            Advertisement.Initialize(gameId, enableTestMode); // ...initialize.
        }
#endif

        // 広告表示の初期化処理
        while (!Advertisement.isInitialized || !Advertisement.IsReady())
        {
            yield return new WaitForSeconds(0.5f);
        }

        // 広告の表示.
        Advertisement.Show();
        SceneManager.LoadScene("Start");
    }
}[/cce_csharp]

出来上がったスクリプトを先程作成した、空のゲームオブジェクトに追加する。

5.Unity Ads 移動用スクリプトを作成する

まずは「GoToAds」というスクリプトファイルを作成する。スクリプトファイルの作り方については TapTapTap!!!(2)~ボタンを出現・消滅させる~ で行っているため省略する。スクリプトの内容はほとんどTapTapTap!!!(8)~スタート画面を追加する~で作成したスクリプトを流用できると思う。内容はクリックしたときにライフを回復した後、「Ads」ページに移動するというものだ。

[cce_csharp]using UnityEngine.SceneManagement;

public class GoToAds : MonoBehaviour {

    /// <summary>
    /// 「ライフを回復する」ボタンタップ時の処理
    /// </summary>
    public void OnClick()
    { 
        FindObjectOfType<LifeManager>().AddLife();
        SceneManager.LoadScene("Ads");
    }
}[/cce_csharp]

これを「ライフ回復ボタン」にドラッグアンドドロップで追加して、諸々の設定を行うことで実現できる。

 

モバイルバージョンを終了