cocos2d-xで過去に作ったゲームがあるのですが、iOSのmetalに対応するためにv4へアップデートする必要があったのでメモ。
cocos2d-x v4系について
cocos2d-xのv4からついにiOSのmetalに対応したのですが、プロジェクトの構成もちょっと変更があったようです。
いままではプロジェクトを作成するとiOS用の proj.ios_mac
があってその中にxcodeprojファイルがあり、そいつがcocosのエンジンである cocos2d_libs.xcodeproj
を参照しているような形でした。
ですが、v4系からCMakeを使う形になったので、xcodeprojファイルは自分で作成する形になったようです。
v3系とv4系では構成がこんなかんじで違います。
v3 -> v4の移行の方法について(iOS)
v3系からv4系への移行については 公式のガイド があります。
基本的にこれに沿って行えばよいのですが、この方法だと cocos2d_libs.xcodeproj
はunzipしたcocos2d-xのフォルダ内に作られて、複数のcocos2d-xのプロジェクトで共通のエンジンを参照する形になっちゃう気がしたのでやり方を少し変えました。
流れとしては
- まずv4でプロジェクトを作成する
- 作成したプロジェクトのcocosディレクトリを、更新対象のプロジェクトにまるっとコピーする
- 更新対象のプロジェクトで
cocos2d_libs.xcodeproj
を生成 - ビルドが通るように設定を修正する
というかんじです。
以下そのメモです。
バージョンメモ
- 元のバージョンはcocos2d-x v3.17.2
- Xcodeのバージョンは11.4 (11E146)
v4のプロジェクトを作成する
まずは公式サイトからcocos2d-xのv4系をダウンロードし、cocosコマンドの設定等をします。(おそらくsetup.pyでできたはず)
その後、cocosコマンドを使ってv4のプロジェクトを作成します。
1 2 3 4 | $ cocos - v # cocosコマンドのバージョン確認 cocos2d-x-4.0 Cocos Console 2.3 $ cocos new CocosV4Engine -d ./ -l cpp -p com.example.cocosgame |
cocosエンジンをコピーする
このプロジェクトのcocos2dディレクトリと CMakeLists.txt
ファイルを更新対象のプロジェクトにコピーします。
ただ、このままでは cocos2d_libs.xcodeproj
がないので作成する必要があります。
cocos2d_libs.xcodeproj を作成する
まずは cocos2d_libs.xcodeproj
を特定の場所に生成できるようにするために 更新対象のプロジェクトの cocos2d/cocos/CMakeLists.txt
を編集します。
公式のガイド に載っている通りの方法となりますが、以下のスクショの赤で囲った部分の2箇所を追記します。
1 2 3 4 5 6 7 8 9 10 11 | # 1つ目 cmake_minimum_required(VERSION 3.15) # 2つ目 if (NOT DEFINED BUILD_ENGINE_DONE) set (COCOS2DX_ROOT_PATH ${CMAKE_CURRENT_LIST_DIR}/..) set (CMAKE_MODULE_PATH ${COCOS2DX_ROOT_PATH} /cmake/Modules/ ) include(CocosBuildSet) endif() |
次に、更新対象のプロジェクトのcocos2dディレクトリ以下に ios-build
ディレクトリを作成し、そこに以下のコマンドで cocos2d_libs.xcodeproj
を生成します。
1 2 3 | $ mkdir cocos2d /ios-build # ios-buildディレクトリ作成 $ cd cocos2d /cocos # cocosディレクトリに移動 $ cmake -B .. /ios-build -GXcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos # cocos2d_libs.xcodeproj生成 |
cocos2d_libsをv4のものに入れ替える
この状態で proj.ios_mac
以下のxcodeprojファイルを開くと、 cocos2d_libs.xcodeproj
がmissing状態になっているはずです。
missing状態の cocos2d_libs.xcodeproj
を削除し、先程作成した cocos2d/ios-build/cocos2d_libs.xcodeproj
をドラッグアンドドロップしてXcodeプロジェクトに追加します。
Build Settingを修正していく
最後にBuild Settingを更新していくのですが、 公式のガイド に載っている方法で大体いけますが一部注意事項があるのでメモ。
まずはPROJECTのほうの Build Settings
の Search Paths
-> User Header Search Paths
に以下を追加します。
サウンドの再生に SimpleAudioEngine
を使う場合、 $(SRCROOT)/../cocos2d/cocos/editor-support/cocostudio
も追加する必要がありました。
Search Pathの追加
1 2 | $(SRCROOT)/.. /cocos2d/cocos $(SRCROOT)/.. /cocos2d/cocos/editor-support/cocostudio # SimpleAudioEngineを使うのに必要 |
そしてTARGETSのiOS用のターゲットの Build Settings
の Search Paths
-> User Header Search Paths
に以下を追加します。
1 | $(inherited) |
Other Linker Flagsの追加
次に、 Build Settings
の Linking
-> Other Linker Flags
に以下を追加します。
公式では libglfw3.a
も追加していますが、iOSでは必要ありません。 external/glfw3/prebuilt/ios/libglfw3.a
というファイル自体無いはずです。
ちなみに以下のパスを一つずつ+ボタンをクリックして追加するのは大変なので、改行含めてまるっとコピーし、1行に全部ペーストしてやると勝手に1行ずつ展開してくれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | $(SRCROOT)/.. /cocos2d/external/Box2D/prebuilt/ios/libbox2d .a $(SRCROOT)/.. /cocos2d/external/jpeg/prebuilt/ios/libjpeg .a $(SRCROOT)/.. /cocos2d/external/freetype2/prebuilt/ios/libfreetype .a $(SRCROOT)/.. /cocos2d/external/webp/prebuilt/ios/libwebp .a $(SRCROOT)/.. /cocos2d/external/bullet/prebuilt/ios/libLinearMath .a $(SRCROOT)/.. /cocos2d/external/bullet/prebuilt/ios/libBulletDynamics .a $(SRCROOT)/.. /cocos2d/external/bullet/prebuilt/ios/libBulletCollision .a $(SRCROOT)/.. /cocos2d/external/bullet/prebuilt/ios/libLinearMath .a $(SRCROOT)/.. /cocos2d/external/bullet/prebuilt/ios/libBulletMultiThreaded .a $(SRCROOT)/.. /cocos2d/external/bullet/prebuilt/ios/libMiniCL .a $(SRCROOT)/.. /cocos2d/external/websockets/prebuilt/ios/libwebsockets .a $(SRCROOT)/.. /cocos2d/external/uv/prebuilt/ios/libuv_a .a $(SRCROOT)/.. /cocos2d/external/openssl/prebuilt/ios/libssl .a $(SRCROOT)/.. /cocos2d/external/glsl-optimizer/prebuilt/ios/libmesa .a $(SRCROOT)/.. /cocos2d/external/glsl-optimizer/prebuilt/ios/libglsl_optimizer .a $(SRCROOT)/.. /cocos2d/external/glsl-optimizer/prebuilt/ios/libglcpp-library .a $(SRCROOT)/.. /cocos2d/external/png/prebuilt/ios/libpng .a $(SRCROOT)/.. /cocos2d/external/curl/prebuilt/ios/libcurl .a $(SRCROOT)/.. /cocos2d/external/openssl/prebuilt/ios/libcrypto .a $(SRCROOT)/.. /cocos2d/external/chipmunk/prebuilt/ios/libchipmunk .a |
Build Phasesの修正
そして、 Build Phases
の Dependencies
に cocos2d
を追加し、 Link Binary With Libraries
に Metal.framework
と cocos_libs
以下にある*.a
の拡張子のファイルを追加します。
この状態でビルドすればちゃんと通るはずです。
お疲れさまでした。
Androidについて
Android Studioでちゃんとv4が動くのかはまだ確認できていないので、試してみてまたブログ書こうと思います。
Undefined symbols for..のエラーがでる
ビルドすると Undefined symbols for architecture armv7:
とかのエラーが100個くらいでてしまったことがあったのですが、原因は cocos2d_libs
のBuild Settingで iOS Deployment Target
のバージョンが元のプロジェクトのバージョンと一致していなかったことのようでした。
cocos2d_libsはiOS13.4をターゲットにしているのに元プロジェクトはiOS11をターゲットにしている、みたいな状態です。
このバージョン数を合わせればエラーがなくなりました。