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で別々にプロジェクト設定面倒すぎた
      • Androidは本気でやばい魔窟
        • この部分ずっと変わらなかったのでそういうものとして諦めるしかない
  • C++言語固有の難しさ
    • いい言語だとは思う
    • だけどC++固有の問題で開発が滞る
      • コンパイルエラーが慣れててもかなりエグい
      • たいだい自分原因だけどたまに外部ライブラリで死ぬ
      • 型関係でミスると突如最大難易度の不具合とデバッグが発生する
    • 3rdライブラリをリンクするとさらにヤバくなる
      • コンパイルできても実行時エラーが解決不能で何度か死んだ
    • C++の標準ライブラリが貧弱なので何かしようとするたびに全部作る or 外部ライブラリ導入でやばい
    • ビルドに激しく時間がかかる(それも頻繁に)
      • フルビルドだと10-40分かかるのでコンパイルだけで時間が過ぎてしまう
        • 操作間違えでフルビルドを走らせちゃうと真顔になる
    • デバッグがめちゃくちゃ大変
      • 変更してはビルドして少し待ってから実行を何度も繰り返すと地味に精神的を蝕まれる
      • 突然落ちたときの原因不明さ結構がやばい
  • 将来性がどうなるか常に不安
    • エンジンの開発は続いてるけどとにかく最近は人が居ない、新しい情報が無い
      • 昔は使ってたけど今は使ってない人が沢山いる
    • 一時期公式がC++のサポート打ち切りを匂わせる
      • JS一本にしたいからC++/Lua削除していいか公式がフォーラムでアンケートとってしまう
        • コミュニティから猛反発食らってましたが…
    • CocosStudioのサポートを突然打ち切り。マジで何故?
      • CocosStudioに代わるUIエディタが遂に登場しなかった
      • というかCocosBuilder終盤からの迷走はマジで草、ユーザー置いてけぼりで迷走して削除
      • 残ったCocosStudioサポートが削除されそう
        • コミュニティの反対でいったん取り下げられたものの今後メンテも期待薄
        • 不具合が出たら一発終了の不安感
      • 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でページができたけど会員制だ入会しないと内容が自由に閲覧はできない
        • FBのサイトは有益な情報が一切無くほぼ廃墟状態
        • なのに入会にはプロフィールがちゃんと書いてないと入会できない検閲付き
          • というかFBの方も消滅したっぽいけどよくわからない
    • Web上の記事は2014年~2016年がほとんどで2019年の記事がほぼ無い
      • エンジンの書籍が出たのが2016年が最後
      • というか書籍がそもそも少ない
    • 黎明期から使ってる大手企業は情報ゼロ
      • わかるのは権利表記からエンジン使ってることだけ
      • 守秘義務とかあるんだろうけど最近完全に情報ゼロは逆にすごい
    • 主要情報発信者は軒並みUnityに移行済み
      • 逆に積極的に情報発信してくれてた個人開発者は2016年末にほぼ全員居なくなってた
  • リリースしても不安が残る
    • もし万が一アプリをリリースした後もしばらく面倒を見ないといけない
      • 半年後、1年後に触ってるイメージが全然わかない
    • 後でメンテで触ったときもすごく大変そう
      • バージョンが変わってるだろうし大変そう。今より人が居ない&情報が無いのは確実
  • 開発効率が良くない
    • ノーエンジンよりマシだがC++は特に効率が悪い
      • というか比較先がノーエンジンであってUEとかUnityじゃない
    • wysiwygなエディタが無い事もあって実装、ビルド、少し直してまたビルドは効率が死んでる
      • レガシー目な業務アプリの方がまだ効率がいい
    • アニメーションをコードで書くと特にやばい
      • 微調整してビルドしてまた微調整を繰り返すのは時間の無駄
      • アニメーション周りのコードは後から見ると何もわからない
        • 簡単に動作を見直す事ができない
          • 想像力は鍛わると思う
        • アプリ内ビューワー作ったけど工数の割に効果が微妙で絶望した
          • 無限に要件が出てくるから作っても地獄
  • 長所の陳腐化
    • 昔より端末が高性能化、ネット回線が高速化
      • すごい昔の事は知らないけど実行速度的なメリットが相対的に低下してるっぽい
      • アプリサイズの小ささの利点が相対的に低下
    • ライブラリ内のコードが見れて自分でビルドできるのは良いけど利点と言うほどでもない
      • 見れたところで理解して直せるか別次元すぎ
      • 直してた事もあったけど後々ツラくなるから工数が沢山取れないなら触らない方がいい
      • それよりリファレンスや解説がネットで普通に見れる事の方が大切
        • Cocos2d-xはリファレンスが結構ひどくて申し訳程度にあるだけ

こんなに色々語れるとは思っていませんでしたが、書き出してみると結構色々ありました。割といろいろあったんだななーって思います。正直な話、Cocos2d-xの良いところって最近はC++でコードをガリガリ書いて自分の世界を作れる事くらいだったんじゃないかな…?完璧な環境なんてものは存在しないと思いますがこれだけ色々積み重なると自分の制作とは関係なく流石に…と思います。

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

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

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

自分に感じた事

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

ただ、僕も一応はプログラマーの端くれなので開発の中でC++を書く事は楽しく取り組めていたと思います。コード書くの楽し~~的な。が、それ以外の環境周印象です。特にWindows上で開発していてAdbeにもお世話になっていないためUI作成やAndroidStudioにはかなり苦労しましたし、VisualStudioではすごく開発しやすかったですが結局クロス環境のためAndroidStudioでビルドすると毎回必ずトラブルが発生するのも結構辛いものがありました。

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

それと取り組んで大変よく分かったのですが、エンジンは基本的な機能しか提供せずに不足してるところを各自がコードでガリガリ実装して作り上げるスタイルは当初は「硬派」に見えましたがいざ開発を初めて見ると、仕事が終わってから寝るまでの少ない時間の中で効率よく開発していかないといけない中で、C++の標準ライブラリが少々貧弱故に他言語ではあり得ない文字列・エンコード周りの実装とか、機能不足を補うためのアニメーション補助ライブラリの作成や、シェーダーの追加実装、通信周り追加実装、環境周りの設定作業など本筋の開発とは違う作業に時間を取らていると、それだけ完成がすごく遠のくというのが今の実感です。手が抜けるところは手を抜いて楽していかないと永遠に完成しないのが「ゲーム制作」という世界なのだと今では強く思います。そういった事でなるべく負担が無いこともエンジンの良し悪しの要素の一つなのかもしれません。

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

僕以外には(実は僕自身にも?)既に周知の事だったのかもしれませんがエンジンとしては「先行きが不安」ではなくもう「先が無い」感じなんじゃないかなー?って思っています。Cocos2d-x自体は何も無いより圧倒的に開発効率が良いのは間違いないですが、比較先はあくまでノーエンジンとであって、そこからもう一段上の開発促進に貢献して無いです。Unityはそこらへんうまくサポートされているなぁと思います。

また、今後使う人が更に減って情報が出なくなっていく方向で巻き返しがの目が無さそうですし、悩みがちな個人開発という世界でこの先このゲームエンジンは果たして今後どうなるのか(主たる関心は次はどんなトラブルが出るのかですが)という不安を漠然と抱えて開発していくのも精神的に良くない感じでした。実際にトラブルにあっても誰も解決策を出してくれない世界ですし…なので、今までは目的があってCocos2d-xを利用していましたが、C++の勉強という目的を達成し、残った「ゲーム開発」という観点ではメリットが全然感じられない状態で、人が少ない状況に逆らい、環境のトラブルに向かい合いながら開発を継続していくモチベーションが失われてしまったのだと思います。

C++の勉強という面でも、2016年前後ではC++の規格学習プラットフォームとしてワンランク上を目指すのに割と良い感じでしたが、C++の学習曲線自体は2018年末くらいでフラット化 & Cocos2d-xもC++15, C++17対応が無くてレガシー化しつつあったので来るべきタイミングが来たのかもなーなんて思ったり。

繰り返しになります、これって全部僕個の話なので大手アプリ会社とか、コストを全部払えるつよつよ個人には全然関係のない話です。Cocos2d-xを今から使うのも自由です。こういった諸々の開発コストを支払える団体や個人が我こそはと取り組む事は自由だと思います。僕個人には結局無理でしたが。黎明期の企業アプリで大きく売り上げてる所がまだ使ってるのは知っていますが、僕個人の製作に何も関係ありませんでした。

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

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

これからもし使おうとしてる人へ

僕みたいなエタりストからの助言に如何ほどの価値がある分かりませんが…

もし「個人」の「ゲーム開発」で新しくCocos2d-xを検討してる使いる人は「悪いことは言わないからCocos2d-xは選ばない方がいい」です。素直に一番人気のUnityにしましょう。特に「ホビーユース」で「ゲーム開発」したい人は2Dに強いエンジンだからと言って今Cocos2d-xを選ぶと環境面でかなりツラい思いをする可能性が高いです(逆に勉強目的なら好きにしたらいいと思います。ネイティブに近いので勉強にはなる事は確かですし、実行環境としても程々に使えます。トラブルが起きても自力解決が必須で誰も答えてくれないので大変厳しいですが。画像1枚画面に出すのはすごく簡単ですがその先、シーンを作ってUIを作ったりったりアニメーション作ろうとしたらもうやめたほうがいいですが)

Unityと比べてしまうと環境構築、情報量、標準サポートのツールや表現の多さ、デバッグの容易さ、開発言語、効率のよさ、IDEの存在、アセットストア、将来性、界隈の活発さ、利用人口、どれを取っても優位性が今のCocos2d-xにはありません。(UnityはUnityで当然色々あるのだとは思いますが)リリース迄に環境で無用な消耗をしないためにもUnityを選ぶのが今は良さそうです。もしトラブルにあっても情報が豊富で相談する人が沢山います。

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

エンジンを取り巻く環境の方が変わってるので時代の流れだと思いました。