[プログラミング] Cocos2d-xとは:2Dゲームの無料クロスプラットフォーム統合ライブラリ 2016年版
基本
- 統一されたAPIで、ウェブ(HTML5)、デスクトップ、モバイルのネイティブアプリ向けの開発を行える、クロスプラットフォームかつオープンソースの2Dゲーム開発用ライブラリ
- WebGL、OpenGL、OpenGL ESをそれぞれ利用している
- ウェブはJavaScriptオンリーだが、ネイティブアプリはC++/JavaScript/Luaでの開発が可能
- ウェブ(Cocos2d-html)以外はサウンドもクロスプラットフォームで、オープンソースのOgg Vorbisを使える
- 単なるOpenGL系のラッパーではなく、物理シミュレーション・GUI用クラス・背景マップ(Tiled Map Editor形式)など高級APIが充実している
- 非常に速いペースで開発がつづけられている
- 無償で使えるIDE、GUIエディタまである
- AppleのObjective-C向けの「Cocos2d」、C#向けの「Cocos2d-XNA」など、いろいろなプログラミング言語・環境に対応している
- 中国で開発されている
全体の構成
#バージョン3.x
- Cocos2d-x(広義)
- Cocos2d-x(狭義:C++版)
- Cocos2d-x Lua(組み込み)
- Cocos2d-JS(組み込み:JavaScript版)
- Cocos2d-html(ウェブ版:Cocos2d-JSと統一されたAPI)
Cocos2d-JSとCocos2d-htmlは統合され、ネイティブアプリとウェブアプリの同時開発・同時出力(ビルド)が可能になっている。
APIの特徴
元が「Cocos2d」というObjective-C向けのライブラリだけに、iOSのAPIの影響を強く受けている。
基本的にFlashのActionScriptに似ているが、残念ながらそれよりは遥かにわかりづらく、使いづらい。
ただし、ゲームを開発する分には必要十分ともいえる。
ネイティブアプリ:狭義のCocos2d-x
各環境のネイティブコード(C++)用SDKを利用することで、C++単体でクロスプラットフォーム開発が可能になっている。
そのJavaScript版(バージョン2.x系では、JSB:JavaScript Bindingsと呼んでいた)とLua版は、C++向けの組み込みライブラリを使用しているだけ。JavaScript版は、MozzilaのSpiderMonkey。
C++版
狭義のCocos2d-x。
企業が採用しているのはほとんどがこちら。C++なので開発はしづらいが、内部の実装を隠蔽でき、セキュリティやチート行為への対策ができるためと思われる。
Lua版
中国を中心に、海外ではネイティブ版のCocos2d-JS(v2.x系のCocos2d-x JSB)よりもLua版のほうが人気が高かった(現在は不明。CocosCreatorではCocos2d-JSにのみ対応)。おそらく省メモリであるのと、組み込みでの運用実績がゲーム業界で特に豊富なためと思われる。
組み込み用のスクリプト言語なので、自作のC/C++部分と連携させる(バインドする)ことができる。
Cocos2d-JS(ネイティブ)
Cocos2d-JSのネイティブ組み込み版。
v3.xからウェブ版のCocos2d-htmlとAPIが統一され、より使いやすくなった。
Lua版と同じく、自作のC/C++部分と連携させる(バインドする)ことができる。
JavaScriptのエンジンはSpiderMonkeyでLuaエンジンより遥かに重ので、メモリをそれだけでけっこう消費するのを覚悟したほうがいい。
それが嫌なら、Lua版がおすすめ。
HTML版:Cocos2d-html
Cocos2d-JSのウェブ版(HTML版)。
WebGLを利用することでGPUによるハードウェア・レンダリングを可能にしたクロスブラウザのライブラリ。
ブラウザゲームやWebGLに対する印象が変わるくらい高速。
一部ブラウザ依存なので、サウンドはブラウザしだいになってしまう=クロスプラットフォームではない。その場合、別の汎用ライブラリである「CreateJS」にあるサウンド・ライブラリの「SoundJS」を併用する手もある。
機能性ではダントツ、しかし使いやすさではEaselJSなどにやや劣る。
バージョン
v3.x系
数々の不具合が修正され、処理速度もだいぶ向上した印象。
コマンドラインから実行できる各種ユーティリティ(Cocos)も充実し、簡単に新規プロジェクトの作成などができるようになっている(要Python)。
2015年くらいから、使えるツールも増えてきた印象。
ウェブでの話題は増えてきたが、実際の採用実績についてはあまり聞かなくなった。よって、実力・将来性ともに未知数といっていい。
v2.x系
以前は企業の採用実績が多く、最も情報の多いバージョンだったが、すでに終わっていると考えたほうがいい。
充実したGUI
拡張機能(extention)になるが、GUIライブラリも付属している。
いずれも必要十分で、もちろんハードウェア・レンダリングに対応しているので高速。
なお、v3.x系では名前空間が、ccsからccuiに変更されている
下記の専用エディタ「Cocos Studio」を使えば、WYSIWYGで簡単に画面を作成できる。
充実した機能
2Dゲームをつくるうえで必要なさまざまな要素にデフォルトで対応している。
アニメーション
ボーン(リグ)を使った動きやタイムラインベースのアニメーションに対応。
公式のCocos Studioを使えば、簡単に動きをつけられる。
外部の有名エディタSpine(有償)などにも対応。
マップエディタ対応
オープンソースの高性能2Dマップエディタ(レベルエディタ)であるTiled Map Editorのファイル形式「.tmx」に対応したTmx関連クラスが存在し、該当ファイルを読み込むだけでマップをLayerとして簡単に表示できる。
Cocos Studioでも対応している。
パーティクル対応
Particle Designerなど、有名パーティクル生成ツールのファイル形式に標準で対応し、簡単に表示・管理することができる(CCParticleSystem)。
Cocos Studioでも対応している。
なお、大半のパーティクル生成ツールは有償だが、無料でかつCocos2d-xに対応したParticle2dxというウェブアプリが存在する。
その他
- 物理シミュレーション
- 多重スクロール
その他ポイント
- 3Dに一応は対応し、2.5D的なことや簡単な3Dゲームをつくることも可能。ただし、3D用のツールは存在しない。
- 3D向けのまったく別のライブラリとしてCocos3dがある
開発環境
Cocos
プロジェクト管理機能と下記のCocos Studioを統合したもの。手軽に新規プロジェクトを作成したり、各種ライブラリやツールをダウンロードしたりできる。
ただし、「ストア」の更新が遅いのか、肝心のCocos2d-xエンジン(ライブラリ)の最新版をダウンロードできないことがある。
Cocos Studio
各種アニメーションの設定やGUI要素の構築をWYSIWYGで行える無料の公式エディタ。
有償のものと比べると見劣りする部分もあるが、全体として必要十分。
以前は「CocoStudio」という名前でWindows向けにしか提供されていなかったが、今ではMacでも使えるようになった。
このエディタそのものは、オープンソースではない。
CocosCreator
Cocos2d-x向けの新しい統合開発ツール(IDE)。
既存のツールと異なり、UIやアニメーションの編集からJavaScriptのコーディング、ビルドまで一括して行えるエディタのこと。
基本的にCocos2d-JS(JSB、html5)を前提としており、C++、Luaの編集には対応していない。
エディタ上において、WYSIWYGでひとつひとつの要素を編集し、その各イベントにスクリプトを割り当てていく形でアプリを組み上げていく。結果的にコーディング量は減る。
明らかにUnityを意識してつくられたもの。以前はfireballと呼ばれていた別のツールをCocos2d-xプロジェクトに取り込む形になった。
2016年4月現在、まだベータ版で先行きは不透明。
CocosSimulator
ChromeベースのCocos2d-html向けのデバッガ。といっても、Chrome標準の「デベロッパー ツール」を使っているだけ。
Cocosの「Cocos Store」からダウンロード、インストールできる。
メリットは、自前でローカルサーバを立ち上げる必要なく、ローカルにあるプロジェクトを実行できる点。
ただしその分、内部でローカルサーバを立ち上げるため、起動は遅い。
個人的には、自分で軽量のウェブサーバを立ち上げて、Chromeなど好きなブラウザでデバッグしたほうがいい気がする。
AnySDK
広告やアプリ内課金への対応を容易にするSDK。
残念ながら、日本でよく使われるサービスにはあまり対応していない。
Cocos Code IDE
組み込みのLua・JavaScript開発のための公式IDE。
すでに開発・公開ともに終わっている。
現在は公式には公開されていないが、なぜかフォーラムにリンクが残っており、ダウンロードすることはできる。
v3.xのソースコードにも、今のところはある程度対応できている模様(もちろん非公式)。
Eclipseベース。
Unityのツールのように、実行中にリアルタイムにソースコードの変更を反映させることができる。
全体の問題点
不透明な開発の方向性
仕様変更がけっこうあって、ソースコードの修正を余儀なくされる場合がある。メジャー・バージョンアップではある程度仕方がないが、そこをどう割り切るか。
全体的に、新規開発によってどんどん新機能が追加されている一方、さらにカオス化進んでいるように感じられなくもない。
今のやや行き当たりばったりにも感じられる開発スタイルだと、将来的にどこかの段階で行き詰まりそうな気配がある。
ただ、プロジェクト全体が成熟してきたようで、安定感は増してきた。
仕様や命名規約・コーディング規約の不統一
全体の設計に統一感がなく、とりあえず必要なものをどんどん突っ込んでいったという印象。
C++版ではマクロや定数が乱立し、JavaScript版でもクラスにまとめればいいのに、なぜかグローバル変数・関数的なものが多い。
v3.xである程度改善されたが、APIの古い要素をだいぶ削除したために、かえって以下の問題が発生。
後方互換性のなさ
残念ながら、開発陣に後方互換性を維持しようという意識は稀薄らしく、メジャー・バージョンアップ時にかなりの要素が非推奨(@deprecated)ではなく、削除されてしまった。
旧APIをラップする関数なども一部しかなく、基本的に後方互換性はないと思ったほうがいい。
高速開発の裏面、というより負の側面か。
ゲームパッド未対応
@n
FlashのActionScript 3.0はゲームパッドに対応しているが、Cocos2d-xでは低級APIでも対応していない。
そのため、ゲームパッド部分はクロスプラットフォームで開発することはできず、自前でなんとかするしかない。
バーチャルパッドも用意されていないので、こちらもSpriteやLayerを使って自作する必要がある。
不完全なクロスプラットフォーム
せっかくクロスプラットフォームなのに、対応言語ごとにAPIに微妙な差異があって混乱させられる。
Lua版はともかく、JavaScript版(Cocos2d-JS)はシステムの根本にかかわる部分でもC++版と異なり、
言語ごとの仕様に関する部分は仕方がないが、統一できるはずの部分さえ異なっていたりするので不可解。
難解な実装・動作
ところどころトリッキーな動作をするところがあり、そこに引っかかることがよくある。どうしても、くわしい使い方を理解するまで時間と労力がかかってしまう。
特にイベントドリブン(イベントハンドリング)の仕組みがわかりづらい。シンプルなjQueryやActionScript 3.0のようにはいかない。
仕様だか不具合だかわからないようなところがけっこうあるため、それを検証しながらコーディングする覚悟が必要。
著作権など知的財産権のリスク
Githubを見ると、メインの開発者以外からのリクエスト(投稿)をどんどん採用しているように思われる。
大半のオープンソースでも似たような状況だが、開発方針やロードマップがはっきりと示されておらず、全体として開発者(貢献者)の数が多いだけに、どこまで知財権に配慮しているのかまったくの未知数。
おそらく、各ソースコードの所有権の確認や貢献者の身元チェックはまったくやっていない。
企業が一括してつくっているUnityに比べて遥かに高リスク(業務用では特に)。あまり知られていないが、かつてccUTF8の部分がLGPLだった(現在はLLVMライセンス)ため、もしそのバージョンを静的リンクしてビルドしていたら、ソースコードの開示要求を拒否できない。
情報の少なさ
まず、公式の情報が物足りない。リファレンスですら記述が少なく、中には実装されているメソッドなどでさえ未記載の場合すらある。
公式のマニュアルやWikiはあるものの、情報が古い場合が多く、参考程度にしかならない。
全体として実質的に、「ソースコードを自分で読め」という形になってしまっている(特にCocos2d-html:下記)。
ウェブ全体でも、全般的に情報が不足しがち。特に日本語資料が少なく、北米など英語圏ではあまり人気がないためか、英語での情報すら少なく、場合によっては中国語のサイトを翻訳サイトで訳しながら情報をかき集めるしかない。
出版されている書籍も、Unityに比べれば少ない。
結果的に、使う以前に情報収集に時間がかかってしまうのが問題。
Cocos2d-htmlの問題点
事業者の採用実績が乏しく、情報も不足しがち。
3Dに対応していない。
全体として、やや先行きが不透明か。
個人的な所感
開発コミュニティはそれなりに大きいようだが、全般的に個人の手作り感が否めない。その割には、「2Dゲームとしてやりたいことはほぼできる」という機能の豊富さが特長のライブラリといえる。
無料・多機能性の部分に重点を置くか、安定性を求めるかでまったく評価が変わってくるだろう。
いろいろなことができるが問題点も多く、正直、コーディングしていて楽しいだとか楽だとか感じることはめったにない。
全体を通していえることは、開発環境も含めて必要十分な機能はすばらしいのだが、一方で一定以上のデメリットとリスクも存在する。そこをどう判断するかで、このライブラリへの印象は人によって大きく異なると思われる。
将来的なことを考えて業務用では、個人的にUnityの2D機能をおすすめしたい。WebGLに対応しておかげで、かつてのプラグイン(Unity Web Player)なしでもクロスブラウザのブラウザゲームにも対応できるし、企業が運営母体になっている安心感がある。
ウェブ版は、EaselJSも今ではWebGLによる高速レンダリングに対応しているので、使いやすさを求めるならこちらのほうがいいかもしれない。
ともかく、メリットとデメリットを天秤に掛けて、各自で判断するしかない。「無償だから」という理由で安易にCocos2d-xを採用すると、痛い目を見る場合もあるので注意したほうがいい。