Cocos2d-xをやめてUnityに移行した話@2019冬

ご注意:

内容は全て個人の感想です。また、好意的な内容ではありません。人によっては不快になる可能性があります。承知の上読んでください。

この記事は、今まで趣味でC++の勉強 & ゲーム制作で Cocos2d-x を使ってアプリ開発していましたが長らく使用していた Cocos2d-x から Unity に移行を決めた話です

使い始めたきっかけ

まず、僕が何故 Cocos2d-x を使い始めたかというと仕事で触る C++ の規格がすごく古くて新しい規格を覚え直そうとしていた 2016 年初めから中頃の事です。当時割とゲーム開発にも興味があり「新しい C++ の規格の勉強」&「ゲーム開発」という一挙両得の領域で勉強ができるということで触り始めたのが始まりでした。

その後かれこれ3年半ほどこのエンジン触ってきましたが C++ の勉強は当初の目的を達成したので一旦終了、ゲーム開発は面白いので趣味として Unity に移行する事にしました。そこで一応 Cocos2d-x を振り返って、今までどうだったのかまとめてみたいと思います。

だいたいの流れ

自分がCocos2d-xに手を付けた時は2016年中頃だったのです。が、その時点で既にUnity一色といった状態でした(この時点で書籍を出すなどの活動やネットへの情報発信を行っていた主要な人物が軒並みCocos2d-xから去っていたようです)既に環境が悪そうだなと思いましたが、C++界隈は結局どこもそんなものだと思っていたので当時はあまり気にしていませんでした。

参入したころには既に以下のような事件がいくつか起きていました(2014→2016年前後)

  • 2.x → 3.xへの移行
  • SSL1.0レガシー化問題
  • CocosStudioの突然の削除
  • GoogleがEclipseのADTサポートを終了しAndroid側の開発環境が存在しない問題

上記と共に、Unityの急成長もあって利用人口が急減していたようです。ADTサポート終了とCocosStduioが突如無くなった事で、今まで割といい感じだった開発環境が無くなってしまったことがCocos2d-xというゲームエンジンの人気低下の決定打になっていました。ちなみにQiitaでアドベントカレンダーが2015年末に埋まりきらず以降アドベントカレンダーは作られなくなってしまいました。2016年も作られてたみたいです。ですが登録がなんとたった1件だけしか無いです。これはひどい。

最近はエンジン自体の情報がほぼ無かったので自分も多少発信をしてきましたがそれで盛り返すなんて事は当然無くて、今もCocos2d-xメインで個人開発で継続的に使用している人はネットで数人見かけた程度です。やっと最近になってAndroidStudio上での開発が多少できるようになりましたが完全に手遅れな感じです。

Cocos2d-xに感じた事

3年半もエンジンを触っていたため割と思うところがあったので箇条書きで書き出してみました。ちなみに環境はC++/AndroidStudio/VisualStudioです。

  • 環境構築と維持が大変
    • Android環境しか作ったことないですが環境構築はすごく大変です
      • ADVがまぁ良くないのでできれば実機でと言われる始末
    • 未だに Python2.x のセットアップしないといけない
    • 最近はNDKのバージョン依存がほぼなくなったけど新しい cmake 対応がまた大変
      • cmake は Cocos2d-x 視点の公式以外の情報がほぼ存在しない。環境をよく理解したうえで自力でビルドを構成しないといけない
        • これは経験があるエンジニア以外には無理そう
    • 3rdライブラリを導入すると辛い
      • そのライブラリの cmake 対応はたいていの場合自力でしないといけない
      • 一応プログラマーの端くれなので出来るけどそこであまり頑張りたくない…
    • 連携ライブラリ周りのトラブルが多すぎる
    • AndroidStudio, VisualStudioで別々にプロジェクト設定面倒すぎた
      • AndroidStudio はバージョンがかなりの頻度で変わるけどその度に動かなって大変すぎる
        • NDKのバージョンが、何かのツールのバージョンが、ですごい大変
        • ボタンを間違えて押して環境を更新しちゃった時にうわあああってなる
        • この部分ずっと変わらなかったのでそういうものとして諦めるしかない
  • C++言語固有の難しさ
    • C++はいい言語
    • 但しC++固有の問題で開発が滞る
      • コンパイルエラーは慣れててもかなりエグい
      • たいだい自分原因だけどたまに外部ライブラリで死ぬ
      • 型関係でミスった時にデバッグの難易度が一番高い
    • 3rdライブラリをリンクするとさらに大変
      • コンパイルできても実行時エラーが解決不能で何度か死んだ
    • C++の標準ライブラリが貧弱なので何かしようとするたびに全部作る or 外部ライブラリ導入でやばい
    • ビルドに激しく時間がかかる(それも頻繁に)
      • フルビルドだと10-40分かかるのでコンパイルだけで時間が過ぎてしまう
        • 操作間違えでフルビルドを走らせちゃうと真顔になる
    • ネイティブ故にデバッグが結構大変
      • 変更してはビルドして少し待ってから実行を何度も繰り返すと地味にきつい
      • 突然落ちたときの原因不明さがやばい
  • 将来性がどうなるか常に不安
    • エンジンの開発は続いてるけどとにかく最近は人が居ない、新しい情報が無い
      • 昔は使ってたけど今は使ってない人が沢山いる
    • 一時期公式がC++のサポート打ち切りを匂わせる
      • JS一本にしたいからC++/Lua削除していいか公式がフォーラムでアンケートとってしまう
        • コミュニティから猛反発食らって撤回したことが過去にあった
    • CocosStudioのサポートを突然打ち切り。マジで何故?
      • CocosStudioに代わるUIエディタが遂に登場しなかった
      • というかCocosBuilder終盤からの迷走はすごく謎。ユーザー置いてけぼりで迷走末同意なき削除
      • 今でもCocosStudioはアーカイブが残ってて使うならそれだけどメンテされてないので微妙に動かないところがある
        • コードも非公開だからバグが出たら終わり or 自分で修正パッチ作ってC++にパッチ当てる事に
      • pre-buildツールも突如削除で開発元への不信感が湧く
        • 結構使ってたのにレガシーだから急に削除とか意味がわからん…
      • CocosCreatorはC++環境でCocosStudioの代わりに全くなってない
        • しかもC++連携のプラグインはメンテされずに放置状態
      • 当のCocosCreatorはC++より更にマイナー
        • JSと併用してる人は本当に滅多に見かけないし情報もすごく少ない
    • 4.0がリリースされそうだが追従する気が起きない
      • というか書いてる最中にリリースされてた
      • また環境構築が変わってるっぽくて面倒そう
      • Metal対応がメインらしいけど追う気がまじで起きない
        • Win32のVisualStudioのslnテンプレ無いしもう近寄りたくない
  • エンジンが中国製
    • エンジンの開発元が中国でアメリカと市場環境が違う
    • 中国内のWebゲームが隆盛でネイティブなアプリ開発のサポートはやる気が低下している
      • なのでエンジンの成長の方向性が日本の環境とマッチしていない
        • 開発元はそこら辺も含めてCocosCreator + JS推しでC++は冷遇されています
        • 良し悪しはともかく僕は少なくともそういうのを求めていませんでした
  • Cocos2d-x自体の微妙な古さ
    • エンジンの基本部分の機能追加が一切されていない
      • 新しい環境への追従くらいで本当に何も追加されていない
    • C++20がそろそろ出るけどエンジン側はC++11から変更なし
      • 書き方が古いので勉強用途では微妙な感じ
        • 自分でコンパイルオプション変えればいいんだけどそれでまたトラブルが起きるのが怖くてできなかった
      • まぁ互換性維持のために古い方をサポートするは理解できるが周辺ツールがレガシーだから即削除するので態度が一貫していない
    • その割にヘッダーコメントはある時全部書き換えるとか力の入れどころが謎
      • 途中で事業譲渡されたのね。ふぅん。
  • エンジンにリソース保護機能が存在しない
    • 個人アプリなので気にしないほうがいいといえばそうだけど
    • 基本的にAndroidはapk内に画像や音楽ファイルが平文で配置される
      • 消滅都市、ツムツム、ポケマス(Cocos2d-x製)ほどの企業系アプリでも一部のリソースがapk内に平文
        • さすがにコードは難読化されていました
      • ファイルを暗号化してもリソースを読み込むAPIはファイルパスベースが大半でつらい
      • 昨今のapk割れ対策に脆弱だけど対応策なし
        • 自分で買ったリソースが平文でポン置きはちょっとね…
        • 大半のAPIはバイナリストリームからコンテンツロードが厳しいし対応は個人ではコストがかなり高い
  • 利用人口の減少が激しく情報発信がほぼ無い
    • この記事を書いている時点で国内のコミュニティが全部消滅済みで何も存在しない
    • 日本ユーザ会の挙動が本気で謎だった
      • ユーザー会は2015年にサイトがWeb上から消滅
      • 次にFacebookでページができたけど会員制で入会しないと内容が自由に閲覧はできない
        • ただ入ったとしても内容は有益な情報が一切無くほぼ廃墟状態
        • なのに入会にはプロフィールがちゃんと書いて申請しないと入会できないクローズドな環境(マジで何故?)
          • 遂に最近?Facebookのユーザー会が消滅したっぽい(マジでよくわからないけどステルスで消滅したっぽい)
    • Web上の記事は2014年~2016年がほとんどで2019年以降の儀j通記事がほぼ無い
      • エンジンの書籍が出たのが2016年が最後
      • というか書籍が3-4冊でそもそも少ない
    • 黎明期から使ってる大手企業は情報提供ゼロ
      • わかるのは権利表記からエンジン使ってることだけ
      • 守秘義務とかあるんだろうけど最近完全に情報ゼロは逆にすごい
    • 主要情報発信者は軒並みほかの開発環境に移行済み
      • 2016年末には積極的に情報発信してくれてた個人開発者勢はほぼ全員居なくなった
    • 4.0~の情報はほぼゼロ、2020年1月時点で国内に触ってる人が個人レベルじゃほぼ存在しない
  • リリースしても不安が残る
    • アプリをリリースした後もしばらく環境の面倒を見ないといけない
      • 半年後、1年後に触ってるイメージが全然わかない
    • 後でメンテで触ったときもすごく大変そう
      • バージョンが変わってるだろうし大変そう。今より人が居ない&情報が無いのは確実
  • 開発効率が良くない
    • ノーエンジンより遥かにマシだがC++は開発効率が非常に悪い
      • というか比較先がノーエンジンであってUEやUnityなどの統合開発環境ではない
    • wysiwygなエディタが無い事もあって実装、ビルド、少し直してまたビルドは効率が死んでる
    • アニメーションをコードで書くと特につらい
      • 微調整してビルドしてまた微調整を繰り返すのは時間が非常にかかる
      • アニメーション周りのコードで書いたら後から見ると何もわからない
        • 簡単に動作を見直す事ができない
          • 想像力は鍛わると思う
        • アプリ内ビューワー作ったけど工数の割に効果が微妙で絶望した
          • 外部ツールは作り始めると無限に要件が出てくるから作るのもすごく大変だった
  • 長所の陳腐化
    • 昔より端末が高性能化、ネット回線が高速化
      • すごい昔の事は知らないけど実行速度的のメリットが相対的に低下してるらしい
      • アプリサイズの小ささの利点も相対的に低下
    • ライブラリ内のコードが見れて自分でビルドできるのは良いけど利点と言うほどでもない
      • 見れたところで理解して直せるか別次元な問題
      • 直してた事もあったけど後々ツラくなるから工数が沢山取れないなら触らない方がいい
        • 直して毎回自分でローカルパッチ当てるとか個人の環境じゃ非現実すぎた
      • それよりリファレンスや解説がネットで普通に見れる事の方が大切
        • Cocos2d-xはリファレンスが結構ひどくて申し訳程度にあるだけ

こんなに色々語れるとは思っていませんでしたが、書き出してみると結構色々ありました。割といろいろあったんだななーって思います。

Cocos2d-xの良いところって最近はC++でコードをガリガリ書いて自分の世界を作れる事で、完璧な環境なんてものは存在しないと思いますがこれだけ周りで色々積み重なると自分の制作とは関係なく流石にちょっとなぁ…と思います。

特にGUIとアニメーションをコードだけで書くのはかなり厳しかったです。途中から諦めて UI 作成には CocosStudio を使ってましたがこれがまた不安の種にしかなりませんでした。UIツールは必要だよね…

他と比べてどうという話ではなく Cocos2d-x 単体でこれだけ出てきちゃう話なんですよね…まぁ不足や不満があれば自分でエディタでもツールでも作ったりコントリビューターにでもなれば?というスタンスなのかもしれません。

こういった事がある中でそれを全て乗り越えてアプリをリリースした人達は本当に心から尊敬しています。本当に。

自分の反省点

ここまで色々書いておきながらアプリを1本もリリースしていないのは非常に恥ずかしい話なのですが、全て自分の進行管理が良くなかったと反省しています。仕様を決めず漫然とボトムアップコードを書き始めるの事が割とありましたがそれが特に悪かったかなと思います。迷った挙句実装期間が長くなるとモチベが終わるというのは非常によくわかりました。

ただ、僕もプログラマーの端くれなので C++ を書くのは事は楽しく取り組めていたと思います。コード書くの楽し~って。が、制作環境は微妙に辛かった事もありました。特に Windows 上で開発していて Adbe にもお世話になっていいので UI 作成や AndroidStudio にはかなり苦労しましたし、VisualStudio を使用してて実装はしやすかったのですが、結局 Windows ⇔ Android のクロス環境になるので AndroidStudio でビルドすると毎回必ずトラブルが発生するのは結構辛いものがありました。

自分は制作速度がかなり遅いほうなので、上記の環境の移り変わりで影響を大きく受けてしまい、ビルドシステム(Gradle, cmake)を結構ガチ目に覚えないといけない、AndroidStudioでエラーが出てビルドすらできなくなるけどネットには情報が無くて詰んだ後に自力で調査などの面倒に直面する機会が多かった事が最終的なモチベーションの低下につながったのかもしれません。

特に AndroidStudio が自動でアップデートされてビルドが通らなくなったり、、、

それと取り組んで大変よく分かったのですが、エンジンは基本的な機能しか提供せずに不足してるところを各自がコードでガリガリ実装して作り上げるスタイルなので、仕事が終わってから寝るまでの2~3時間の中で効率よく開発していかないといけない状態で、C++で文字列/エンコード周りの実装とか、アニメーション補助ライブラリの作成や、シェーダーの追加実装、通信周り追加実装、環境周りの設定作業など本筋の開発とは違う作業に時間を取らると結構厳しいですよね。

手が抜けるところは手を抜いて楽していかないと永遠に完成しないのが「個人ゲーム制作」という世界なのかなと思いました。そういった事でなるべく負担が少ない無いこともエンジン選びの要素の一つなのかもしれません。

そんな感じで最終的にこの記事を書いてる2019年末までWindows + VisualStudio + CocsStudio + AndroidStudioで制作していましたが、途中になってしまいますがこれ以上の継続はネガティブになってしまったので開発を中止しちゃいました。つい先日までC++17対応とかcmakeでsoファイル作成とかfirebaseでremote-configして記事でも書くかと思っていたのに急に継続する気がなくなったのは自分でも驚いてます。急にきました。

僕以外には(実は僕自身にも?)既に周知の事だったのかもしれませんがC++のほうはエンジンとしては「先行きが不安」ではなくもう「先が無い」感じなんじゃないかなー?開発元も優先度が完全に CocosCreator 中心で C++ のほうは放置っぽいです。まぁCocos2d-x 自体は何もエンジンが無いよりは圧倒的に開発効率が良いでのは事実ですが。

今、結構トリガーハッピー気味の状態で書いてるのでボロクソにエンジンも悪いんだよ!みたいな書き方をしていますが結局完成してないのはマジで自分のせいって事は自覚してるつもりです。個人でアプリリリースしたり、モンストみたいなアプリもあるわけですし、、ただそんなすぐに素直にはられるわけねーだろクソー!という状態です。この部分は後々別口で反省をしないといけないと思っています。

という訳で、今後はバージョン2に生まれ変わるまで情報発信しないか、してもすごく稀になると思います。

これからCocos2d-xを使おうとしてる人へ

僕みたいなエタリストからの助言なんかほぼ無価値だとは思いますが、もし「個人」の「ゲーム開発」でで新しくCocos2d-xを検討してる使いる人は「苦労することがかなり多いのは覚悟した方がいい」です。他に有名な開発環境がいくつか存在するので採用するかはよく考えましょう。特に「ホビーユース」で「ゲームをリリース」したい人は2Dに強いエンジンだからと Cocos2d-x を選ぶと結構厳しい思いをする可能性が高いです(逆に勉強目的であれば好きにしたらいいと思います。ネイティブに近いので大変勉強になります)

有名なほかの開発環境を見てみると、環境構築、情報量、標準サポートのツールや表現の多さ、デバッグの容易さ、開発言語、効率のよさ、IDEの存在、アセットストア、将来性、界隈の活発さ、利用人口、どれも優位性が無さそうです。(ほかのエンジンはほかのエンジンで当然色々あるのだとは思いますが)リリース迄にそれらが負担になって消耗をしないためにもほかの有名な開発環境は魅力的に感じます。万が一もしトラブルにあっても情報が非常に豊富なので一人で悩む時間は少なくて済みそうです。

あと開発やリリース後のメンテ等諸々考慮すると今後、2020年以降、2021年、2022年と将来に渡ってCocos2d-xをメインで使い続けるも割と非現実的かなと思います(早くても2020年内にリリースして2021年中は保守してるとか想像しただけでヤバそう)環境起因の変なトラブルが減るとも思えないですし(むしろ4.0でまた増えそうな気がします)今が2017年初めならまだCocos2d-xを触ってもいいんじゃないの?と言ったかもしれませんが2019年末で新規に手を出すのはかなり勧めしずらいです。これから時間が経つ程そういう傾向が強くなると思います。たとえ経験者のプログラマーで個人開発にモチベーションが特別に無い限りCocos2d-xを積極的に使うメリットが薄のかなーって思います。

エンジンを取り巻く環境の方が変わってきているため時代の流れ?なのかと思います。