Unity2018 4.5 androidビルド時に「IndexOutOfRangeException: Index was outside the bounds of the array. UnityEditor.Android.AndroidBuildWindowExtension.GetBuildPlayerWindow () 」

Androidビルドすると下記エラーになった。

IndexOutOfRangeException: Index was outside the bounds of the array.
UnityEditor.Android.AndroidBuildWindowExtension.GetBuildPlayerWindow () (at <62f761e6ab1445a38cdcb4ac36512695>:0)
UnityEditor.Android.AndroidBuildWindowExtension.RepaintTargetList () (at <62f761e6ab1445a38cdcb4ac36512695>:0)
UnityEditor.EditorApplication.Internal_CallUpdateFunctions () (at /Users/builduser/buildslave/unity/build/Editor/Mono/EditorApplication.cs:200)

古いapkファイルを出力するレガシーモードになっていたらしい。

PlayerSettingを開いて「use legacy SDK tools」のチェックが入っていたので、チャックをはずすとうまくいった。

色々ぐぐったけど情報なく、
IndexOutOfRangeException〜 となっており、
エラー内容から想定できない対応だったのでメモ。

Unityビルドでandroid64bit対応&aab対応&playgames対応&facebooksdk対応&admob対応した自分用メモ

無数のUnityバージョンや、各種sdkを入れたきたノウハウの結集。

結論!下記組み合わせで入れれば、AndroidStudioを通さずUnity上ビルドだけですべて対応できます。

  • Unity2017 4.301f
  • gradleビルド(Custom Gradle Templateは利用しないで可)
  • lp2cppビルドにする。チェックするのは、 ARMv7 , ARM64のみ。 x86 はチェック外す。(x86はチェックするとGooglePlayに申請できない)
  • Proguardは無効
  • AndroidはminSdkVersionはOS4.4以上〜でTargetversionはauto
  • GooglePlayGames はこちらから、バージョンは「0.9.64」

> マイナーバージョン違いでいろんなところで躓いたので注意

  • Admob は「Google Mobile Ads Unity Plugin v3.18.3」を入れた。
  • FacebookSDKは、バージョン「7.17.2」 これも注意。

注意点

  • 事前に、GooglePlayConsoleや、Facebook、admobの登録は必要です。
  • lp2cppビルドはとても時間かかるので注意
  • x86はチェックを外さないと、64bit対応したのにまたビルドし直す必要がある
  • PlayServiceResolverや、各種sdkは、関連ファイルを削除してから入れ直すなどしないと基本沼にハマる。
  • aabファイルは、アプリ署名を忘れずに、
  • あと公開前のテストで、adbコマンドや、GoogleplayConsoleからのダウンロードでもインストールできないので、「内部アプリの共有」の機能つかって共有すればインストール可能。

Androidアプリのよくあるイカしたアプリのダウンロードボタンの作成方法! と、流入元分析!

クレカの有効期限切れで、、サーバー落ちてましたw。。

SEOだいぶ下がったか、、泣

というわけで、泣く子も黙るわけでもない久々の更新

アプリDLボタンのバッジ作成ツール

ここからバッジをサクッと生成できるんす!

https://play.google.com/intl/ja/badges/

UTMソース や、UTMキャンペーン を指定して、

どのブログや、SNSから流入してDLしたなどがわかるようになってます。

レポートは、Google Play Consoleの下記画面から見れるようです。

UTMタグで獲得チャネルの分析

https://developers.google.com/analytics/devguides/collection/android/v4/campaigns#google-play-url-builder

GooglePlay向けのUTMタグ生成サイトが、404になっていて、
どこで、android用のUTMタグの正しい形式を確認すればとおもっていましたが、バッジ作成ツールで生成すればよかったんですね。
先程の、バッジツールで、UTMソースや、キャンペーンを指定するとタグが反映されるので、
そちらでわかります。


<a href='https://play.google.com/store/apps/details?id=[パッケージ名]&utm_source=[UTMソース]&utm_campaign=[UTMキャンペーン]&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Google Play で手に入れよう' src='https://play.google.com/intl/ja/badges/images/generic/ja_badge_web_generic.png'/></a>

この部分。


https://play.google.com/store/apps/details?id=[パッケージ名]&utm_source=[UTMソース]&utm_campaign=[UTMキャンペーン]

他にも便利なツールが色々

こちらはiOS/Androidのバッジも作れるすぐれもの!

http://mama-hack.com/app-reach/

関係ありそうなサイト一覧

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 で、Android gradle buildで、Multidexに対応する方法

UnityでAndroidアプリを作る際に、Multidexサポートに対応しないといけない場合に、
最初した際のメモ。

参考情報

https://forum.unity.com/threads/build-using-gradle-and-multidex-support.492117/

https://answers.unity.com/questions/1301593/android-gradle-build-error.html

要点

  • Custom Gradle Templateを使う (Build systemはgrandleに)

検証環境

  • MacOS High Sierra
  • Unity2017 2.0f3(Personal)

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」を入力すると、英語、日本語が表示されます。

cocos2d-x(c++) で、int(整数)をstring(文字列)に変換

cocos2d-x(c++) で、intをstring(文字列)に変換

環境 cocos2d-x 3.14(c++)

StringUtils::toString()で、int型からstring型に変換できる。

int hogeInt = 123;
string hogeStr = StringUtils::toString(hogeInt);

で、下記でもできるのですが、androidでビルドするとエラーになるので、
下記を使う場合はご注意を。


string hogeStr = std::to_string(123);

cocos2d-x(c++) 色(Color3B等)を定数の配列でカラースキーム化

cocos2d-xで、色のパターン等用意する時、
配列で定数化しておくと便利なのでメモ

宣言


// Color3Bの型で3色用意 static const std::vector<Color3B> COLOR_LIST = { Color3B(255,0,0), //赤 Color3B(0,255,0), //緑 Color3B(0,0,255) // 青 };

呼び出し


COLOR_LIST.at(0); // 赤 COLOR_LIST.at(1); // 緑 COLOR_LIST.at(2); // 青

もちろん、Color4Bでも同じ要領

ちなみに赤を出したいだけなら、、、


Color3B::RED

とするだけなので、この記事はそういう趣旨じゃない。。。

cocos2d-x(c++)ひっかかりそうなポイントメモ

ただ生成したNodeのgetContentSize()は0。


node->getContentSize().width // 0

座標は、左下が基準

OpenGLだからか、左下が基準。

oya->addChild(ko)をすると色々挙動が難しい

子は親のアンカーポイントを無視する。

getBoundingBoxの座標が連動していなかったり。

androidでビルドする時、std::to_string()を使うビルドできない。

下記で代用


int newInt = StringUtils::toString(hogeInt);

Vec2でキャストせずにintとしてつかっているといつの間にかずれるのでちゃんとキャストしよう


Vec2 vec2Hoge = hogeMethod(touchLocation); log("vec2HogeFloat x:%f y:%f",vec2Hoge.x,vec2Hoge.y); log("vec2HogeInt x:%i y:%i",vec2Hoge.x,vec2Hoge.y);