そういうのがいいブログ

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

アプリ開発覚え書き

【Unity】admobバージョンを上げた際のエラー Multiple precompiled assemblies with the same name Google.VersionHandler.dll included or the current platform. Only one assembly with the same name is allowed per platform.

Unityバージョン2019.3.15f1から2020.3.18f1へ上げ admobバージョンv5.4.0からv6.1.2へ上げた際のエラー

Assets>ExternalDependencyManager>Editor>Google.VersionHandlerのファイルを消したら消えました。

【Unity】PlayFab ログイン機能の実装

はじめに

UnityでのPlayFab使用におけるログイン方法です。

前回記事での問題

marumaro7.hatenablog.com

こちらの記事でログインを実装しましたが、
ログインに使用する文字列は"GettingStartedGuide"の固定されたものとなっています。
(PlayFabのアカウント情報の下の方を見ると、PlayFabIDと紐づいている文字列が表示されます)
B96E4C057BE19AC2_»_概要_·_PlayFab.png

そのため、誰がログインしても同じPlayFabアカウントとなってしまうので、
端末ごとにログインに使う文字列を変えてやる必要があります。

端末ごとにログインIDを変更

そこで、端末ごとにログインできるようにしたのが下記のコードになります。
(kanさんのブログ(文末の参考を参照)内容を私でも直感的にわかるように書き換えました。)

using System;
using PlayFab;
using PlayFab.ClientModels;
using UnityEngine;

/// <summary>
/// PlayFabのログイン処理を行うクラス
/// </summary>
public class PlayFabLogin : MonoBehaviour
{    
    private bool _shouldCreateAccount;//アカウントを作成するか    
    private string _customID;//ログイン時に使うID

    //=================================================================================
    //ログイン処理
    //=================================================================================
    public void Start()
    {
        Login();        
    }



    //ログイン実行
    private void Login()
    {
        _customID = LoadCustomID();
        var request = new LoginWithCustomIDRequest { CustomId = _customID, CreateAccount = _shouldCreateAccount };//補足 既にアカウントが作成されており、CreateAccountがtrueになっていてもエラーにはならない
        PlayFabClientAPI.LoginWithCustomID(request, OnLoginSuccess, OnLoginFailure);
    }

    //ログイン成功
    private void OnLoginSuccess(LoginResult result)
    {
        //アカウントを作成しようとしたのに、IDが既に使われていて、出来なかった場合
        if (_shouldCreateAccount == true && result.NewlyCreated == false)
        {
            Debug.LogWarning("CustomId :" +_customID+ "は既に使われています。");
            Login();//ログインしなおし
            return;
        }

        //アカウント新規作成できたらIDを保存
        if (result.NewlyCreated == true)
        {
            SaveCustomID();
            Debug.Log("新規作成成功");
        }

        Debug.Log("ログイン成功!!");
    }

    //ログイン失敗
    private void OnLoginFailure(PlayFabError error)
    {
        Debug.LogError("PlayFabのログインに失敗\n" + error.GenerateErrorReport());
    }




    //=================================================================================
    //カスタムIDの取得
    //=================================================================================

    //IDを保存する時のKEY
    private static readonly string CUSTOM_ID_SAVE_KEY = "CUSTOM_ID_SAVE_KEY";

    //IDを取得
    private string LoadCustomID()
    {
        //IDをセーブデータから取得
        string id = PlayerPrefs.GetString(CUSTOM_ID_SAVE_KEY);

        //idの中身がnullもしくは空の文字列("")の場合は_shouldCreateAccountはtrueになる。
        _shouldCreateAccount = string.IsNullOrEmpty(id);

        //idの中身がない場合、文字列を新規作成
        if (_shouldCreateAccount==true)
        {
            return GenerateCustomID();//文字列を新規作成
        }
        else
        {
            return id;//セーブされた文字列を返す
        }
    }

    //IDの保存
    private void SaveCustomID()
    {
        PlayerPrefs.SetString(CUSTOM_ID_SAVE_KEY, _customID);
    }




    //=================================================================================
    //カスタムIDの生成
    //=================================================================================

    //IDを生成する
    //ユニークな文字列をGuidを使用し生成
    //https://docs.microsoft.com/ja-jp/dotnet/api/system.guid.tostring?redirectedfrom=MSDN&view=netframework-4.8#System_Guid_ToString_System_String_
    private string GenerateCustomID()
    {
        //Guidの構造体生成
        Guid guid = Guid.NewGuid();
               
        return guid.ToString("N");//書式指定子はNを指定 詳細は「Guid.ToString メソッド」のドキュメント参照
    }

}



処理の流れとしては、こちらになります。

1.初ログイン時にIDを生成(32桁のランダムな英数字)
2.既にそのIDが使われている場合は新たにIDを生成(使われていないIDを見つけるまで)
3.ログインが成功したらIDをPlayerPrefsに保存
4.2回目以降はPlayerPrefsに保存されたIDでログイン

詳細な内容はコメントを見ていただければ把握できると思います。

ログインに使用する文字列はPlayerPrefsで保存しているので、
Androidはアプリをアンインストールしてもデータを消さない限り大丈夫ですが、
iOSの方はアプリをアンインストールすると文字列のセーブデータが消えてしまいます。

その点を理解した上で実装をお願いします。

参考

kan-kikuchi.hatenablog.com

kan-kikuchi.hatenablog.com

【Unity】PlayFab テスト通信

はじめに

UnityでのPlayFab使用におけるUnity側での初期設定方法です。

前回までの記事でPlayFabを使う準備ができたら
試しにPlayFabと通信してログインができるか試してみます。

前回の記事1 marumaro7.hatenablog.com

前回の記事2 marumaro7.hatenablog.com

オブジェクト作成

スクリプトを入れるオブジェクトを作ります。
「空のゲームオブジェクト」を作成し、「PlayFabLogin」と名前をつけておきます。

UdemyTestScene_-_UdemyKakinTest_-_iOS_-_Unity_2020_3_18f1_Personal__Personal___Metal_.png

スクリプト作成

Assets直下にScripsフォルダを作成
→作成したフォルダ内でスクリプトを新規作成
スクリプトの名前を「PlayFabLogin」としてスクリプトを作成します。
(名前はなんでも良いのですが、テスト用のコードと同じにしておきます。)

PlayFabTest_-_PushTest_-_PC__Mac___Linux_Standalone_-_Unity_2020_3_2f1_Personal__Personal___Metal_.png

コードは、PlayFabの公式ページにテスト用のコードがあるので、
こちらを少しわかりやすくしたものを使用します。
元コードはリンク先の「最初の API 呼び出しを実行する」の部分です。

docs.microsoft.com

ちなみに「API」とは、「Application Programming Interface」の頭文字です。
ひらたくいうと、PlayFabで用意している便利関数のことです。
PlayFabのAPIを呼び出して処理をしていきます。

下記のコードを、作成したスクリプトに貼り付けます。

using PlayFab;//追加
using PlayFab.ClientModels;//追加
using UnityEngine;

public class PlayFabLogin : MonoBehaviour
{
    public void Start()
    {
        //リクエスト生成
        var request = new LoginWithCustomIDRequest { CustomId = "GettingStartedGuide", CreateAccount = true };

        //ログイン処理実行
        PlayFabClientAPI.LoginWithCustomID(request, OnLoginSuccess, OnLoginFailure);
    }

    //ログイン成功時に呼び出される関数
    private void OnLoginSuccess(LoginResult result)
    {
        Debug.Log("ログイン成功!!");
    }

    //ログイン失敗時に呼び出される関数
    private void OnLoginFailure(PlayFabError error)
    {        
        Debug.LogError("ログインに失敗しました。");
        Debug.LogError(error.GenerateErrorReport());//エラー内容
    }
}

   

オブジェクトへ割り当て

ひとまず、コード内容はおいておいて、スクリプトをセーブし、
「PlayFabManager」に割り当てて、実行してみます。


実行後、無事ログインが成功しました! PlayFabTest_-_PushTest_-_PC__Mac___Linux_Standalone_-_Unity_2020_3_2f1_Personal__Personal___Metal_.png

   

ここでPlayFab側のダッシュボードを見てみると、ユーザーの数が増えていることがわかります。
(変化がない場合は2分程度待ってください。)
※「金額」と書いてありますが、「数」の間違い(原文は「amount」)なので
  ユーザー数と思ってください。

ダッシュボード_·_PlayFab.png


ユーザーIDは
プレイヤー>検索
で確認することができます。

プレイヤー_·_PlayFab.png

ちなみに「前回のログイン」に表示される日時は
協定世界時 (UTC)となっているので、
表示されるのは日本時間から9時間引いたものとなります。

 

これでPlayFabと通信ができました!

次回

実運用上このままのコードでは問題があるので、
次回は問題点を考慮したログイン機能を実装していきます。

marumaro7.hatenablog.com

【Unity】PlayFab 初期設定 <Unity側>

はじめに

UnityでのPlayFab使用におけるUnity側での初期設定方法です。

前回の記事
marumaro7.hatenablog.com

Unityバージョン

Unity2020.3.18f1

エディター拡張機能をダウンロード

Unity側でPlayFabを扱えるようにしていきます。
下記サイトより「エディター拡張機能」をダウンロード

https://docs.microsoft.com/ja-jp/gaming/playfab/sdks/unity3d/

「クイック ダウンロード リンク: PlayFab SDK 用の Unity エディター拡張機能
 をクリックしてダウンロード
Unity3D__C___SDK_-_PlayFab___Microsoft_Docs.png

プロジェクトにエディター拡張をインポート

実装したいプロジェクトを開いて、先ほどのエディター拡張をインポートします。
すると、PlayFabのウインドウが現れます。

SampleScene_-_PushTest_-_PC__Mac___Linux_Standalone_-_Unity_2020_3_2f1_Personal__Personal___Metal__と_ダンスドリーム_MV_改善案.png

PlayFab SDKインポート

今表示されているのは、アカウントを作る画面なので、
何も入力せずに「LOG IN」ボタンを押します。
SampleScene_-_PushTest_-_PC__Mac___Linux_Standalone_-_Unity_2020_3_2f1_Personal__Personal___Metal_.png



ログイン画面が表示されるので、
PlayFabに登録したアドレスとパスワードを入力し、ログインします。 SampleScene_-_PushTest_-_PC__Mac___Linux_Standalone_-_Unity_2020_3_2f1_Personal__Personal___Metal_.png


PlayFabのSDKがないよ〜と言われるのでインストールボタンを押します。 SampleScene_-_PushTest_-_PC__Mac___Linux_Standalone_-_Unity_2020_3_2f1_Personal__Personal___Metal_.png


数十秒待ってインストール完了画面が出たら終了です。



<追記>
2022年7月現在 
Unityバージョン:2021.3.3f1
PlayFab SDKバージョン:2.113.210830
では下記のようなエラーが出ます。
PlayFab公式によると無視してOKだそうです。
そのうち改善されると思います。

<エラー文>
A Native Collection has not been disposed, resulting in a memory leak. Enable Full StackTraces to get more details.

SDKセッティング

PlayFab側と通信できるように前もって作っておいたタイトルを指定します。
SETTINGSをクリック
1.STUDIO
2.TITLE ID
を選択

「【Unity】PlayFab_初期設定_<Unity側>」を編集_-_Qiita.png

以上でUnity側の初期設定は完了です。 簡単ですね!!

<追記>
REQUEST TYPE は 「Unity Web Request」に設定して下さい。

情報元

community.playfab.com

次回

次回はいよいよ通信を行います。

marumaro7.hatenablog.com




(備忘録)SDKエラー対応

SDKバージョン2.110ではバグがありますので修正が必要でした。
PlayFabEditorDataService.csの22行目を変更。

public bool CompressApiData = false;

情報元

https://community.playfab.com/questions/54002/30062021-playfab-edex-cannot-login-caught-an-error.html?redirectedFrom=54117

【Unity】PlayFab 初期設定 <PlayFab側>

はじめに

UnityでのPlayFabを使用におけるPlayFab側での初期設定方法です。

PlayFabアカウント登録

下記ページで「PlayFabを無料で試す」からアカウント登録

https://azure.microsoft.com/ja-jp/services/playfab/

PlayFab___Microsoft_Azure.png

メールアドレスやパスワードを入力
Notification_Center.png

アカウントを作成すると認証メールが届くので、認証してログインしてください。


PlayFab画面 日本語化

PlayFabの言語を日本語に設定します。(お好みです。)

→PlayFab画面の右上のアイコン
→マイプロフィール
→言語
→日本語を選択

自分のスタジオとタイトル_·_PlayFab.png

マイ_プロフィール_·_PlayFab.png



タイトルの作成

タイトルを作成します。
タイトルとは、アプリとPlayFabを紐づけるための箱のようなものです。
右側の「・・・」ボタンから新しいタイトルを選択します。

自分のスタジオとタイトル_·_PlayFab.png



タイトルの名前を決めます。
ジャンルやら色々項目がありますが、タイトルの名前以外は設定しなくても影響がないので、
名前だけ入れて「タイトルを作成」を押します。

タイトルの作成_·_PlayFab.png

作成すると自動的にタイトルの設定画面に遷移します。
まずはここまででPlayFab側の設定は完了です。
ダッシュボード_·_PlayFab.png

次回

次回はUnity側での設定を行います。

【Unity】PlayFab 初期設定 <Unity側> marumaro7.hatenablog.com

【AdMob】app-ads.txt ファイル設置方法 エックスサーバー

app-ads.txt

はじめに

app-ads.txt ファイル設定の備忘録です。
自分のアプリ紹介サイトに設置する方法になります。

環境は、エックスサーバーとワードプレスです。

注意!!
ネットでapp-ads.txtで検索するとads.txtの記事がたくさん出てきますが
app-ads.txtとads.txtは別物なので注意してください!
エックスサーバーではads.txtを簡単に設定するメニューがあるのですが。
そこにapp-ads.txtを登録しても、ads.txtとして登録されてしまうのでうまくいきません。

app-ads.txtとは

app-ads.txtについてはこちらで概要を掴みました。 magazine.fluct.jp

方法

基本的に公式の手順に沿って進めました。

support.google.com

1.サイトを開設

無料でできる方法もあるかもしれませんが、
広告のない自分のサイトがほしかったこともあり、
エックスサーバー(Xserver )と契約しました。
ワードプレスの知識は一切ありませんでしたが、
契約の際、ボタン一つでワードプレスと連携して
同時に申し込みできるのでとても楽でした。

その後のアプリ紹介サイトの作成の方で
ワードプレスの使い方から学ばないといけなかったので
それに一番時間を使っています。

こんなページを作りました。 maruapps.com

2.アプリストア掲載情報にサイトのURLを追加

公式ページのこの部分に沿って登録しました。

3.設置する文字列をメモ帳などに仮置き

公式ページに沿って、設置する文字列を取得し、
メモ帳などにメモしていきます。
この情報はエックスサーバーでの設定で使用します。

3.1情報をコピー

公式に沿って進めていき、表示された文字をコピーします。
(6.コピーするコード スニペットの横にある コピー をクリックします。)の部分


3.2コピーした情報をメモ帳等に貼り付け

コピーした文字を貼り付けます。
今回はmac標準のテキストエディットを使用しました。

<追記>
pub-○○ のパブリッシャーIDの部分が自動でコピーされないようになっていました。

パブリッシャーIDの確認方法
AdMobのホーム画面
→設定
→アカウント情報
→パブリッシャーID
で確認することができます。
数字の部分は16桁になります。


3.3AdMobテスト広告用の情報を追記

app-ads.txtを設置するとテスト広告が出なくなるようなので、
下記のページの注意書きに沿ってこちらの情報も追記します。

(iOSのページを載せていますが、Androidのページでも同じことが書いてありました。)

developers.google.com


改行して追記します。
この文字列はあとから使うので、メモ帳は開いたままにしておきます。


4.エックスサーバーに 情報を登録

4.1エックスサーバーにログイン

エックスサーバーにログインします。

www.xserver.ne.jp

4.2 空のapp-ads.txtファイルを作成

ファイル管理を押します。


ご自身のドメインをダブルクリックして開いてください。


さらに、「public_html」をダブルクリックします。


ここにファイルを作成するので「新規ファイル」を押します。


「新規ファイル」を押すとこのような画面になるので
ファイル名:app-ads.txt
ファイル名の文字コード:UTF-8
に設定してファイルを作成します。


これで空のapp-ads.txtファイルを作ることができました。



4.3app-ads.txtの中身を設定

app-ads.txtの中身はまだ空っぽなので、
app-ads.txtを選択し、「編集」を押して中身を設定していきます。


編集を押してファイルを開いたら、
先ほど仮置きしたコードを貼り付け、
保存文字コードを「UTF-8」に設定し、更新を押します。

4.4app-ads.txtファイルを確認

ご自分のドメインの後ろに/app-ads.txtを付けたURLを検索し、
設定したテキストが表示されるかを確認します。
例:http://●●.com/app-ads.txt

5.AdMobがサイトを見つけてくれるまで待つ

公式の通り、サイトを見つけてもらえるまで待ちます。

AdMobの
>app-ads.txt画面
>アプリ一覧 右側の上矢印
>アップデートを確認
を押してみるとすぐ検索してくれるかもしれません。

6.ステータス確認

app-ads.txt一覧の画面でアプリのステータスが有効になっていることを確認して終了です。

<追記>7.UnityのダッシュボードでApp-ads.txtを追加する

Unityのダッシュボード上でApp-ads.txtを設定したのでメモ

→Monetization
→Organization Settings
→Developer Websiteで対象のホームページを登録
→追加するApp-ads.txtの文字列をコピー




→「4.エックスサーバーに 情報を登録」で行なったapp-ads.txtの編集画面を開く
→コピーした文字列を追加して更新保存文字コードUTF-8へ設定するのをお忘れなく)

→Unityのダッシュボードのページを更新してこのような
「Your app-ads.txt file is up-to-date. No action needed at this time.」
 の緑チェックマークが出ていればOKです。

おわりに

わかれば簡単なんですが、
最初はapp-ads.txtとads.txtの情報の区別がつかず、
かなり回り道をしてしまいました。

あなたの時短になれば幸いです。

Unity本を出版しました!

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


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

参考

eureka45.net

affimama.com

【Unity】iOSアプリ申請 サブスク(定額課金)却下理由 メモ

はじめに

サブスク実装時の課金審査 却下理由のメモです。

原文

Guideline 3.1.1 - Business - Payments - In-App Purchase

We have begun the review of your in-app purchases but aren't able to continue because your submitted in-app purchases indicate a change of business model for your app.

Specifically, your existing Consumable and Non-Consumable business model has changed to include a auto-renewable subscription in-app purchase business model type.

Therefore, we need to verify the implementation of your submitted in-app purchases in the app to ensure your app, and its in-app purchases, are in compliance with the App Store Review Guidelines.

Next Steps

In order to approve your your new in-app purchase business model, we have to verify the purchasability of the items being sold. Please upload a new binary and make sure that your new in-app purchase products are available for purchase at the time of review.

ガイドライン3.1.1 - ビジネス - 支払い - アプリ内課金

アプリ内課金の審査を開始しましたが、提出されたアプリ内課金がアプリのビジネスモデルの変更を示しているため、審査を継続することができません。

具体的には、既存の消費型および非消費型のビジネスモデルが、自動更新可能なサブスクリプションのアプリ内課金のビジネスモデルタイプに変更されています。

そのため、お客様のアプリとそのアプリ内課金がApp Store Review Guidelinesに準拠していることを確認するために、お客様が提出したアプリ内課金の実装を確認する必要があります。

次のステップ

お客様の新しいアプリ内課金のビジネスモデルを承認するためには、販売されるアイテムの購入可能性を検証する必要があります。新しいバイナリをアップロードして、審査時に新しいアプリ内課金商品が購入可能であることを確認してください。

----------------------------------
う〜ん
私の頭では理解ができません。。。

印がついているところ

とりあえずここに赤印が付いていました。

ローカライズ設定のところに
標準の言語に設定している「英語」がなかったのが原因と推測

1箇所目 f:id:marumaro7:20210902044913p:plain

2箇所目 f:id:marumaro7:20210902045012p:plain



修正後

1箇所目 f:id:marumaro7:20210902050653p:plain

2箇所目
タイトルや説明文を変更しても赤い印が消えなかったため
一旦 言語の項目を消してから再設定しました。
(例:日本語の項目消す→+ボタン→日本語の項目追加)

説明文を少し改良しました。

f:id:marumaro7:20210902052431p:plain

2回目の審査落ち 原文

審査落ちしました。

Guideline 3.1.2 - Business - Payments - Subscriptions

We noticed that your app did not meet all the terms and conditions for auto-renewing subscriptions, as specified in Schedule 2, section 3.8(b) of the Paid Applications agreement.

We were unable to find the following required information in your app's binary:

–Title of publication or service -Length of subscription (time period and content or services provided during each subscription period) - Price of subscription, and price per unit if appropriate – A functional link to the Terms of Use (EULA) – A functional link to the privacy policy

We were unable to find the following required item(s) in your app's metadata:

– A functional link to the Terms of Use (EULA) – A functional link to the privacy policy

Next Steps

To resolve this issue, please add this missing information. If the above information is present, please reply to this message in Resolution Center to provide details on where to locate it.

If you are using the standard Apple Terms of Use (EULA), you will need to include a link to the Terms of Use in your App Description. If you are using a custom EULA, add it in App Store Connect.

Resources

  • Learn more about offering auto-renewable subscriptions on the App Store.
  • Review the Paid Applications agreement (App Store Connect login required).

Guideline 2.1 - Performance - App Completeness

We have returned your in-app purchase products to you as the required binary was not submitted. When you are ready to submit the binary, please resubmit the in-app purchase products with the binary.

Next Steps

Learn more about offering in-app purchases in App Store Connect Help.

ガイドライン3.1.2-ビジネス-支払い-サブスクリプション

有料アプリケーション契約のスケジュール2、セクション3.8(b)で指定されているように、アプリが自動更新サブスクリプションのすべての利用規約を満たしていないことに気付きました。

アプリのバイナリで次の必要な情報を見つけることができませんでした。

–出版物またはサービスのタイトル -サブスクリプションの期間(期間および各サブスクリプション期間中に提供されるコンテンツまたはサービス) -サブスクリプションの価格、および必要に応じてユニットあたりの価格 –利用規約EULA)への機能リンク –プライバシーポリシーへの機能的なリンク

アプリのメタデータで次の必須アイテムが見つかりませんでした。

利用規約EULA)への機能リンク –プライバシーポリシーへの機能的なリンク

次のステップ

この問題を解決するには、この不足している情報を追加してください。上記の情報が存在する場合は、解決センターでこのメッセージに返信して、その場所の詳細を提供してください。

標準のApple利用規約EULA)を使用している場合は、アプリの説明に利用規約へのリンクを含める必要があります。カスタムEULAを使用している場合は、App StoreConnectに追加します。

資力

-AppStoreで自動更新可能なサブスクリプションを提供する方法の詳細をご覧ください。 -有料アプリケーション契約を確認します(App Store Connectのログインが必要です)。

ガイドライン2.1-パフォーマンス-アプリの完全性

必要なバイナリが送信されなかったため、アプリ内購入製品を返品しました。バイナリを送信する準備ができたら、バイナリを使用してアプリ内購入商品を再送信してください。

次のステップ

アプリ内購入の提供について詳しくは、App StoreConnectヘルプをご覧ください。

Legal - Licensed Application End User License Agreement - Apple

https://help.apple.com/app-store-connect/#/dev7fa2fff96

Auto-renewable Subscriptions - App Store - Apple Developer

Agreements, Tax, and Banking

https://help.apple.com/app-store-connect/#/devb57be10e7