はじめてのUnityゲーム開発でつまずきやすい3つのポイント

icon_image_inu.jpg

 

 

 

こんにちは。Japanリージョンゲーム事業本部 ゲーム開発六部 プロデューサーのヌマタです。

 

 

 

 

妖刀あらしとふぶき 絶賛配信中ですので、是非プレイしてくださいね。

 

さて、Mobage Developers Blog上にUnityの記事が少ないなーと思ったのでちょっと書かせていただくことになりました。

昨今様々なゲームが登場してる中で、Unityゲームエンジンをよく使われているかと思います。

Unityは扱いやすい反面、ブラックボックス化している部分も多く、ちょっとしたことで躓いたりと大変です。

特に開発と動作確認がPC上で行えるため、スマートフォンの実機ではいろんなバグを踏んでしまうということが多々あります。

そんなわけで様々なWeb文献は探したけれどなかなか無い、Unityのスマートフォンにおける開発の初歩についてお話できればと思います。

今回は初心者がつまづきやすいAsset Bundleで注意すべき点やそのアセットの管理などに触れます。

※Asset Bundle の公式説明へのリンクはこちら

http://docs.unity3d.com/Manual/AssetBundlesIntro.html

 

1)Asset Bundleによるユーザ体験への影響

Asset Bundleとは、外部サーバーにデータアセットをおいて、アプリ内からダウンロードし利用することができるUnity独自のパッケージフォーマットのことです。

初期パッケージ容量を削減できる、アセットをスケール出来るなど聞く分には良いことづくめのような気がしますが、この機能にはいくつか気をつけるべきポイントがあります。

例えば、処理時間が長くなりがちであること。カードゲーム等でアセットをどこかのタイミングで一括でダウンロードするといった設計の場合、

この処理はメモリのallocateをガッツリやってるので負荷が高く、時間がかかりユーザーにストレスを与えがちです。

それを幾ばくか軽減しようとAsset Bundleを圧縮して配置し、ダウンロードすることを考えることもありますが、

そもそもスマホ端末上で解凍することもファイルサイズによっては重い処理となり、結果としてあまり改善されません。

サブスレッドで圧縮ファイルの解凍したり、そもそもファイルサイズを分割して小さくしコルーチンで処理を小分けするなどの設計がベターです。

また、Asset Bundleはそもそも圧縮された形式です。なのでAsset Bundleのデータをロードする際、つまりデコンプレスされる際、特定の条件下でメモリに全展開されるタイミングがあります。

これは特にメモリの少ないAndroidのスマホ端末などでは起動できない、動作が遅い、落ちるなどのバグを起こしてしまいます。

対応方法としてはアセットデータをファイル単位・細かい単位で配置し、必要になったタイミングでダウンロード&ロードできるように設計・実装するということが望ましいでしょう。

image2.png

2)アセットの管理

・データの分割単位について

先ほど軽くふれましたが、一つのアセットバンドルの中になんでもかんでもつめ込まないというのも重要です。

ファイルサイズが大きいものは、とにかく細かく分ける。データマスタに関連するものは、それを基軸にidでどのAsset Bundleから読み出すかなどして単位分けすることもできます。

image3.png

ここで一つの問題として管理の問題があります。

当然ユーザーフレンドリーなゲームを追求するのであれば前述の通り徹底的に細かい方が良いです。ただ分割の単位が細かすぎると、バージョン管理の対象数が膨大になり、管理工数が肥大化するため管理をある程度自動化するなどで対応しなければいけません。

ここは開発規模に応じてバランスを取るべき部分かと思います。

image4.png

・小・中規模な開発におけるバージョン管理

エンジニアが数名程度しかいない小規模なプロジェクト、更新を必要としないアプリであれば、データアセットとそれに対応したなんらかの文字列(ファイル名とtimestampのハッシュなど)のtxtファイル、つまりアセットの一覧リストを作成します。

クライアント側からは何らかのフックでAsset Bundleのリストを取得して、使うときはCRCチェックも行ってロードするなどすれば比較的容易に差分ダウンロードが実現できるかと思います。

中規模開発でメンバ習熟度もそれなりにある場合はJenkinsなどCIにインテグレーションしていまい、AssetBundleの作成から配置、そしてその管理リストの更新まで自動で管理してしまうことが本来的には望ましいです。少なくとも中規模以上の開発を行う際には、ヒューマンエラー防止のためにソースアセットからスクリプトでサーバーに自動配置できる仕組みを整えることが望ましいです。AssetのリストもテキストファイルではなくDB内部でマスタデータとしてバージョン管理自体を扱ってしまい、特定の通信のタイミングでマスターデータを取得して必要な部分のみクライアント側で更新できるようにしてしまいましょう。

(通信のタイミングは都度なのか、2時間に1度なのか等はゲーム側のスキーム次第で異なります)

CMSツール(Contents Management System)を作成し、適宜マスターツールとアセットのひも付けであったりを管理しやすくする、テスト・デバッグ時に確認・変更ツールを作成しておくなども重要です。

3)その他

他にもUnityの標準キャッシュ機構が希望のパフォーマンスを出さない場合に独自のキャッシュを組んだほうがいいケースがある、であるとか、

シーン遷移ではAwakeの中で必要以上に重い処理をしないほうが諸々の理由で落ちないであったり、

はたまたアセットバンドルではBGM・SEをストリーミング再生できない等で全てオンメモリになってしまうため、独自実装または外部ライブラリを利用すべきなど

いろいろなポイントがあります。

image5.png

Unityはとっつきやすいようにいろんな箇所がブラックボックス化されておりますが、いざ商用のアプリを創るとなると色々と使うのにコツが必要なゲームエンジンです。

思想的にはProgrammingが分からない人でも開発に携われる素晴らしい環境ではありますが、

個々の細かい点についてはチーム全体で、しっかりと潤滑に開発のPDCAが回るようにプロセス設計すると後々の開発効率がアップします。

 

以上、Unityの初歩的な部分について少しお話をさせていただきました。何らかUnityゲームを開発するにあたり参考になれば幸いです。

(これからやってみたいな〜という会社さまもUnityに是非トライしてみてください!)

 

参考

http://japan.unity3d.com/unite/unite2013/video

Unite Japanの動画は開発で困った時など、とても参考になりますので是非ご覧ください。