そういうのがいいブログ

アプリ個人開発 まるブログ

アプリ開発覚え書き

【Unity】GDPR対応 UMPを使用し同意フォームを表示する方法 Android iOS

仕様

Unityバージョン:2021.3.27f1
GoogleMobileAds-v8.5.3

前提

・GoogleMobileAdsをプロジェクトに導入済みであること
・広告が表示できる状態であること

はじめに

AdMobの管理画面にこんなメッセージが出てきました。

欧州にもアプリを出していきたいのでGDPR対応をしていきます。
GDPRについての説明は省略します。

警告文にいろいろ書いてありますが
どこかの会社の同意管理プラットフォームと契約してユーザーの同意を得るか
Googleが用意した同意管理の様式でユーザーの同意を得るかという理解をしました。

下記の文にあるUMP(User Messaging Platform) SDK
使用して対応していけばよさそうです。
このUMP SDKはGoogleMobileAdsに含まれています。

Google の同意管理ソリューションに関心をお持ちの場合は、まず GDPR メッセージを設定し、 UMP SDK を実装してください


User Messaging Platform(UMP)SDK設定のページはこちら

https://developers.google.com/admob/unity/privacy?hl=jadevelopers.google.com

注)法律の専門家ではありませんので自己責任にて欧州へのアプリリリースをお願いします。

手順1. 同意依頼メッセージの作成

→AdMob管理画面の「プライバシーとメッセージ」


GDPRの歯車をクリック


→メッセージ
GDPRメッセージを作成


以下の画面になるので各項目を入力します。


アプリの選択の他は以下のように設定しました。


次に進むとユーザーに表示する同意画面のプレビューになります。
以下の設定にして公開しました。
アプリ:対象のアプリが選択されていることを確認
言語:デフォルトの言語は英語に設定
別の言語:すべての言語にチェック

手順2.アプリ計測の遅延設定

ここからUnity上での設定になります。

ユーザーの同意が得られるまでユーザーの計測ができないため
Mobile Ads SDK を初期化するか広告を読み込むまで、
アプリの測定を明示的に遅らせる必要があります。

設定は簡単で以下の手順で設定ウインドウ表示してから
→アセット
Google Mobile Ads]
→Settings


同意メッセージのDelay app measurementを有効にします。

手順3.デバイスIDの取得

テストで同意フォームを表示するためには、
手持ちの端末が欧州経済領域(EEA)に存在していると設定する必要があります。
その設定のためには、デバイスのIDが必要ですので最初にデバイスIDを取得してしまいます。
(ここでいうデバイスIDは広告のテストデバイスIDとはまた別の文字列になります。)


端末側での関数の実行結果を確認する必要があるため
下記のコードをアプリ側で実行してください。

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

public class GDPR : MonoBehaviour
{
    void Start()
    {
        //デバッグ用に端末のID取得
        //================================================================
        // 端末固有のIDを取得
        string deviceID = SystemInfo.deviceUniqueIdentifier;

        // 取得したIDを全て大文字に変換(大文字にしないとデバッグができません)
        string deviceIDUpperCase = deviceID.ToUpper();

        // 端末IDの表示
        Debug.Log("TestDeviceHashedId = " + deviceIDUpperCase);
        //================================================================
    }

}


iOSではXcodeから実機テストすると実機ログを確認できます。
例:4C70843B-1592-427A-831F-D72A3298AD5D


Androidではログ確認はできないため、Android Logcatを導入し確認可能にします。
(パッケージを入れるだけなのでとても簡単です。)
marumaro7.hatenablog.com

Android Logcatの検索窓に
TestDeviceHashedId
と打ち込むとデバイスIDが表示されるはずです。
例:F8026D2238D034DD0896BF099FAAD9CC
取得したデバイスIDはメモしておいてください。

手順4.スクリプト作成

スクリプトは次の3ステップで完成となります。
1.基本スクリプトの作成
2.デバイスIDの設定
3.広告読み込みの設定

4-1.基本スクリプトの作成

以下のスクリプトを作成し、空のゲームオブジェクトに割り当てます。
スクリプトの詳しい内容はコメントをご確認ください。

using System.Collections;
using System.Collections.Generic;
using GoogleMobileAds.Api;
using GoogleMobileAds.Ump.Api;
using UnityEngine;

public class GDPR : MonoBehaviour
{
    //広告読み込み開始用
    //広告のスクリプトをインスペクター上でそれぞれ割り付けてください
    //以下は例です。
    //==============================================================
    [SerializeField] private AdMobBanner adMobBanner;
    [SerializeField] private AdMobInterstitial adMobInterstitial;
    [SerializeField] private AdMobReward adMobReward;
    //==============================================================

    private void Start()
    {
        //デバッグ用に端末のID取得
        //================================================================
        // 端末固有のIDを取得
        string deviceID = SystemInfo.deviceUniqueIdentifier;

        // 取得したIDを全て大文字に変換(大文字で登録しないと同意フォームが表示されませんでした)
        string deviceIDUpperCase = deviceID.ToUpper();

        // 端末IDの表示
        Debug.Log("TestDeviceHashedId = " + deviceIDUpperCase);
        //================================================================


        //同意フォームのリクエスト作成
        ConsentRequestParameters request = new ConsentRequestParameters
        {
            // 未成年者の同意に関するタグを設定します。
            // falseはユーザーが未成年者でないことを意味します。
            TagForUnderAgeOfConsent = false,


            //同意フォームテスト用
            //==========================================================================
            //GDPRの対象地域で起動したことにする設定            
            ConsentDebugSettings = new ConsentDebugSettings
            {
                DebugGeography = DebugGeography.EEA,
                TestDeviceHashedIds = new List<string>
                {
                    //同意フォームを表示する端末のデバイスIDを入力
                    //Android 例
                    "F8026D2238D034DD0896BF099FAAD9CC",                    
                    
                    //iOS 例
                    "4C70843B-1592-427A-831F-D72A3298AD5D"
                }
            }
            //==========================================================================            
        };

        // 同意情報の更新をリクエスト
        ConsentInformation.Update(request, OnConsentInfoUpdated);        
    }

    //同意情報の更新後に実行する関数
    private void OnConsentInfoUpdated(FormError consentError)
    {
        if (consentError != null)
        {
            Debug.Log("error consentError = " + consentError);
            return;
        }

        //ユーザーの同意が必要でまだ得られていない場合に、同意フォームをロードして表示します。
        ConsentForm.LoadAndShowConsentFormIfRequired((FormError formError) =>
        {
            //同意が得られなかった時の処理
            if (formError != null)
            {
                Debug.Log("error consentError = " + consentError);
                return;
            }


            //同意ステータス確認
            //https://developers.google.com/admob/unity/reference/namespace/google-mobile-ads/ump/api#namespace_google_mobile_ads_1_1_ump_1_1_api_1aa83ad2ecf6f2a08c584b60cef06f5133
            //NotRequired:同意は必要ありません。CanRequestAds()はtrueとなります。
            //Obtained:ユーザーの同意が得られました。パーソナライズされたものとパーソナライズされていないものは未定義です。
            //Required:ユーザーの同意が必要ですが、まだ取得されていません。
            //Unknown:不明な同意状況。同意状況が確認とれるまではUnkownが表示されます。
            Debug.Log("ConsentStatus = " + ConsentInformation.ConsentStatus.ToString());

            //CanRequestAds()の値確認用
            Debug.Log("CanRequestAds = " + ConsentInformation.CanRequestAds());

            // ここまで処理が進んでいれば同意が得られたことになる
            if (ConsentInformation.CanRequestAds())
            {
                //https://developers.google.com/admob/unity/quick-start?hl=ja
                // true の場合、GoogleMobileAds によって発生するすべてのイベントが発生します
                // Unity メインスレッド上で。 デフォルト値は false です。
                MobileAds.RaiseAdEventsOnUnityMainThread = true;
                 
                //広告の初期化完了後 広告読み込み開始
                MobileAds.Initialize((InitializationStatus initstatus) =>
                {
                    //広告のスクリプト側で設定している広告を読み込む関数をここで実行してください。
                    //広告読み込み開始
                    //以下は例です。
                    //===========================
                    adMobBanner.AdStart();
                    adMobInterstitial.AdStart();
                    adMobReward.AdStart();
                    //===========================
                });
                
            }
        });
    }



    //同意フォームの再表示用
    public void LoadAndShowConsentForm()
    {
        Debug.Log("LoadAndShowConsentForm Start!");

        // 同意フォームをロードします
        ConsentForm.Load((consentForm, loadError) =>
        {
            if (loadError != null)
            {
                Debug.Log("error loadError = " + loadError);
                return;
            }

            // 同意フォームがロードされました
            // フォームを表示します
            consentForm.Show(showError =>
            {
                if (showError != null)
                {
                    Debug.Log("error showError = " + showError);
                    return;
                }
            });
        });
    }


    //GDPRデバッグテスト用 同意情報リセット
    public void GDPRReset()
    {
        Debug.Log("Reset Start!");
        ConsentInformation.Reset();
    }


}



以下、同意フォーム再表示用のLoadAndShowConsentForm()関数と、
同意情報リセットGDPRReset()関数はテストを円滑に実施するために書いています。
不要であれば削除していただいて問題ありません。

同意フォーム再表示用 LoadAndShowConsentForm()関数

    //同意フォームの再表示用
    public void LoadAndShowConsentForm()
    {
        Debug.Log("LoadAndShowConsentForm Start!");

        // 同意フォームをロードします
        ConsentForm.Load((consentForm, loadError) =>
        {
            if (loadError != null)
            {
                Debug.Log("error loadError = " + loadError);
                return;
            }

            // 同意フォームがロードされました
            // フォームを表示します
            consentForm.Show(showError =>
            {
                if (showError != null)
                {
                    Debug.Log("error showError = " + showError);
                    return;
                }
            });
        });
    }


同意情報リセット GDPRReset()関数

    //GDPRデバッグテスト用 同意情報リセット
    public void GDPRReset()
    {
        Debug.Log("Reset Start!");
        ConsentInformation.Reset();
    }

4-2.デバイスIDの設定

下記の部分のデバイスIDを先ほど取得したデバイスIDに差し替えてください。

            //同意フォームテスト用
            //==========================================================================
            //GDPRの対象地域で起動したことにする設定            
            ConsentDebugSettings = new ConsentDebugSettings
            {
                DebugGeography = DebugGeography.EEA,
                TestDeviceHashedIds = new List<string>
                {
                    //同意フォームを表示する端末のデバイスIDを入力
                    //Android 例
                    "F8026D2238D034DD0896BF099FAAD9CC",                    
                    
                    //iOS 例
                    "4C70843B-1592-427A-831F-D72A3298AD5D"
                }
            }
            //========================================================================== 

4-3.広告読み込みの設定

以下の2箇所は私が使用している広告スクリプト名、関数名のため
エラーが発生していると思います。
ご自身のプロジェクトで使用される広告読み込み関数に差し替えてください。

    //広告読み込み開始用
    //広告のスクリプトをインスペクター上でそれぞれ割り付けてください
    //以下は例です。
    //==============================================================
    [SerializeField] private AdMobBanner adMobBanner;
    [SerializeField] private AdMobInterstitial adMobInterstitial;
    [SerializeField] private AdMobReward adMobReward;
    //==============================================================
                //広告の初期化完了後 広告読み込み開始
                MobileAds.Initialize((InitializationStatus initstatus) =>
                {
                    //広告のスクリプト側で設定している広告を読み込む関数をここで実行してください。
                    //広告読み込み開始
                    //以下は例です。
                    //===========================
                    adMobBanner.AdStart();
                    adMobInterstitial.AdStart();
                    adMobReward.AdStart();
                    //===========================
                });

実機確認

実機で起動すると以下のウインドウが表示されるはずです。
※正しいデバイスIDが登録されていないと表示されません。

実装方法は以上です。

広告表示の確認

ここからは同意フォームの入力結果による広告表示のメモとなります。(Android端末で実施)

・「同意」ボタン押下後
問題なし 広告表示される


・「オプションを管理」→「すべて承認」押下後
問題なし 広告表示される

 → 


・「オプションを管理」→「選択を確定」押下後
問題あり 広告が表示されない(詳細設定の内容全てを有効にしても表示されない)

 → 


・「オプションを管理」→「選択を確定」押下後 → フォームを再表示して同意
難あり 再起動すると広告が表示される

詳細
1.「オプションを管理」→「選択を確定」押下後 広告が表示されない状態から
 →   

2.同意フォームを再表示して同意
この状態で同意しても広告は表示されないがアプリを再起動すると広告は表示される


結論、「オプションを管理」→「選択を確定」と押された場合広告が表示されなくなります。
UMP SDKが用意してくれた広告表示可否を判断するための
ConsentInformation.CanRequestAds()
の値はtrueであるためUMP SDKとしては広告が出せると判定されているが
実際は広告を出せないということになります。


これは下記でで2020年から議論されているようですが未だ解決していません。
(Safariで開くとメッセージが省略されるため、
 それぞれのスレッドをクリックして展開する必要があります。)
groups.google.com



それで、どうする??
についてですが、現在、対処法は確定していません。
テストしていったところ、同意状態を示すConsentStatusがObtained(同意)
となった時が同意フォームが表示され、いずれかのボタンが押されたということになるため、

「ConsentStatusがObtained(同意)」かつ「広告のロードが失敗する」

この2つの条件が揃った場合に以下のようなテキストを表示して
同意フォームの同意を促すしかないのかなと考えています。
「同意フォームの同意がなければ広告が発生せず報酬の受け取りができません。
 次のフォームに同意してアプリを再起動してください」


ちなみに、
日本にいてデバイスIDを設定していない時はEEA対象外の地域となるため
同意フォームは表示されずに広告の読み込みは開始されます。
※同意状態を示すConsentStatusはNotRequired(同意の必要なし)となります。

おわりに

広告が出ない状況に対しての最適解がない状態ですが
同意フォームを表示する目的は果たせたので一歩前進です。

残りの未確定ポイントは、iOSのATTリクエストウインドウは
GDPR同意フォームの後に表示することで問題ないのかという点です。

こちらはiOSの審査に出すまでわからないため広告表示問題と併せて
情報がありましたら教えていただけると嬉しいです。

本記事からなにか得るものがありましたら幸いです。ではでは。

プログラム入門本 書きました

marumaro7.hatenablog.com

参考

・参考動画

www.youtube.com


・リファレンス

developers.google.com

developers.google.com


・確認した情報 www.reddit.com

Androidパーソナライズされていない広告を出す方法らしい itnext.io

【Unity】多言語化パッケージ Localization iOS ATT説明文 多言語化

環境

Unity 2022.3.10f1 (シリコン)
Localization 1.4.5

はじめに

iOSでのATT対応は以下の内容で設定していました。
marumaro7.hatenablog.com Localizationパッケージを使用することで
Xcodeで設定していたATTウインドウ説明文を
Unity側で事前に設定可能であるため備忘録として残しておきます。



Localizationパッケージの導入とアプリ名の多言語化が済んでいる前提で話を進めます。

Localizationパッケージの導入 marumaro7.hatenablog.com

Localizationパッケージによるアプリ名変更 marumaro7.hatenablog.com

設定方法

ATT説明文の多言語化はテキスト変更と同様で
Localization Tablesで登録した内容のキーを割り当てることで実現します。

Localization Tablesの表示方法
→ウインドウ
→アセット管理
→Localization Tables

今回は以下の内容で登録します。
キー:ATT
英語:ATTTest
日本語:ATTテスト



そして、ATT文の多言語化
iOSのMetadataのUser Tracking Usage Descriptionで設定します。
→編集
→プロジェクト設定
→Localization
→Metadata
iOS App info
→User Tracking Usage Description

用意したキーを設定することで設定完了です。

おわりに

これまでXcodeで設定していたのは次の2つでした。
1.Info.plistに「Privacy - Tracking Usage Description」を追加
2.「AppTrackingTransparency.framework」を追加

今回設定したのは1番の内容のみであるため
2.「AppTrackingTransparency.framework」の追加はXcodeで設定が必要です。

本を出版しました

marumaro7.hatenablog.com

【Unity】多言語化パッケージ Localization アプリ名多言語化 Android/iOS

環境

Unity 2022.3.10f1 (シリコン)
Localization 1.4.5

はじめに

Localizationパッケージを使用したAndroid/iOSのアプリ名多言語化になります。
パッケージ導入は完了している前提でご説明します。
対象言語:日本語、英語

導入方法 marumaro7.hatenablog.com

事前準備

アプリ名の多言語化はテキスト変更と同様で
Localization Tablesで登録した内容のキーを割り当てることで実現します。

Localization Tablesの表示方法
→ウインドウ
→アセット管理
→Localization Tables

今回は以下の内容で登録します。
キー:AppName
英語:ABC
日本語:エービーシー


設定方法

Android/iOS共通

Android/iOSいずれも下記のMetadataで設定します。
→編集
→プロジェクト設定
→Localization
→Metadata「+」ボタン

Android アプリ名設定

次の手順でApp infoを表示します。
→Metadata「+」ボタン
Android
→App info


Android App Info」が追加されます。
こちらを左のタブをクリックして展開し、ディスプレイ名にキーを割り当てます。
今回はAppNameのキーを作成しているためこちらを割り当てます。

]

適用後はこちらのようになります。 ]

以上で完了です。

iOSアプリ名設定

次の手順でApp infoを表示します。
→Metadata「+」ボタン
iOS
→App info

次のように複数の設定項目が表示されます。
Androidと同様にディスプレイ名の設定を行うことで設定完了です。

設定後

以上で完了です。

おわりに

iOSの方では、手動で設定しようとするとXcodeで設定が必要でしたが
その操作も自動で設定してくれるためとても便利ですね。

手動の設定内容 marumaro7.hatenablog.com

本を出版しました

marumaro7.hatenablog.com

関連記事

marumaro7.hatenablog.com

【Unity】多言語化パッケージ Localization 導入方法 テキスト変更 テキスト動的変更

環境

Unity 2022.3.10f1 (シリコン)
Localization 1.4.5

はじめに

先日スマホアプリの多言語化対応にあたり、
Unity公式の多言語化パッケージLocalizationを使用しました。

そこで得たつまづきポイント、便利機能の使い方を備忘録としてまとめます。
本記事で扱うのは以下の内容となります。

・導入方法
・テキストの多言語化
・テキストの動的多言語化

導入方法

パッケージインストールと初期設定に分けてご説明します。

パッケージインストール

まずは、パッケージのインストールを行います。
→ウインドウ
→パッケージマネージャー
→「パッケージ:Unityレジストリ」へ変更
→検索窓に「local」と入力
→Localization パッケージが絞り込まれて表示されるためこちらをインストール
※AddressablesパッケージとNewtonsoft Jsonパッケージが併せてインストールされます。

初期設定

初期設定の内容は次の3つです。
・Localization設定ファイルの作成
・対象言語の設定
・デフォルト言語の設定

Localization設定ファイルの作成

Localizationパッケージを使用するためには、
最初に設定ファイルの作成が必要となっています。
→編集
→プロジェクト設定
→Localization
→Create



Createを押すとファイルの保存画面になります。
他にも多言語化関係のファイルが作成されるため
専用のフォルダを作成し、そこに保存すると良いでしょう。
今回は、Assets内に「Localization」というフォルダを作成し保存しました。

対象言語の設定

次に多言語化する言語を設定します。

以下のような画面に変化しますので「Local Generator」を押下します。



対象言語の設定画面が表示されます。
今回は英語と日本語を対象としたいためこれらにチェックを付け、
「Generate Locales」を押します。



作成したファイルを保存するフォルダを選択する画面になりますので
先ほど作成した「Localization」フォルダを指定し保存します。
(追記)「Localization」フォルダの中に
    「SelectedLanguages」というフォルダを作った方が
     フォルダ内が散らからずにすみそうです。

選択した言語が画像のように表示されているはずです。

以下のようなエラーが発生するかもしれませんが無視します。

デフォルト言語の設定

デフォルトの言語を設定します。

「Specific Locale Selector」の「Local id」と
「Project Local Identifier」の項目をデフォルトとしたい言語に設定します。
設定方法は右側のボタンを押し、言語を選択します。

今回は英語をデフォルトとして設定しています。

テキストの多言語化

導入ができましたのでテキストの多言語化を行います。
対象のテキストは、以下のテキストを使用します。
→UI
→古い機能
→テキスト

設定手順

テキスト多言語化における基本の手順としては次の3ステップです。
1.キーとキーに対する各言語内容を設定する
2.テキスト系のコンポーネントが付いたオブジェクトにLocalizeコンポーネントを追加する
3.Localizeコンポーネントに対応するキーを割り当てる


たとえば、"A"というキーに対して
日本語:こんにちは 
英語;Hello
という具合に対となるものを用意します。
そして、テキストに"A"というキーを割り付け、
言語によって対応した内容に変えるという内容です。
言葉ではよくわからないと思いますので実際にやっていきます。

1.キーとキーに対する各言語内容を設定する

まずはキーとその内容の登録画面を開きます。
→ウインドウ
→アセット管理
→Localization Tables



次に、「New Table Collection」タブをクリックし、対応表を新規作成します。
こちらはエクセルでいうところのシートを作成するイメージです。
テキストを管理するシート、オーディオを作成するシート、画像を管理するシート
といった具合に多言語化する対象で分けて作成します。

今回はテキストを管理したいため、
Typeを「String Table Collection」に設定し
「TextTable」という名前で作成します。(名前はお好きな名前で問題ありません。)



Createを押すと保存先を選択する画面になりますので
Localizationフォルダを選択します。
(追記)「Localization」フォルダの中に
    「TableCollections」というフォルダを作り
     さらにその中に「StringTables」というフォルダを作成して
     選択するとフォルダ内が散らからずにすみそうです。


その後、「Edit Table Collection」のタブに表示が切り替わるため
こちらでキーとキーに対する内容を登録していきます。


今回は以下の内容で登録します。
キー:TitleText
英語:AAAAA
日本語:ああああああ


さらにキーと内容を追加したい場合は「Add New Entry」を押すことで追加が可能です。

2.Localizeコンポーネントを追加する

ここからテキストのインスペクター上での作業になります。

以下の手順でLocalizeコンポーネントを追加します。
→多言語化したいテキストを選択
→インスペクター上のテキストコンポーネント右上のボタン(点が縦に3つに並んだアイコン)
をクリック
→「Localize」を選択


すると、以下のように「Localize String Event」コンポーネントが追加されます。

3.Localizeコンポーネントに対応するキーを割り当てる

あとは簡単で「String Reference」へ割り当てたいキーを選択するだけです。

今回は「Title Text」のキーを割り当てます。

選択後、テキストが変更不能となり事前に設定した内容に変化します。

以上が設定手順となります。

確認

実行して確認します。
実行するとゲームビューの右上にボタンが出現し言語を切り替えることが可能です。


日本語に変更すると”あああああ”と表示されます。
以下の内容で設定できていることが確認できました。
キー:TitleText
英語:AAAAA
日本語:ああああああ

実行時以外で言語を切り替える方法

制作中において、実行せずに言語を切り替えたい場合が多くあります。
そのような時は、次のウインドウで切り替えが可能です。
→ウインドウ
→アセット管理
→ Localization Scene Controls


Localization Scene ControlsのActive Localeの言語を変更することで設定変更が可能です。

この切り替えはよく使用するため Localization Scene Controlsの画面をUnityエディター上に固定してしまうのがおすすめです。

タブをドラッグ&ドロップ

Unityエディター上に常時配置

テキストの動的多言語化

文字と数字の組み合わせのテキストですと実行中に値を更新したくなります。
先ほどのテキスト変更に加え手順が増えますが対応可能です。

設定手順

手順としては次の4つのステップです。
1.テーブル内容の登録時にSmartのチェックボックスにチェックを入れる
2.変数を{}で囲み登録する
3.Localizeコンポーネントに変数を登録する
4.スクリプトで更新する

今回は以下の内容で登録していきます。
XXXは変化させる変数です。
キー:Count
英語:Count XXX
日本語:数 XXX

1.テーブル内容の登録時にSmartのチェックボックスにチェックを入れる

Localization Tablesの設定時にSmartのチェクボックスにチェックを入れます。
こちらは慣れてくると忘れがちになるので注意してください。

2.変数を{}で囲み登録する

XXXは動的に変更させる変数にしたいため{}で囲んで以下のように記入します。
英語:Count {XXX}
日本語:数 {XXX}

3.Localizeコンポーネントに変数を登録する

登録ができたら先ほどのテキストのキー設定をCountに変更します。


このままスクリプトを作成しても動作上問題ないのですが
エディター作業中に以下のエラーが発生します。
こちらはコンポーネントに変数の情報を登録することで解除できるため実施しておきます。



String Reference左の矢印をクリックして展開
→Local Variables「+」ボタン
→String


→変数と値の登録画面が可能となるためそれぞれ入力
今回は下記で入力しました。
Variable Name:XXX
String:0(なんでもよいです)

4.スクリプトで更新する

最後にスクリプトの設定です。
内容は変数XXXへ増加していく数を代入するという内容にしています。
詳細はコード内のコメントをご確認ください。

using UnityEngine;
using UnityEngine.Localization;
using UnityEngine.Localization.SmartFormat.PersistentVariables;
using UnityEngine.UI;

public class ChangeText : MonoBehaviour
{
    private int number = 0;
    public Text MainText;

    void Update()
    {
        number++;

        //Localizationの事前に設定したTableからkeyを指定してテキスト内の変数を変更
        //対象のテーブル名:TextTable
        //対象のKey:Count
        //対象のテキスト中の変数:XXX
        LocalizedString textLocalyze = new LocalizedString(tableReference: "TextTable", entryReference: "Count")
        {
            { "XXX", new StringVariable { Value = number.ToString()}},
        };

        //変数更新後の文字列を代入
        MainText.text = textLocalyze.GetLocalizedString();
    }
}


今回は作成したスクリプトをテキストオブジェクトに割り当てます。

確認

実行すると下記で設定していたXXXの部分が動的に変更していることが確認できます。
キー:Count
英語:Count {XXX}
日本語:数 {XXX}

 
※スクショを撮る時間がずれているため数字が異なっています。

変数が更新されないときは

直前の処理が重い処理の場合、値が更新されないことがありました。
そのときは遅延処理で遅らせたところ更新されました。

おわりに

初めてLocalizationに触れる方の参考になれば幸いです。

本を出版しました

marumaro7.hatenablog.com

関連記事

marumaro7.hatenablog.com

marumaro7.hatenablog.com

【Unity】AR Foundation AR Occlusion Manager オクルージョン対応メモ

環境

Unity:2021.3.27f1
AR Foundation:5.1.0

はじめに

現実の物体や人間の存在を検知しAR上の物体を遮蔽する機能であるオクルージョン機能

オクルージョンと一言でいっても種類や実行の条件があったためメモします。

※ARの基本的な設定等は省略します。

オクルージョン設定に必要なコンポーネント

オクルージョン機能を付与するのに必要なのは、
XR Originオブジェクト配下のカメラのオブジェクトに
「AR Occlusion Manager」コンポーネントを追加するだけです。

オクルージョンの種類

オクルージョンは大きく次の2種類
・机や壁などに対するオクルージョン
・人間の手や体に対するオクルージョン

机や壁などに対するオクルージョン

「AR Occlusion Manager」の設定項目でいうところの
Environment Depth Modeが机や壁などに対するオクルージョンの設定

人間の手や体に対するオクルージョン

「AR Occlusion Manager」の設定項目でいうところの
・Human Segmentation Stencil Mode
・Human Segmentation Depth Mode
これらが人間の手や体に対するオクルージョンの設定

Human Segmentation Stencil Modeは、人間の形状に合わせてARオブジェクトを遮蔽する
Human Segmentation Depth Modeは、人間の形状とその深度を検出する

端末側で必要な機能

2種類のオクルージョンに対して必要な端末の機能が異なる。

机や壁などに対するオクルージョン

Android:Depth API
iOS:LiDAR(Light Detection And Ranging)

LiDAR対応端末は以下です。
iPhoneですとiPhone 12 Pro 以降となっており、限定的な印象を受けます。
support.apple.com

人間の手や体に対するオクルージョン

Android:不可(AR Coreが対応していない)
iOS:People Occlusion

People Occlusion対応端末はこちらのサイト様がまとめていただいています。
iPhoneですとiPhone XSから対応ということで対応できるiOSユーザーは多そうです。
www.jyuko49.com

おわりに

オクルージョン対応自体はコンポーネントを追加するだけで簡単ですが、
対応する端末が限定されるため注意が必要なことがわかりました。

ちなみに対応不可端末でそれぞれのオクルージョンをコンポーネント側で有効設定に
しておいても実機でクラッシュするなどは起きませんでした。

ではでは。

私が書いた本

marumaro7.hatenablog.com

【Unity】Xcode 警告 Apple Vision Pro support issue. The app contains the following UIRequiredDeviceCapabilities values, which aren’t supported on Apple Vision Pro. [arkit]

要件

Xcode 14.3.1

現象

ARアプリをXcodeでValidate App または Distribute Appを行うと以下のエラーが発生する。

Apple Vision Pro support issue. The app contains the following UIRequiredDeviceCapabilities values, which aren’t supported on Apple Vision Pro. [arkit]


日本語訳はこちら

Apple Vision Proサポートの問題 このアプリには、Apple Vision Proでサポートされていない以下のUIRequiredDeviceCapabilities値が含まれています。[arkit]

対処法

Apple Vision Proで使用できなくて良いのでApp Store Connect上の下記のチェックを外す。
これで審査が通りました。

→一般
→価格および配信状況
→このアプリをApple Vision Proで配信可能にする

お知らせ

marumaro7.hatenablog.com

【Unity】iOS ATT対応 Unity公式パッケージ 「iOS 14 Advertising Support」を使用して対応する方法

テスト環境

Unity2021.3.27f1
Google Mobile Ads Unity Plugin v8.5.2
iOS 14 Advertising Support 1.0.0
テストOS:iOS16.7

はじめに

これまでATT対応は以下の内容で対応していましたが
Unity公式パッケージ「iOS 14 Advertising Support」を用いることで
簡単に実装できたのでメモしておきます。

marumaro7.hatenablog.com

対応手順

1.インポート

Unityからパッケージマネージャーを開きます。
 ウインドウ→パッケージマネージャー

パッケージマネージャーウインドウからインポート
1.パッケージ:Unity レジストリ
2.検索窓にsupと入力
3.iOS 14 Advertising Support インポート

2.スクリプト作成

ATTPermissionManagerというスクリプトを作成します。(名前は何でも良いです。)

using System.Collections;
using UnityEngine;

#if UNITY_IOS
using Unity.Advertisement.IosSupport;
#endif

public class ATTPermissionManager : MonoBehaviour
{
#if UNITY_IOS
    private IEnumerator Start()
    {
        // 1秒待機(起動直後に表示されない現象への対策)
        yield return new WaitForSeconds(1.0f);

        // 許可ダイアログ表示
        ATTrackingStatusBinding.RequestAuthorizationTracking();
    }
#endif
}

3.空のオブジェクトに割付け

作成した「ATTPermissionManager」のコードを空のオブジェクトに割り付けます。
空のオブジェクトの名前も「ATTPermissionManager」にしました。

4.ビルド

ビルドしてUnity-iPhone.xcodeprojを開いて下さい。

一応ビルド手順
marumaro7.hatenablog.com

5.Xcodeでの設定

Xcodeで以下の設定をします。
1.Info.plistに「Privacy - Tracking Usage Description」を追加
2.「AppTrackingTransparency.framework」を追加

以下の記事の内容となります。

marumaro7.hatenablog.com

動作確認

リクエストウインドウが表示されるはずです。

おわりに

とても簡単に実装でき感動です! Unityさんに感謝!

Unity本を出版しました!

突然ですが、Unity本を出版しました!
こちらを読むことで、スクリプトの基礎固めができます!
現在、kindle unlimitedで読み放題設定中です。今のうちにどうぞ!


もっと早く教えてほしかった!Unity C#入門

アプリ開発 時短講座はこちら

marumaro7.hatenablog.com

参考

docs.unity3d.com