Date: 2020/4/6 Cate: cocos2d-x Tags:  

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系では構成がこんなかんじで違います。
cocos-v3-v4-difference

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のプロジェクトを作成します。

$ cocos -v # cocosコマンドのバージョン確認
cocos2d-x-4.0
Cocos Console 2.3
$ cocos new CocosV4Engine -d ./ -l cpp -p com.example.cocosgame

cocos2dx-v4-directory

cocosエンジンをコピーする

このプロジェクトのcocos2dディレクトリと CMakeLists.txt ファイルを更新対象のプロジェクトにコピーします。

v4-engine-copy

ただ、このままでは cocos2d_libs.xcodeproj がないので作成する必要があります。

cocos2d_libs.xcodeproj を作成する

まずは cocos2d_libs.xcodeproj を特定の場所に生成できるようにするために 更新対象のプロジェクトの cocos2d/cocos/CMakeLists.txt を編集します。
公式のガイド に載っている通りの方法となりますが、以下のスクショの赤で囲った部分の2箇所を追記します。

CMakefile.txt

# 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 を生成します。

$ 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生成

generate_cocos2d_libs

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 SettingsSearch Paths -> User Header Search Paths に以下を追加します。
サウンドの再生に SimpleAudioEngine を使う場合、 $(SRCROOT)/../cocos2d/cocos/editor-support/cocostudio も追加する必要がありました。

Search Pathの追加

$(SRCROOT)/../cocos2d/cocos
$(SRCROOT)/../cocos2d/cocos/editor-support/cocostudio # SimpleAudioEngineを使うのに必要

UserSearchPath

そしてTARGETSのiOS用のターゲットの Build SettingsSearch Paths -> User Header Search Paths に以下を追加します。

$(inherited)

UserSearchPathInherited

Other Linker Flagsの追加

次に、 Build SettingsLinking -> Other Linker Flags に以下を追加します。
公式では libglfw3.a も追加していますが、iOSでは必要ありません。 external/glfw3/prebuilt/ios/libglfw3.a というファイル自体無いはずです。
ちなみに以下のパスを一つずつ+ボタンをクリックして追加するのは大変なので、改行含めてまるっとコピーし、1行に全部ペーストしてやると勝手に1行ずつ展開してくれます。

$(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

LinkerFlags

Build Phasesの修正

そして、 Build PhasesDependenciescocos2d を追加し、 Link Binary With LibrariesMetal.frameworkcocos_libs 以下にある*.a の拡張子のファイルを追加します。

BuildPhases

この状態でビルドすればちゃんと通るはずです。
お疲れさまでした。

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

Leave a Reply