見出し画像

Unityではなく、cocos2d-xで物理エンジンを利用した3Dゲームアプリを作った話

3Dゲームを作ろうと思ったら、今はたいていUnityを使って作るのが主流な気がします。ネットで検索しても、本屋に行っても、ゲームアプリの開発はUnityの情報で溢れています。

自分は2011年に初めてcocos2dを使ったiOSアプリをリリースしました。
ちなみに、当時リリースしたゲームアプリはこちらです。

リリース後、どういうわけかランキングを一気にかけ上り、AppStoreで総合1位にランクインしました。いい時代でした、、。

それからというもの、自分はcocos2d(現在はiOS版、Android版両方の開発が同時にできるcocos2d-x)をずっと使い続けてゲームアプリ開発を行っています。

Unityでゲームを作ろうと思ってちょっと手を出してみたこともあったのですが、どうもGUIでのゲーム開発になじめなくて、コードだけで開発できるcocos2d-xを使い続けています。

そんな中、そろそろ3Dゲームを作りたいという思いが強くなってきました。Unityであれば良質な3Dゲームが作れそうだと思うものの、せっかく慣れ親しんだcocos2d-xでも相応のものが作れないか、、と思い実際に作ってみることにしました。

というのも、cocos2d-xは名前に2dという文字がありますが、バージョン3になってから3D機能が追加されているのです。そして、バージョンを重ねるごとに機能も追加され、今では3Dの物理エンジンも利用できるようになっています。

さて、cocos2d-xでどんな3Dゲームが作れるのか?実際に作ったゲームがこちらになります。(上から、iOS版とAndroid版です)

これらのアプリは2019年12月にリリースされたcocos2d-x v4.0 を使って作りました。どれほどのゲームが実際に作れたのかはダウンロードしてプレイしていただければと思います。シンプルな3Dゲームですが、3Dの物理エンジンを利用し、それなりにちゃんとしたゲームが作れたかなと思います。

自分はUnityをそれほど触ったことがないので、Unityで作った場合との比較が正確にはできないのですが、cocos2d-xによる3Dゲーム開発で特に苦労した点は次の2点です。

1.物体の影をつける

Unityでは物体の影は特に意識することなくゲームエンジン側で容易につけることができたと思いますが、cocos2d-xでは影を自動的につける機能がありません(間違ってたらごめんなさい)。ですので、自分でshaderを利用して影を落とす必要があります。

幸いなことに、テストプロジェクトのSprite3DTestの中には、FakeShadowTestというものがあり、そこでsimple_shadowというそれっぽく影を落とせるshaderのサンプルがあります。これを使うと1つの物体が地面に単純な形の影を落とすことができます。これをうまいこと応用すると、複数の物体が地面に影を落とせるようになります。

ただし、これだけでは影が複数の地面を突き抜けていくつも出現したりと、どうしても不自然な挙動になるので、これらをうまいことプログラムで制御したりして、より自然な影を実現する必要があります。この辺けっこう試行錯誤が必要で苦労しました。

2.プレイヤーを動かす

プレイヤーを動かすためには、物体に力を加えるか(applyForce)、直接速度を与えるか(setLinearVelocity)のどちらかになるかと思います。本来ならば力を与えることで速度を発生させ、物理的に不自然な動作になることを回避すべきなのかもしれませんが、それだとプレイヤーをコントローラー通りに自由に動かすということがうまく実現できませんでした(工夫すればうまくできたのかもしれませんが、、)。そこで、自分の場合は直接速度を与える方法でプレイヤーをコントロールすることにしました。

しかし、この方法だと速度が直接与えられることによる影響なのか、本来貫通できないはずの物体をプレイヤーが貫通してしまうという現象が起こってしまいました。

貫通を防ぐという観点ではccd(Continuous Collision Detection)を設定することである程度防ぐこともできますが、それなりに負荷がかかるため、そもそも物体が貫通するような状況では貫通方向への速度を与えないようにしました。具体的には、衝突判定を駆使し、コントローラ操作でプレイヤーに与える速度を事前に制御するという処理を加えました。

Unityでプレイヤーを操作するちょっとしたものを作ったことがあったのですが、その時は特にこの辺を意識することがなかったので、もしかしたら、cocos2d-x特有の考慮すべき点かもしれません。(単に自分が何か勘違いしているだけなのかもしれませんが、、)

cocos2d-xで物理エンジンを利用した3Dゲームを開発した話は以上になります。今回作ったようなシンプルな3Dゲームであればcocos2d-xでもそれなりにちゃんとしたものが作れるかなというのが実際に作ってみた感想です。

これから3Dゲームアプリを作ってみようと思っている方、Unitiyで作ろうか、cocos2d-xで作ろうか迷っている方にとって、何かの参考になればと思い今回記事を書いてみました。

今後も、アプリ開発の参考になりそうなことをなるべく発信していけたらと考えています。最後まで読んでいただきありがとうございました。

最後に、私の作成したアプリ一覧は以下のサイトから見ることができます。

全て無料アプリですので、ご興味がありましたら是非お気軽にダウンロードしてお試しください。


この記事が気に入ったらサポートをしてみませんか?