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.0Cocos 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をターゲットにしている、みたいな状態です。
このバージョン数を合わせればエラーがなくなりました。