0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

定義が存在するのにビルド時に「error CS0117」と怒られる

Last updated at Posted at 2021-09-09

今回は割とうっかりミスな気もしますが、とりあえず備忘録として残しておくことにしました。
(内容で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 なんてものはないぞ」と。

問題の詳細

ビルド時に、下記の部分でエラーが発生。

GooglePlayBillingUtil.cs
// クラスパス : 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.unityLoggerUnityEngineをつけてあげたところ、ビルドが通るようになった。

GooglePlayBillingUtil.cs
// クラスパス : 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を指定して回避すると良いかもしれません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?