Google Playで課金実装していないのに、「アプリ内課金あり」と表示されてしまう

Google Play アプリ内課金あり

実装環境

  • Unity2021.3.14f1
  • Firebase10.3.0
  • AdMob7.20

上記のように課金機能を実装していないのに、「アプリ内課金あり」と表示されてしまいました。
※しかもなぜか、PCのブラウザでGooglePlayを見ると「アプリ内課金あり」は表示されませんでした。

FirebaseやAdMobを入れた際になんらかの原因で課金ありと認識されてしまった可能性がないか調べたところ、Unity Package Managerから、In App Purchasingを削除したところ、無事GooglePlayから「アプリ内課金あり」は消えていました。

AndroidManifest.xmlの下記パーミッションを削除すれば解消されるケースもあるようですが、自分の場合はもともとBILLINGパーミッションの記載はなかったのでこちらの方法にいきつきました。

<uses-permission android:name="com.android.vending.BILLING" />

参考になれば嬉しいです。

Unity NGUIのUI Labelのフォント名をスクリプトで取得

Unity NGUIラベルで指定のフォントを使っているものだけ抽出するのに、
必要なので調べてみた。

UILabel label = targetObject.GetComponent<UILabel>();

// Debug.Log("label.trueTypeFont.fontNames:" + label.trueTypeFont.fontNames.ToString());

Debug.Log("label.trueTypeFont.fontNames:" + label.trueTypeFont.name.ToString()); //これでフォント名取得できる!

label.trueTypeFont.fontNamesでは取得できないので注意

Unity NGUIのローカライズをスクリプトからKey指定で変更可能に

上記のようにNGUIUI Localizeで用意してあるローカライズ文言をスクリプトから、切り替える方法。

targetLabelGameObject.GetComponent<UILocalize>().key = "GOOD";

対象のUI Labelと同じgameobjectにUI Localizeコンポーネントがアタッチされていれば、これでOK!

ただし、UILabelのテキストが即時変わらない事があるので、
その場合は、一度下記のように非アクティブ→アクティブにすると反映される。

targetLabelGameObject.GetComponent<UILocalize>().key = "GOOD";
targetLabelGameObject.SetActive(false);
targetLabelGameObject.SetActive(true);

NGUIのUiButtonで、タップ時とタップを離した時のイベント取得メモ(ロングタップ等の判定に)

タップイベントを取得したいスクリプトに下記を追記し、

サンプルコード


public void OnPress(bool isDown)
{
Debug.Log("onPress: " + UIEventTrigger.current.name);

if (UIEventTrigger.current.name.Equals("Btn_Boost"))
{
jetBtnFlg = true;
}

}

public void OnRelease()
{

Debug.Log("onRelease:" + UIEventTrigger.current.name);

if (UIEventTrigger.current.name.Equals("Btn_Boost"))
{
jetBtnFlg = false;
}

}

あとは、NGUIのUiButtonに、「UI Event trigger」をアタッチし、

下記キャプチャを参考に、Notifyに「OnPress」と「OnRelease」を伝達したい、
上記コードのGameObjectをセットし、OnPressとOnReleaseメソッドを選択してあげるだけ!

NGUI UI Event Trigger

NGUIのUiButtonで、タップ時とタップを離した時のイベント取得メモ(ロングタップ等の判定に)

タップイベントを取得したいスクリプトに下記を追記し、

サンプルコード


public void OnPress(bool isDown) { Debug.Log("onPress: " + UIEventTrigger.current.name); if (UIEventTrigger.current.name.Equals("Btn_Boost")) { jetBtnFlg = true; } } public void OnRelease() { Debug.Log("onRelease:" + UIEventTrigger.current.name); if (UIEventTrigger.current.name.Equals("Btn_Boost")) { jetBtnFlg = false; } }

あとは、NGUIのUiButtonに、「UI Event trigger」をアタッチし、

下記キャプチャを参考に、Notifyに「OnPress」と「OnRelease」を伝達したい、
上記コードのGameObjectをセットし、OnPressとOnReleaseメソッドを選択してあげるだけ!

よく忘れてしまうのでメモ!

あと、「Event Trigger」と 「UI Event Trigger」というのがあり、NGUIのものはUI Event Triggerになるので注意!

Asset StoreのDetonator 〜というのをUnity2017にいれた際の対処

無料でめちゃくちゃクオリティの高い爆発できる「Detonaor〜」というassetを使っているのですが、

これ → Detonator Explosion Framework

Unity5以降を使っているとShader周りなどでエラーがでるのでメモ。


Shader error in 'HeatDistort': 'tex2Dproj': no matching 2 parameter intrinsic function; Possible intrinsic functions are: tex2Dproj(sampler2D, float4|half4|min10float4|min16float4) at line 42 (on gles3) Compiling Vertex program Platform defines: UNITY_NO_DXT5nm UNITY_NO_RGBM UNITY_ENABLE_REFLECTION_BUFFERS UNITY_FRAMEBUFFER_FETCH_AVAILABLE UNITY_NO_CUBEMAP_ARRAY UNITY_NO_SCREENSPACE_SHADOWS UNITY_PBS_USE_BRDF3 UNITY_NO_FULL_STANDARD_SHADER SHADER_API_MOBILE UNITY_HARDWARE_TIER1 UNITY_COLORSPACE_GAMMA UNITY_LIGHTMAP_DLDR_ENCODING

Asset自体Unity4までしか対応していないのもあり、
僕は、HeatDistort一旦シェーダー無効にして対応しました。

このasset昔からあるけど、マジ最強!

Unityで、実機だけデバッグログを表示しない設定

アプリを長期間かけて作っていると色々デバッグログを仕掛けたくなるもの、
これがどんどん増えていくと、リリースする前に一気に非表示にしたいもの。

で、スマホはデバッグログを表示しないで、Unity上で作っている際は一括で非表示する方法

Unity2017〜?用


void Awake(){ #if UNITY_EDITOR // Unity上で、デバッグログ出力 Debug.unityLogger.logEnabled = true; #else // それ以外(実機)はデバッグログを出力しない Debug.unityLogger.logEnabled = false; #endif }

Unity5系?用


void Awake(){ #if UNITY_EDITOR // Unity上で、デバッグログ出力 Debug.logger.logEnabled = true; #else // 実機はデバッグログを出力しない Debug.logger.logEnabled = false; #endif }

無効にするタイミングは一番最初にするように調整してね。

Unity ゲームなどで使う赤から青など徐々に色を変える計算

Unityで、指定色から指定色に切り替わる処理を書くが、毎回忘れてしまうので、メモ!

下記のように、赤から、緑など。通常の黒から白や、透過度を徐々に変えるのは簡単だが、
RGBをいじって、青から、赤などの色変化の計算はちょっと手間なので忘れてしまう。

指定の色から、指定の色に徐々に色が変わるサンプルスクリプト



// Color(0.17254901960784f ,0.074509803921569f ,0.062745098039216f); // スタートカ ラー // Color(0.97647058823529f ,0.83921568627451f ,0.31764705882353f); // ゴールカラー // グラデーションのポジションを管理する値 0f〜1f float currentPointColor = (float)gameCheckPoint / (float)goalCheckPoint; float r = (0.97f - 0.17f) * currentPointColor + 0.17f; // 指定の色から指定色へグラデーション。 float g = (0.89f - 0.07f) * currentPointColor + 0.07f; // 指定の色から指定色へグラデーション。 float b = (0.31f - 0.06f) * currentPointColor + 0.06f; // 指定の色から指定色へグラデーション。 scaffoldObj.transform.Find("background").GetComponent<SpriteRenderer>().color = new Color(r,g,b);

ポイント


float r = (0.97f - 0.17f) * currentPointColor + 0.17f;

R = (Rのゴール値 – Rのスタート値) * グラデーションのポイントを管理 + Rのスタート値 という意味

※RはRGBの赤

また、RGBの#ffffffなどのHEX値から、上記Coloe型の0f,0f,0fのフォーマットに変換する場合は、下記ツールを使うと簡単に変換できます。

#ff0000 → 1f,0f,0f 変換ツール

UnityAndroidで、下記エラーがSDKやなにかを入れたタイミングでエラーを履くようになった。

確認環境
* Unity2017 2.0f1
* Gradleビルド

こんなエラーや、


Build failure com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexException: Multiple dex files define Landroid/support/annotation/AnimRes; See the Console for details.

こんなエラーや、


UnityEditor.BuildPlayerWindow+BuildMethodException: 3 errors at UnityEditor.BuildPlayerWindow+DefaultBuildMethods.BuildPlayer (BuildPlayerOptions options) [0x00207] in /Users/builduser/buildslave/unity/build/Editor/Mono/BuildPlayerWindowBuildMethods.cs:172 at UnityEditor.BuildPlayerWindow.CallBuildMethods (Boolean askForBuildLocation, BuildOptions defaultBuildOptions) [0x00050] in /Users/builduser/buildslave/unity/build/Editor/Mono/BuildPlayerWindowBuildMethods.cs:83 UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

こんなエラーや、


CommandInvokationFailure: Gradle build failed. /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/bin/java -classpath "/Applications/Unity/PlaybackEngines/AndroidPlayer/Tools/gradle/lib/gradle-launcher-2.14.jar" org.gradle.launcher.GradleMain "assembleRelease" stderr[ FAILURE: Build failed with an exception.

なにか原因かわからないため、解決するためにやったこと。

  • Player Settings の Publishing Setting > Custom Gradle Templateにチェックをいれ、
    カスタムのgradleをいじれる、mainTemplateをさわって、また戻したり。

  • Unityを再起動したり

  • Android SDKのToolsのAPIバージョンをあげたり。
    https://answers.unity.com/questions/1435579/how-can-i-fix-this-error-unityeditorbuildplayerwin.html

  • https://issuetracker.unity3d.com/issues/android-project-with-iap-plugin-fails-to-build-with-gradle-release-mode-only-and-throws-java-dot-io-dot-ioexception

Unityのバージョンを疑ったり

で、何かのタイミングで、エラーがでなくなり、無事APKファイルが履かれました…!

Unity NGUIで、ローカライズの設定手順

NGUIで、とりあえず英語と日本語を管理する方法

STEP.1 asset storeからインポートしたNGUIのLocalization.txtをリネームして、移動

これを、

Assets/NGUI/Examples/Resources/Localization.txt → Localization.csv

リネームして、

Assets/Resources/Localization.csv に移動。
※Resourcesフォルダが無い場合は、作ってね。

これをしないと、NGUIアセットをアップデートする度、ローカライズ文言がリセットされてしまいます (´;ω;`)

STEP.2 ローカライズの文言を作る

Assets/Resources/Localization.csv

をテキストエディタ等で開いて、英語,日本語のように記載していきます。

Localization.csvの中身


KEY,English,Japanese Flag,Flag-US,Flag-JA Language,English,Japanese NGUI_STAGE_1_NAME,Hamburger,ハンバーガー NGUI_STAGE_2_NAME,Sandwich,サンドイッチ

※カンマ区切りで、KEY,英語,日本語と記載しています。

STEP.3 Unityを再起動する。

これしないと、なぜか反映されなかったです。
※ビルドしても反映される事もあったり。

STEP.4 UI LabelにLocalizeをアタッチ

※先ほどLocalization.csvにKEYとして記載した、「NGUI_STAGE_1_NAME」を入力すると、英語、日本語が表示されます。