GodotプロジェクトのiOSアプリ出力で、リソースをpckファイルにまとめるかフォルダ参照するかで挙動が変わる話

GodotではiOS用のエクスポートテンプレートを追加すると、ExportメニューからXcodeプロジェクトを書き出してiOSでアプリを動かすことができる。書き出し作業自体は手軽なのだが、毎回数十秒程度処理に時間がかかることやXcode側での設定(アプリ名のローカライズなど)がリセットされてしまうので、コードやリソースを変更するたびにExportを実行するのはなかなか面倒だ。

そこで、公式ドキュメントの「Active Development Considerations」の項では、XcodeプロジェクトからGodotのプロジェクトをフォルダ参照することで、変更のたびに毎回Exportし直さなくても常に最新の内容でiOSアプリをビルド・実行可能にする方法が説明されている。(※プラグインの追加時など、Xcodeプロジェクトの構造変更が必要な時はプロジェクトの出力し直しが必要になる)これは実に便利で、特にアプリ内課金の機能などiOSのネイティブ機能を使う部分の開発・デバッグには不可欠な手順になっている。

ただし、上の公式ドキュメントには特に記載がないがプロジェクトを毎回Exportした場合と、一度ExportしたXcodeプロジェクトからGodotフォルダ参照する場合ではResourceに関する挙動が異なるので注意する必要がある。

GodotからXcodeプロジェクトをExportすると、プロジェクト内で使用される画像やSceneなどのResourceを一つにまとめたリソースパック(pckファイル)が生成される。このpckファイルには、GodotでResourceとして扱われるファイルのみが含まれている。例えば2022年9月現在Godot 3.5ではJSONファイルはResourceファイルとしては扱われないため、プロジェクトフォルダ内に存在したとしてもpckファイルには含まれない。(2022年9月4日のissues #65295でJSONをResourceとして扱うための変更が提案されMergeされたため、将来はJSONもpckファイルに含まれるようになる予定)

一方でフォルダ参照をしている場合は、Godotのプロジェクトディレクトリ内にある全てのファイルをres://プロトコルのURLで参照することができる。Godotでは本来Resourceとして扱われないJSONファイル等もフォルダ参照の場合は参照することができてしまう。そのようなコードを書いてしまうと、フォルダ参照時は動作するのにpckファイル読み込み時は動作しない、という現象を引き起こしてしまうことになる。

一見全て参照できる分、基本的にはフォルダ参照にしておいた方が便利そうな気もするが、そうとも言えない。AppStoreへのサブミット時にリジェクト要因になってしまうファイルがバイナリに組み込まれてしまう場合があるためだ。例えばアプリ内課金を利用する場合、公式ドキュメントのやり方に従うとプロジェクトのres://ios/pluginsにiOSプラグインのファイルを配置することになるが、このプラグインのファイルをフォルダ参照で含めたままAppStoreにサブミットしようとするとInvalid Bundle Structureエラーが発生してしまう。Xcodeのビルド設定で特定のファイルを明示的に除外することでエラーを回避することも可能かもしれないが、開発をしているとプラグイン追加のタイミングなどXcodeプロジェクト自体を出力し直す機会が時々発生し、その度にこの辺りの細かい設定するのはできれば避けたい。

おそらく、現実的に無難な選択肢はpckファイルのみを更新するやり方だろう。Godotには、pckファイルのみをExportする機能が用意されている。

ワンステップ挟むことになるのでフォルダ参照に比べると多少不便ではあるが、この方法なら「フォルダ参照で想定外に動いてしまった」というような実装も防げるので、他プラットフォームへの展開なども考えると最も無難なのではないかと思う。

SpriteKitを使って一攫千金を狙うチュートリアル

iOS 7でSpriteKitという新しいゲーム作成用のフレームワークがでました。早速コレを使ってゲームを作って一攫千金を狙いたいと思います。
勢いだけで書いてしまったので、大分雑な感じになっていますが悪しからず。細かい部分はそのうち直していきます。。編集社って偉大。 “SpriteKitを使って一攫千金を狙うチュートリアル” の続きを読む

Unityプロジェクトをコマンドラインからビルドするためのgemを作った

UnityアプリケーションをJenkinsでビルドする際、いちいちスクリプトを記述するのが面倒で、管理の面でも不便なので諸々を自動化するgemを作りました。 “Unityプロジェクトをコマンドラインからビルドするためのgemを作った” の続きを読む

Jenkinsを使ったiOSアプリビルド自動化10 ビルドとテストの基礎まとめ

Jenkinsを使ったiOSアプリ開発へのCI導入のうち、標準的な構成のアプリのビルドの自動化、テストの自動化についての説明が完了したので、一度ここでまとめておきます。 “Jenkinsを使ったiOSアプリビルド自動化10 ビルドとテストの基礎まとめ” の続きを読む

cocos2d v2.0-rc2がリリース

cocos2d v2.0-rc2 released | cocos2d for iPhone
iOS / OS X用の2Dゲームエンジン、cocos2dの2.0のrc2.0がリリースされました。

If no showstoppers are found, v2.0-rc2 will be renamed v2.0.

ということで、問題がなければこのバージョンが正式版に2.0となる可能性があるようです。
バグ修正以外の大きな変更点としては、JSCocoaに対応したようです(ただしOS X版のみ)。将来的にはcocos2d-iphone, cocos2d-x, cocos2d-html5でも同じJavaScriptで制御できるようにすることを目指しているようです。
なお、

Native ARC support

はWhat’s next (mid term)にリストされており、ARC正式サポートは少し先になりそうです。

OpenGL Gameテンプレートを読みやすくする

OpenGL GameテンプレートにはGLKitの機能を使って描画を行うコードと、従来のシェーダーを使って描画を行うコードが混在しています。このままでは読みにくいので、GLKitを使った描画以外の部分のコードを消して、読みやすくして見ましょう。大分前に書いたつもりでいたのですが、どうも英語版のブログの方に記事を書いたまま、こっちには書いていなかったので転記しておきます。 “OpenGL Gameテンプレートを読みやすくする” の続きを読む

Jenkinsを使ったiOSアプリビルド自動化9 トリガとセキュリティ

流れ的に説明を省略してしまった箇所がいくつかあるので、ここでまとめて触れておきます。 “Jenkinsを使ったiOSアプリビルド自動化9 トリガとセキュリティ” の続きを読む

Jenkinsを使ったiOSアプリビルド自動化7 ビルドとテストの基礎

Jenkinsを使ってビルドを自動化することができました。この後、ビルドしたアプリをTestFlight経由でいつでも簡単にインストールできるようにしていきたいのですが、手順の都合から先にテストの自動化について確認しておきましょう。 “Jenkinsを使ったiOSアプリビルド自動化7 ビルドとテストの基礎” の続きを読む

Jenkinsを使ったiOSアプリビルド自動化6 メールでの通知

Jenkinsを使ってiOSアプリのビルドを自動化することによって可能になることは沢山あります。第一段階として、レポジトリのコードが「正しくビルドできる状態にある」ことを目指して設定を行っていきましょう。 “Jenkinsを使ったiOSアプリビルド自動化6 メールでの通知” の続きを読む