キューバに行ってみたい

ゲーム開発とかWeb開発とか

[Unity] Android 端末で Admob のバナー広告のテスト広告配信が読み込まれなかった時の解決策

Unity で開発中のアプリが Android 端末で Admob のバナー広告のテスト広告配信が読み込まれませんでした。

備忘録として、その時の解決方法を書いておきます。
※実施は自己責任でお願いします。

不具合の事象は、以下の状況でした。

本番広告 テスト広告
端末A ×
端末B ×

設定は同じで端末ごとに挙動が異なることから、端末のキャッシュ周りで問題がありそうだったので、調査していたところ以下の方法で解決しました。

解決方法

端末の 設定 > アプリ > 全てのアプリを表示 > Google Play 開発者サービス > ストレージとキャッシュ > キャッシュを削除 を行うことで読み込むことができました。

どうやら Admob は Google Play 開発者サービス に統合されているらしく、その影響があるようでした。

tips ですが以上です。

[Unity] 簡単に端末にデータの保存ができる PlayerPrefs を紹介する

Version unity 2021.3.01.f1 で動作検証を行なっています。

ゲーム開発をしているとゲームスコアのようなちょっとしたデータを保存したいことがよくあります。

データの保存方法はいくつか方法がありますが、サーバーの実装が不要で簡単に端末にデータを保存できる PlayerPrefs という機能を紹介します。

docs.unity3d.com

PlayerPrefs は Key, Value でデータを保存することができます。

早速見ていきましょう。

データを保存する

データを保存するメソッドは3用意されており、それぞれ Value の型によって使い分けます。 * SetFloat() * SetInt() * SetString()

メソッド名の如く Value の型によって Float, Int, String をそれぞれ使い分けます。

PlayerPrefs.SetFloat("key_float", 1.0f);
PlayerPrefs.SetInt("key_int", 1);
PlayerPrefs.SetString("key_string", "1");

Save() というメソッドもありますが、上記メソッドで Save() まで行ってくれる為呼び出す必要はありません。

アプリ Crash 時などで保存に失敗したくない時などに使うことがあるそうです。

データを取得する

データの取得方法も保存時と同様に3つのメソッドが用意されています。

  • GetFloat()
  • GetInt()
  • GetString()

これらのメソッドを使うことで key に対応するデータを取得することができます。

float f = PlayerPrefs.GetFloat("key_float");
int i = PlayerPrefs.SetInt("key_int");
string s = PlayerPrefs.SetString("key_string");

データを削除する

データの削除は2つ方法があります。

  • DeleteKey()
  • DeleteAll()

DeleteKey() は key に対応するデータのみ削除することができます。

DeleteAll() メソッド名の如く全てのデータを削除します。

PlayerPrefs.DeleteKey("key_float");
PlayerPrefs.DeleteAll();

データの存在を確認する

  • HasKey()

HasKey() を使うことで key に対応するデータが存在していれば true 存在していなければ false を返し、存在を確認することができます。

PlayerPrefs.HasKey("key_float");

Unity Editor 上でのデータ削除方法

Unity Editor 上で保存された PlyaerPrefs を削除したいことがあるかと思うので tips として紹介しておきます。

Edit > Clear All PlayerPrefs で全ての PlayerPrefs のデータを削除することができます。

[Unity] build 設定で過去に build 設定した Scene を完全に削除する方法

Version unity 2021.2.17. f1 で動作検証を行なっています。

build 対象の Scene 設定において、過去に build 対象にした Scene を除外すると deleted として index も残り続けます。

Scene の数が多くなるようなゲームを開発していると削除する可能性もありえる為、これらが溜まってしまい視認性も悪くなってしまいます。

削除方法

build 対象の Scene は ProjectSettings/EditorBuildSettings.asset というファイルで管理されています。

このファイル以下のような YAML ファイルになっています。(一部抜粋)

  - enabled: 1
    path: Assets/Scenes/Stages/Stage6Scene.unity
    guid: xxxxxxx
  - enabled: 0
    path: 
    guid: 00000000000000000000000000000000
  - enabled: 0
    path: 
    guid: 00000000000000000000000000000000
  - enabled: 0
    path: 
    guid: 00000000000000000000000000000000

enabled: 1 が有効な Scene なので enabled: 0 のものを削除することで index からも削除され整理することができます。

他に影響がないとは思いますが、自己責任でお願いします。

[Unity] EventTrigger を使ってテキストをクリックできるようにする

Version unity 2020.3.32.f1 で動作検証を行っています。

Button オブジェクトにはクリックで何かしら処理をさせるというような仕組みが初めから用意されていますが、
Text のようなオブジェクトはそのような仕組みが用意されていません。

Button オブジェクト以外でもクリックで何かしら処理をしたいことがあるかと思います。

今回はそのような場合の実装方法の一例を紹介したいと思います。

実装方法

まずテキストに EventTrigger の component を追加します。

そして以下の script を作成し、テキストにアタッチします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Click : MonoBehaviour
{
    public void OnClick()
    {
        this.gameObject.GetComponent<Text>().text = "isClick";
    }
}

OnClick メソッドではテキストを "isClick" に変更する処理を書いています。

次に先ほど追加した EventTrigger Component で Event Type Pointer Down を追加します。
この Pointer Down ではポインターがオブジェクトを押下したことを検知することができます。

最後に Pointer Down の Event として OnClick メソッドを登録することで、
オブジェクトを押下すると OnClick メソッドを発動することができます。

分かりにくいですが、このように動作確認することができます。

簡単ですが以上です。

[Unity] 画面のどこをタップしても画面遷移できる画面を実装する

Version unity 2020.3.27.f1 で動作検証を行っています。

スマホゲームを開発していると画面をタップしてゲームスタートさせるというような画面を作成したいことがあるかと思います。

このように画面のどの部分をタップしても画面遷移ができる画面です。

今回はこのような画面の実装方法について紹介したいと思います。

実装方法

Tap To Start というテキストは単純に画面の中心に配置し、特に Script のアタッチなどは行いません。

ポイントとなるのが TapObj で、これは空オブジェクトを画面全体に配置し、全体に BoxCollider2D をアタッチしています。

こうすることで画面をタップするイベントを拾うことができます。

そして以下の script を作成して TapObj にアタッチします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class TapToStart : MonoBehaviour
{
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            SceneManager.LoadScene("Stage1Scene");
        }
    }
}

この script は Update() メソッドでタップされたことをチェックし、タップされた場合 Stage1Scene に遷移するといった内容になっています。

以上で画面のどこをタップしても遷移する画面を作成することができます。

より良い実装方法があれば、ぜひ教えていただけると助かります。

[Unity] script で子オブジェクトを全て削除する

Version unity 2020.3.27.f1 で動作検証を行っています。

特定のオブジェクトの子オブジェクトを全て削除したいことがあるかと思います。

例として、ボタンをクリックすると Canvas の子オブジェクトのテキストを全て削除する実装を紹介します。

実装方法

このように DeleteCanvas の子オブジェクトに複数 Text を配置します。

そしてこれらの Text を削除する script を以下のように用意して、button にアタッチします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class DeleteAllText : MonoBehaviour
{
    [SerializeField] private Canvas canvas;
    public void Delete()
    {
        foreach (Transform g in this.canvas.gameObject.transform)
        {
            Destroy(g.gameObject);
        }
    }
}

やっていることは子要素分 foreach でループさせて削除しているだけになります。

今回は以上になります。

[Unity] n秒ごとにイベントを発火する script を書いてみる

Version unity 2020.3.27.f1 で動作検証を行っています。

特定の周期でテキストを点滅させたいなどあるかと思います。

今回はそのような n秒ごとに特定のイベントを実行したい時の実装例を紹介します。

0.5秒ごとにテキストを点滅させてみる

例ではテキスト (TextMeshPro) を 0.5秒ごとに点滅させます。

こんな感じです。

以下の script を text にアタッチします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;


public class BlinkingTextController : MonoBehaviour
{
    private TextMeshProUGUI t;
    private float alpha = 1.0f;
    private float elapsedTime = 0f;

    private void Start()
    {
        this.t = this.gameObject.GetComponent<TextMeshProUGUI>();
    }

    private void Update()
    {
        Blink();
    }

    private void Blink()
    {

        this.elapsedTime += Time.deltaTime;
        if (this.elapsedTime > 0.5f)
        {
            this.alpha = this.alpha == 1.0f ? 0.0f : 1.0f;
            this.t.color = new Color(255, 255, 255, alpha);
            this.elapsedTime = 0.0f;
        }
    }
}

elapsedTime に Time.deltaTime を加算し前フレームからの経過時間を積み重ねます。

elapsedTime (経過時間) が 0.5f秒経過するごとに text の alpha値を変更して点滅させています。

今回はテキストを点滅させましたが、他の処理でも応用することができるかと思います。

簡単ですが以上です。