ゲーム開発チーム「丸ダイス」の開発ブログです! 公式サイトはこちら

【ピタゴラスの永久機関】モバイル版をリリースしました!

モバイル版リリースしました!

先月コミケにて頒布した「ピタゴラス永久機関」ですが、先日Android/iOSのモバイル版にリリースしました! 基本無料+買い切り課金 スタイルです。

もともとモバイルでも遊びやすいようにデザインしているので、空いた時間にポチポチ遊ぶのもいいかもですね!

Androidplay.google.com

iOS

ピタゴラスの永久機関

ピタゴラスの永久機関

  • Miu Sakai
  • ゲーム
  • 無料

PC版を買ったひと向け

追加要素なんかは特にないので、PC版を購入済みの方には必要ないと思います!! (ぶっちゃける)

【ピタゴラスの永久機関】DL販売開始しました

DL販売開始しました!

www.dlsite.com

versionは1.03となり、配布したver1.00のバグの修正パッチが適用された状態となります。

また、C92頒布版ではWindows OS 64bitでのみ動作 となっていましたが、DL版は32bit, 64bit どちらのOSでも動作します。

f:id:marudice:20170820003616p:plain:w50

パッケージ版の委託販売について

今後のイベントでの頒布を考えると一応やるつもりではありますが、もう少し後で、数も少なめになるかもしれません・・。

【委託・DL販売の予定】ピタゴラスの永久機関【アンケート付き】

委託・DL販売の予定

C92の会場でもご案内した通りWindows版のDL販売・委託販売を予定しております。

詳細は決まり次第公開していきますが、

とらのあな 様にてパッケージ版委託販売

DLsite 様にてDL版の販売

を検討中です。

増刷部数アンケート

パッケージ版の増刷部数の参考にしたいので、「買えなかった!DL版じゃなくパッケージ版がほしいよ!」という方は、この記事に☆を1つだけ付けて下さると助かります。

8/15追記:☆ってログインしないとつけられないんですね・・・。匿名で付けられないならアンケートの意味も薄れるので、だいたいは自分で考えることにします・・

【パッチ配布】ピタゴラスの永久機関【v1.03へのアップデート】

v1.00 ステージクリア不能バグ修正パッチ

C92の会場にて頒布した「ピタゴラス永久機関」に重めの不具合があることが判明しました。

修正パッチを下記URLにて配布しておりますので、C92にてご購入の方はダウンロード&実行して頂ければと思います

PitagoraPatch_v100-v103.zip - Google ドライブ

※注意! パッチの実行時に適用ディレクトリを必ず選ぶ必要があります!パッチプログラムは説明をよく読んで実行お願いします!

修正の内容は

・ステージ「EX-8」がクリア不可能であったため、同ステージの配置を修正

以上となります。

クリア出来ないステージに時間を溶かしてしまった方、申し訳ありませんでした・・・。

【新作】ピタゴラスの永久機関【C92】

コミケット92で新作出します!

サークル「丸ダイス」としてコミケット92に出展します!スペースは「1日目東し33b」です!

というわけでおしながきです! …1コしかありませんけどね!

ピタゴラス永久機関(新作/完成)1,000円

www.youtube.com

「しかけを使ってナゾを解く "永久機関"のピタゴラパズル」

コソコソと開発を進めていたギミックパズルピタゴラス永久機関の完成版となります!

様々なしかけを使って"永久機関"を作っていくパズルゲーム。

塔を登った先には何が待つのか? 40以上のステージで遊びごたえはたっぷりです!

どうしても解けない時はヒントやスキップがあるので、 パズルが苦手なひとでも安心ですよ!多分!

※動作環境

  • Windows 7/8/10 (C92版は64bit OSのみ。それ以降の頒布では32bit OSに対応する予定です)
  • 解像度 800x600 以上
  • インストールには CD/DVDドライブが必要です

【Unity】NCMB3.0.0 インポート時にiOSビルドのリンカエラー

前回(【Unity】NCMB インポート時のAndroidビルドエラーを読み解く - 丸ダイスの卓上開発日誌Android版でのビルドエラーを解決したら、今度はiOSのCloud Buildでビルドエラーが。

※結局、2.2.0か3.0.0かはエラーと無関係だったので、新しい方を使っています。

原因

ログを見てみると、Unityのビルドは通って、xcodeのビルドの一番最後にこんな出力。

       [xcode] Undefined symbols for architecture armv7:
       [xcode]   "_OBJC_CLASS_$_UNUserNotificationCenter", referenced from:
       [xcode]       objc-class-ref in NCMBAppControllerPushAdditions.o
       [xcode] ld: symbol(s) not found for architecture armv7
       [xcode] clang: error: linker command failed with exit code 1 (use -v to see invocation)

obj-cは書いたことないですが、「NCMBAppControllerPushAdditions.oの中で参照されてる_UNUserNotificationCenterってシンボルがUndefinedやぞコラ!」っつってるんだから、リンカエラーでしょう多分。

まさにNCMBの.oで参照されてるようなので、今起きたエラーと見てよさそうですね。

解決方法

原因は読み解けたので、_UNUserNotificationCenterが含まれてるライブラリがどっかにあるじゃろうと踏んでググったらあっさりヒット。

stackoverflow.com

UserNotifications.framework を追加すればいけるぜって言ってますね。欲しいUndefined symbolsが含まれてそうな名前です。

Macを起動するまでもなくiOS のポストプロセッサにframeworkを追記してcommit。そのままCloud Build復活!

緑のチェックマークが並ぶと気持ちいいですね!

..
    [PostProcessBuildAttribute(0)]
    public static void OnPostprocessBuild(BuildTarget buildTarget, string pathToBuiltProject)
    {
..
        PBXProject proj = new PBXProject();
..
        // Add framework
        proj.AddFrameworkToProject(target, "UserNotifications.framework", false);
..
    }
}

※ポストプロセッサはこのあたりを参考に前から使ってるものです。UnityでXcodeの設定を自動化する方法まとめ - スマゲ

【Unity】NCMB インポート時のAndroidビルドエラーを読み解く

「NCMBのインポートの仕方」という記事ではないです(公式にやり方載ってますし…)。「よく分かんないエラーが出た時に、ググって出たAnswerをそのまま試すより、ログをしっかり読み込んだ方が早く解決出来たよ!」という記事です。

NCMBのインポート

リリースページ(Releases · NIFCLOUD-mbaas/ncmb_unity · GitHub)から、 v2.2.0 を選んでzipを解凍。

中身の.unitypackageをダブルクリック。表示されたインポートダイアログで「Import」をクリック。うんうん。普通ですね。

ここで、「Assets/Plugins/Android」以下に.jar, .aar ファイルがたくさん放り込まれているのが分かります。 「Unity Plugins フォルダ」なんかでググると、どうやらプラットフォームごとのネイティブプラグインを入れるフォルダのようです。つまり、NCMBではコア部分の実装がネイティブプラグインで提供されているわけですね。

Unity Editor 上では何事もなくコンパイルが通ります。

ビルド失敗!

ネイティブプラグインは、実際にそのプラットフォームでビルドするまで動作を検証出来ません。Android版をビルドしてみると、見事にビルドエラー。

Unity上での表示は「Unable to convert classes into dex format. See the Console for details.」Consoleを見ろって言ってますね。どれどれ。

Consoleを見てみる

CommandInvokationFailure: Unable to convert classes into dex format.
...

この後数千行続きます。長っ!とひるむところですが、ここで”ググりません”。少なくともUnityは「ビルドが失敗した理由はコレだよ!」と言っているのですから、付き合ってあげようじゃありませんか。

エラー出力の構造を推測してみる

先ほどのConsoleの出力の最初数行

CommandInvokationFailure: Unable to convert classes into dex format.
C:/Program Files/Java/jdk1.8.0_111\bin\java.exe -Xmx2048M -Dcom.android.sdkmanager.toolsdir="C:/Program Files (x86)/Android/android-sdk\tools" -Dfile.encoding=UTF8 -jar "C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer/Tools\sdktools.jar" -

stderr[
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat;
..

1,2行目を見ると、文章になっている1行目はエラーの概要、2行目はオプション付きの長々としたコマンドのようです。

その後に

stderr[
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat;
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoIcsImpl;
..

と続くところを見ると、「2行目を実行した時に、1行目のエラーが出て、エラーの詳細はstderr の中身の通りだよ」ということのようです。

あれ?じゃあstderrの後は?と見てみると

]
stdout[
processing archive C:\home\(Unityプロジェクトのパス)\Temp\StagingArea\android-libraries\AmazonAppStore\libs\.\classes.jar...
processing com/unity/purchasing/amazon/AmazonPurchasing.class...
processing com/unity/purchasing/amazon/AmazonPurchasing$1.class...
..

とあります。あとは最後まで全部stdoutの中身のようです。processing の後はクラス名のようですから、なるほど、2行目のコマンドでビルドした時の標準出力がstdoutの中に出てるわけですね。 つまりエラー出力の構文は

エラー概要
実行したjavaのビルドコマンド
stderr[ エラー詳細 ]
stdout[ javaのビルドログ ]

ということのようです。

java.lang.IllegalArgumentException: already added を解決しよう

今回のエラーは 「java.lang.IllegalArgumentException: already added」でした。中のクラスはもちろん書いた覚えはないですし、クラス名をProjectビューで検索してもそんな.jarは表示されません。 .jarや.aarの中には複数のクラスがまとまって提供されています。

でも、上のようにエラー出力の構文が分かると、(Unityではなく)javaのビルドした時のビルドログにクラスのビルド順序が記載されています。「already added」 なので、同じクラスを2コ追加しちゃってるのかな?とアタリをつけてログ全体で「android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat」を検索してみると…

processing android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.class

stdout[]の中にこの行が2つありました。フルネームが全く同じクラス名が2つ…なるほど、これではビルドできそうにありませんね…。 どうやら、今回のインポートで同じクラス定義をしている.jar, .aarが2つになってしまったようなので、それを取り除けば良さそうです。

ここで、さきほどの検索結果をもう一度見てみると、

processing archive C:\home\(Unityプロジェクトのパス)\Temp\StagingArea\android-libraries\support-v4-24.0.0\libs\.\classes.jar...
processing android/support/v4/BuildConfig.class...
processing android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.class...
..

ヒットしたクラス定義のすぐ上に、クラス定義ではなく.jarのファイルパスのようなものがあります。stdout[]全体を改めて眺めて見ると

processing archive (ファイルパス.jar)
processing (クラスフルネーム)
processing (クラスフルネーム)
..
processing archive (ファイルパス.jar)
processing (クラスフルネーム)
processing (クラスフルネーム)
..

が何度も繰り返されているようです。

なるほど!つまり(ファイルパス.jar)のアーカイブファイルに定義されているたくさんの(クラスフルネーム)を次々にビルドしているわけですね!

Tempの中に.jarを追加した覚えはないですが、.jarの固有名っぽい 「support-v4-24.0.0」には覚えがあります。UnityのProjectビューで検索してみると、見事ヒット! もう一つの方も、「processing (クラスフルネーム)」の上をたどって、含まれているarchiveは「android-support-v4.jar」だと分かりました。

NCMB.unitypackageをもう一度実行してみると、どうやらandroid-support-v4.jar は今回NCMBのインポート時に追加されたファイルのようです。

とりあえず新しい方のandroid-support-v4.jarを消してビルドしてみると、見事成功!※正確には、別の似たエラーが出たのでそちらも同じように解決しています。

めでたしめでたし。

ログ読みのススメ

こうやってログの中身をしっかり追ってみると、実はエラーの理由は人の目で追える形でしっかりと書かれていることが分かりました。

「よく分からんエラー」に遭遇した時は、エラー文を検索窓に突っ込んで、「こうしたら直りました」を実行するだけで直ることもあります。

でも、問題が起きた時に答えだけを求めるやり方より、一から仕組みを理解するようにした方が、似たケースが起きた時にすぐに対処出来て自分のプロジェクトをより自在に扱えるようになるのかなぁと、今更ながらに思った次第でした。

実際、※の別エラーは本当にあっという間に解決出来ました。

ログを読みましょう!Qiitaには嘘を書けますが、ログは嘘を付きません!