今回は割とうっかりミスな気もしますが、とりあえず備忘録として残しておくことにしました。
(内容でPlayBillingLibraryって単語が出てきちゃってますが、根本的には関係ないですっ)
(PlayBillingLibraryって単語で記事にきちゃった人、ごめんなさい...)
問題の概要
そもそも何をしようとしていたか
- Android用にPlayBillingLibrary3.0以上を実装しようとしていた。
(2021年11月までに対応しないとアプリのアップデートができないので)
問題の発生
1 : PlayBillingLibrary3.2.0のunitypackageをインストール (ここからDLした)
2 : 手順に従い競合の解決
3 : 特にエラーも出なかったのでApkのビルドを開始
結果下記のエラーが発生
Assets/GooglePlayPlugins/com.google.play.billing/Runtime/Scripts/Internal/GooglePlayBillingUtil.cs(27,44): error CS0117: 'Debug' does not contain a definition for 'unityLogger'
訳 : 「Debug ってクラスに unityLogger なんてものはないぞ」と。
問題の詳細
ビルド時に、下記の部分でエラーが発生。
// クラスパス : Assets/GooglePlayPlugins/com.google/play.billing/Runtime/Scripts/Internal/GooglePlayBillingUtil.cs
/*前略*/
using UnityEngine;
public class GooglePlayBillingUtil : MonoBehaviour
{
private const string GooglePlayBillingLoggingTag = "Google Play Store: ";
private readonly ILogger _logger = Debug.unityLogger; // <- こいつがエラー
private static readonly List<Action> _callbacks = new List<Action>();
private static volatile bool _callbacksPending;
/*後略*/
}
ただ、ビルド前だとエラーは出ていないし、unityLogger
にカーソルを当てるときちんと定義にジャンプすることが可能だった。
問題の解決
原因
自前クラスにネームスペースを切ってないDebugクラスがあり、しかも#if !UNITY_EDITOR
でクラス全体を覆っていたためでした。
ビルドするときだけ、Debugクラスが認識されるようになっており
結果「Debug.unityLogger」が指すDebugクラスがどれかわかなくなってしまってたようです。
対応内容
Debug.unityLogger
に UnityEngine
をつけてあげたところ、ビルドが通るようになった。
// クラスパス : Assets/GooglePlayPlugins/com.google/play.billing/Runtime/Scripts/Internal/GooglePlayBillingUtil.cs
/*前略*/
using UnityEngine;
public class GooglePlayBillingUtil : MonoBehaviour
{
private const string GooglePlayBillingLoggingTag = "Google Play Store: ";
//private readonly ILogger _logger = Debug.unityLogger; // <- こいつがエラー
private readonly ILogger _logger = UnityEngine.Debug.unityLogger; // <- これでエラー回避できた
private static readonly List<Action> _callbacks = new List<Action>();
private static volatile bool _callbacksPending;
/*後略*/
}
本当は自前クラスにnamespaceをつけるなりするべきなのでしょうが、如何せん手間がかかっちゃうので今回はこのような対応で済ませることに。
最後に
今回は自前クラスが悪さをしていたわけですが、場合によっては外部ライブラリが似たような悪さをしないとも限らないので
もしビルド時だけ「error CS0117」と怒られる箇所があった場合は、namespaceを指定して回避すると良いかもしれません。