Unity IAPUnity Analytics UnityGameServiceIAPだけ使いたい


概要

IAPのいつのverからか、UGS(UnityGameService)InitializeしてからIAPを初期化しないとwarningが出るようになった。

んでこれがまたいつのverからか、UGSを初期化してからIAPを初期化しないと、なんとExceptionが出るようになった。

ServicesInitializationException: The Analytics service has not been initialized. Please initialize Unity Services.

Unity.Services.Analytics.AnalyticsService.get_Instance () (at Library/PackageCache/com.unity.services.analytics@4.3.0/Runtime/AnalyticsService.cs:19)

UnityEngine.Purchasing.UnityPurchasing.GenerateUnityAnalytics (UnityEngine.ILogger logger) (at Library/PackageCache/com.unity.purchasing@4.5.2/Runtime/Purchasing/UnityPurchasing.cs:34)

UnityEngine.Purchasing.UnityPurchasing.Initialize (UnityEngine.Purchasing.IStoreListener listener, UnityEngine.Purchasing.ConfigurationBuilder builder) (at Library/PackageCache/com.unity.purchasing@4.5.2/Runtime/Purchasing/UnityPurchasing.cs:24)


で、これと戦って勝った話。



結論

DISABLE_RUNTIME_IAP_ANALYTICS を使おう。以上。



経緯

AutoyaをUnity2021.3の最新に追随させないとなーとなっていた。

これ 

https://github.com/sassembla/Autoya


で、Unity2021.3.19にしたところで、テストがこける。課金関連のテストだけがコケる。


なんで? ってなって見てみると、

ServicesInitializationException: The Analytics service has not been initialized. Please initialize Unity Services.

の文字が。


あれ、以前はwarningじゃなかったっけ?って思ってみると、フォーラムにはこうあった。

Question IAP requires UGS to be initialized?

https://forum.unity.com/threads/iap-requires-ugs-to-be-initialized.1321560/

JeffDというアカウントがUnity IAPのフォーラムの大体どこにでも出てくるUnityのIAPのすごい方で、

「warn出るんですけど」

「気にしないでくれ、やらないでも動くから」


ということだったのだが、どうも去年の8月くらいからUnity Analyticsの挙動が変わり、


IAPからAnalyticsを呼ぼうとする

UnityGameServiceに含まれるAnalytics側の初期化コードでnullなのに呼ばれると上記のエラーを吐く

となったっぽい。で、つまりこの時点で、主観的にはこうなる。


1. Unity IAPのアプデをしたら、

2. IAPの起動時に、「先にUGSを起動してね」というエラーが出るようになる

3. UGSってIAP使う時にも必須なんですね、、、


フォーラムみててもな~~なんか使って当たり前!みたいに書いてあるんだよな~。



で~~~こっからがいろいろあって。


UGSが使えるとこんなに便利!ってのもあると思うんだけど、いらん場合は要らんわけだ。


いろいろ理由があるが、、、



1. 初期化コードがまさかの生Taskを返してくる

これが結構びっくりした。

https://docs.unity.com/ugs-overview/en/manual/services-core-api#InitializationExample

using System;

using Unity.Services.Core;

using Unity.Services.Core.Environments;

using UnityEngine;

 

public class InitializeUGS : MonoBehaviour {

    

    public string environment = "production";

 

    async void Start() {

        try {

            var options = new InitializationOptions()

                .SetEnvironmentName(environment);

 

            await UnityServices.InitializeAsync(options);

        }

        catch (Exception exception) {

            // An error occurred during initialization.

        }

    }

}


この時点でかなりUGSをやる気が削がれてくる。


UnityServices.InitializeAsync関数はTaskを返してくる。

いや、Task<void>みたいなのが嫌って言ってるんじゃなくて、Taskが嫌、って言ってるの。


何が悲しゅうてこんな実行時エラーバリバリ起こしそうな物体の処理をわざわざTaskで、

しかもresultも適当な定義しかされてないものでやらにゃいかんの、、、


(状態としてInitialized, Uninitialized, Initializingがあります! うーん、、)


しかも面白いのが、、いや面白くないけどさあ。

この関数、UnityのMainThread以外でぶっ放すと、mainThreadでパナしてね!ってエラーを吐く。


つまり「マジでこの書き方しかできない」。 ええ、、、MB一個ささげてやることがこれ?


例えばRuntimeInitializeOnLoadでFrameworkとしてpurchase周りの管理もやってるAutoyaみたいなやつは辛い。

MB持ってないから。あるけど、このためにStartとかを潰したいかっていうとさあ。


いや~~コーナーケースだと思う。うん。でもさー。


これ実行するためにMBやらMainThreadDispatcherを使えってことでしょー、嫌だよ。



2. 必要ない

根本的にはこれ。


IAPを制御可能な課金機構のためのライブラリとして使えればそれでよくて、Analyticsは要らんし、Unityの提供してくれているダッシュボードで何かを見たいと思わない場合。

Adsが関わってくるとGDPRとかが出てくるわけですけども、それすら関係ない、Adsを使わない場合。


IAPだけを起動できると嬉しい。ログとかは自前のサーバでやるので、はい、、みたいなケース。



3. テストできない

UnityEditorでのあらゆるテストに対して、これエラー吐いてくる、、


いろいろ試してたんだけど、手を加えようにもIAPもUGSもPackageの中身なので、いやーー触りたくねえ。


というわけでIAPのコードを読んでいたら、

https://github.com/needle-mirror/com.unity.purchasing/blob/3f872364c823b765a711f7b79007bd6b66dcf51d/Runtime/Purchasing/UnityPurchasing.cs#L32


あるね~~。面白そうなsymbolが。


        private static IAnalyticsAdapter GenerateUnityAnalytics(ILogger logger)

        {

#if DISABLE_RUNTIME_IAP_ANALYTICS

            return new EmptyAnalyticsAdapter();

#else

            try

            {

                return new AnalyticsAdapter(AnalyticsService.Instance, logger);

            }

            catch (ServicesInitializationException)

            {

                return new EmptyAnalyticsAdapter();

            }

#endif

        }


というわけでDISABLEを発見したので、つけたところ、Analyticsが要求されなくなるため、UGSがないと~的なエラーも起きなくなる。


実機テストとかこれからやるけど、一応。ちなみにググって見たけど

スクリーンショット 2023-02-25 15.24.01.png


無いな~~


githubも検索して見たけど、UnityPurchasingLibraryフォルダごとアップしてるのが引っかかるのみだった。

面白いっすね。



やったか!?

そもそもIAPだけ使いたい、それにまつわる情報は全て自社のサーバとかで扱いたい、というrequirementに対して、IAPがどんな拘束力を持つんだろう、というのはあって、

今回DISABLEをみっけたので使って見ているわけですけども、


もしそれはダメだよ~ってなった場合はIAPの代わりを探せばいいだけなので、それはそれ。


Unityからしたら、せっかく作ったIAPをもとに自社のゲームエンジンを使ってるユーザーの云々は見たいだろうし。 そのためにこの手段が適格か?というのは思うが。


ま、選択肢がいっぱい選べるといいすね。


怒られたら消えます。