2018-10-31に更新

cocos2d-jsでAssets Managerを使用する

cocos2d-jsでAssets Managerを使用しようと思ったのだが、
どうもドキュメントもサンプルも説明が少なく、
ネット上にも情報が少ないので色々試さなければならなくなったのでメモ。

公式のマニュアルは下記。
http://www.cocos2d-x.org/docs/manual/framework/html5/v3/assets-manager/en
(githubかなんかのどこかに日本語もあった)

この情報に加え、ライブラリのサンプルに入っている
samples/js-tests/src/ExtensionsTest/AssetsManagerTest/AssetsManagerTest.js
を見ることで対応できるのだが、どうも上手くいかなかった。

上記の情報を元にすると、Assets Managerはそもそも下記のような動作をする。

・まず、アプリのmanifestとサーバー上のmanifestを比較し、更新されたものをダウンロードして端末に保存。
・保存後、cc.game.restartでリスタートする。
・次回からのアプリ起動時、main.jsにてjsb.fileUtils.setSearchPathsを呼び出して
端末内に保存されているjsやリソースを読み込むように変更する。

上記で試してみたのだが、更新された際にcc.game.restartして再起動してからのプレイは、
途中でフリーズしてしまう。
一度アプリを完全に終了してから再度起動してみるとうまくいくのだが、
更新時に毎回フリーズはさすがにまずいのでこの方法はダメだった。

cc.game.restartのかわりにcc.director.restartやrestartVM等を試してみたがどれもダメ。
そもそもcc.game.restartが内部的にどうなっているのかすぐにはよくわからないので、
この命令を使うこと自体がちょっと怖い。
せっかくAssetsManager自体は上手く動いているのにほんとうにもったいない。

結局成功法はどうもダメのようなので、
http://galapagosit.hatenablog.com/entry/2014/10/08/162819
にかかれているように、jsListを別にして別途読み込む形で対応することにした。

この方法だとリスタートができないので、アプリ起動中にデータ更新が行われると
一度ゲームを中断して再起動してもらうしかない。
そのため、それを避けるには一つ前のバージョンのサーバーやりとりにも対応して
中断せずプレイできるように運用していく必要がある。

あと、AndroidとiOSでコンパイルした人は気づいただろうが
アプリ内に含まれるjsファイルは、iOSはjsのままなのだがAndroidはjscに変換したもの。
そのためAndroid側でもjsで対応しているとプログラムが書き換えられないので注意が必要。
面倒だ。
大した容量じゃないが、気になる場合はmanifestも別にしなければならない。
(jsListのファイル名は同じで良い)

あと、manifestのsearchPathsが、結局良く分からなかった。
例えばres/をrespathにしてリソースをロードする場合、
manifestのsearchPathsの方にもresを入れておいたほうが良さげ。
問題はそんな起きないと思うので、気になるパスはとりあえず入れておくと良い。

その他。
・miproj等、サイズ0のファイルが混じっているとサーバーによってはエラーになることも。
・開発中で保存されているデータがぐちゃぐちゃになってると、正しくてもエラーになる場合があるので
そういう時は一度アプリを削除したほうがいい。

ツイッターでシェア
みんなに共有、忘れないようにメモ

だら@Crieit開発者

Crieitの開発者です。 Webエンジニアです(在宅)。大体10年ちょい。 記事でわかりにくいところがあればDMで質問していただくか、案件発注してください。 業務依頼、同業種の方からのコンタクトなどお気軽にご連絡ください。 業務経験有:PHP, MySQL, Laravel, React, Flutter, Vue.js, Node, RoR 趣味:Elixir, Phoenix, Nuxt, Express, GCP, AWS等色々 PHPフレームワークちいたんの作者

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント