Cocos2d-x v4への移行 iOS編



cocos2d-x v3.17.2のcpp templateをベースに
v4へのmigrationを行う解説を行っていきます

旧バージョンのcocos2d-xからv4へのアップデートに
関心はあるがあまりiOS, Androidには習熟していないよ
という方向けです

私の知見が助力になれば幸いです
<br><br>

## [1.確認環境](#Migration-1)
    
- XCode 12.5.1
- CocoaPods 1.10.2
- CMake 3.15.3
  
  <br>



## [2.Cocos2d-x v4ダウンロード](#Migration-2)

[github](https://github.com/tlsd/cocos2dx-cpp-template-migration)に履歴を残していますので
差分や動作の確認にお使いください。

cocos2d-x v3.17.2のテンプレートから始めます。


ダウンロードしたcocos2d-xを解凍してフォルダ名をcocos2dに変更後
既存のcocos2dフォルダを置き換えます。

cocos2d-x v4 [ダウンロードリンク](https://www.cocos.com/en/)(https://www.cocos.com/en/)

<br>


## [3.iOSのビルド](#Migration-3)

基本的には[How to migrate · GitBook](https://docs.cocos2d-x.org/cocos2d-x/v4/en/upgradeGuide/migration.html#v3---v4)を参考にしていますが
細かいところに差異があります

修正を適用したgitをアップロードしています->[github](https://github.com/tlsd/cocos2dx-cpp-template-migration)

<br>
まず、v4でiOSでのビルドが通るように修正します
v4からはiOSでもCMakeが利用されていますがここでは
既存のxcodeprojを利用するためにcocos2d-xエンジンのみ
CMakeからxcodeprojを生成します
<br><br>

### [3.1 CMakeでcocos2d-xエンジンのXCodeプロジェクトを生成](#Migration-3.1)

cocos2d/cocos/CMakeList.txtの修正をします

- cmake_minimum_requiredのセット    
- COCOS2DX_ROOT_PATHのセット
- CocosBuildSet moduleのincludeをします

下記のようになります
<pre>
cmake_minimum_required(VERSION 3.15)

# The version number
set(COCOS2D_X_VERSION 4.0)

set(COCOS_CORE_LIB cocos2d)
project(cocos2d_libs)

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()
</pre>

![cocos2d_cocos_cmakelists.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2004493/92009bd8-728f-33de-b6d7-e60863758c61.png)


cocos2d/cocosフォルダへ移動、ここでCMakeします

`cd cocos2d/cocos`

cocos2d/ios-buildフォルダを作成します、ここにprojファイルが生成されます

`mkdir ../ios-build`

CMakeを実行します

`cmake . -GXcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -B ../ios-build`

下の画像のような結果になれば成功です
![1_cmake.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2004493/443b1d8e-66ad-4e50-7fa6-dfd3eb9d849a.png)


<br>

### [3.2 xcodeprojの修正](#Migration-3.2)

では、既存のxcodeprojを修正していきましょう
HelloCpp.xcodeprojを開きます

![2_open_proj.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2004493/8dc871cf-8213-7020-3a85-9b1a428fc62f.png)


<br>

### [3.3 cocos2d-xを入れ替える](#Migration-3.3)

参照の切れているcocos2d_lib.xcodeprojを削除して
先ほど作成したcocos2d/ios-build/cocos2d_lib.xcodeprojに
置き換えます

![3_cocos2dx_delete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2004493/e8969521-149f-65d4-2523-24249133861e.png)


<br>

#### [3.3.1 Header Search Paths](#Migration-3.3.1)
既存のHeader Search Pathsを修正します
これはそのままで良いことが多いです
SimpleAudioEngineを使う場合は追加します

もとになるバージョンによってUser Header Search Pathsであったり
Header Search Pathsになっていますが、
3.17.2ではHeader Search Pathsに設定されているので
そちらを修正していきます

Project HellopCppの
Settings —> Search Paths —> Header Search Paths

![5_replace_header.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2004493/f26a4603-0d09-0f22-9135-d103d380c5e7.png)



#### [3.3.2 Other Linker Flagの修正](#Migration-3.3.2)

TARGETS HelloCpp-mobile
Build Settings —> Linking —> Other Linker Flag

下記にあるlinker flagを追加します

[How to migrate · GitBook](https://docs.cocos2d-x.org/cocos2d-x/v4/en/upgradeGuide/migration.html#v3---v4)にはglfw3が含まれますが実際にはないので含みません

<pre>
$(inherited)
$(PROJECT_DIR)/../cocos2d/external/Box2D/prebuilt/ios/libbox2d.a
$(PROJECT_DIR)/../cocos2d/external/jpeg/prebuilt/ios/libjpeg.a
$(PROJECT_DIR)/../cocos2d/external/freetype2/prebuilt/ios/libfreetype.a
$(PROJECT_DIR)/../cocos2d/external/webp/prebuilt/ios/libwebp.a
$(PROJECT_DIR)/../cocos2d/external/bullet/prebuilt/ios/libLinearMath.a
$(PROJECT_DIR)/../cocos2d/external/bullet/prebuilt/ios/libBulletDynamics.a
$(PROJECT_DIR)/../cocos2d/external/bullet/prebuilt/ios/libBulletCollision.a
$(PROJECT_DIR)/../cocos2d/external/bullet/prebuilt/ios/libLinearMath.a
$(PROJECT_DIR)/../cocos2d/external/bullet/prebuilt/ios/libBulletMultiThreaded.a
$(PROJECT_DIR)/../cocos2d/external/bullet/prebuilt/ios/libMiniCL.a
$(PROJECT_DIR)/../cocos2d/external/websockets/prebuilt/ios/libwebsockets.a
$(PROJECT_DIR)/../cocos2d/external/uv/prebuilt/ios/libuv_a.a
$(PROJECT_DIR)/../cocos2d/external/openssl/prebuilt/ios/libssl.a
$(PROJECT_DIR)/../cocos2d/external/glsl-optimizer/prebuilt/ios/libmesa.a
$(PROJECT_DIR)/../cocos2d/external/glsl-optimizer/prebuilt/ios/libglsl_optimizer.a
$(PROJECT_DIR)/../cocos2d/external/glsl-optimizer/prebuilt/ios/libglcpp-library.a
$(PROJECT_DIR)/../cocos2d/external/png/prebuilt/ios/libpng.a
$(PROJECT_DIR)/../cocos2d/external/curl/prebuilt/ios/libcurl.a
$(PROJECT_DIR)/../cocos2d/external/openssl/prebuilt/ios/libcrypto.a
$(PROJECT_DIR)/../cocos2d/external/chipmunk/prebuilt/ios/libchipmunk.a
</pre>
// glfw3ファイルがないのでGitBookにはありますがここでは含んでいません
$(PROJECT_DIR)/../cocos2d/external/glfw3/prebuilt/ios/libglfw3.a


![6_linker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2004493/cbec4e28-8a82-6697-1882-16ed996db516.png)




#### [3.3.3 VALID_ARCHSの修正](#Migration-3.3.3)

既存のVALID_ARCHSがある場合は置き換え
ない場合はUser Defined Settingsを追加します

PROJECT HelloCpp
Build Settings -> User-Defined に追加

![9_valid_archs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2004493/d35d2e74-9dab-0bd3-bade-c6f8ed342dc8.png)



<pre>
DEBUG arm64 arm64e armv7s x86_64
RELEASE arm64 arm64e armv7s 
</pre>


TARGETS HelloCpp-mobileに反映されていない場合
すでに設定されていることがあります
TARGETS HelloCpp-mobile -> Build Settings -> User-Defined を削除してください


#### [3.3.4 Build Phaseの修正](#Migration-3.3.4)
TARGETS HelloCpp-mobile
BuildPhases -> Target Dependanciesにcocos2d(cocos2d_libs)
を追加する

![7_dependancies.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2004493/0f4d924d-f139-95b8-9e2e-badd795ca519.png)!


Link Binary with Librariesに
Metal.frameworkとcocos2d_libs以下の
ライブラリ(libcocos2d.aやlib_ext*.a)を追加する

![8_frameworks_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2004493/a237e366-378f-e3cc-1f41-3812460161d9.png)






#### [3.3.5 Compile](#Migration-3.3.5)

以上でビルドできるようになりました


#### [3.4 参照](#Migration-3.4)
https://github.com/tlsd/cocos2dx-cpp-template-migration


[次の記事 Cocos2d-x v4への移行 Android編](https://qiita.com/tlsd/items/b610d75565e1895bf96a)