Unityの最新版である「Unity 5」では、より高い表現力を持った作品の開発を可能にする多くの新機能が搭載されている。ビジネスとしてUnityによるゲームを作っている開発者にとっては魅力的な一方、以前のバージョンで作った作品が問題なく動作するかどうかは極めて重要な問題である。複数のバージョンに対する開発、保守、サポート体制を維持し続けることは、人的リソース面、コスト面の双方でビジネスに大きなインパクトを与えるためだ。
Unite 2015では、コロプラの技術開発チームに所属する池田洋一氏が登壇。同社のプロダクトである『白猫プロジェクト』をUnity 4から5へ移行した事例を通じて、その中から得られた知見や、発生する問題への対処方法を紹介した。実際に移行に取り組んだ現場の「生の声」を聞けるセッションとあって、多数の来場者はメモや写真を撮りながら熱心に聞き入っていた。
同社では、以前、iOSのバージョンアップで画面の回転処理の変更が必要になった際、『スリングショットブレイブス』というゲームにおいて、Unityのバージョンを上げる作業を行ったという。結果的に、複数バージョンのアセットバンドルを管理することになり、チェックコストの増加などから大変な苦労をしたそうだ。
『白猫プロジェクト』は、これまでUnity 4.5で作成されていたが、4.6.2以降ではiOS向けの64bit対応が行われており、そのサポートに合わせて「今後、バージョンアップが必要になる可能性を考慮して、できる限りバージョンを上げておく」方針を採ったことが、Unity 5への移行を進めるきっかけになったという。実際の問題として、Unity 5では4から多くの仕様変更が行われており、細かい部分での処理変更やバグ対応など、かなりの作業が必要になっているようだ。
池田氏は、Unity 4から5への移行プロセスとして「エラーを取る」「うまく動かないところを直す」「(Unityの)新しいバージョンが出るのを待つ」の3つを挙げた。
まず「エラーを取る」というのは、バージョンアップで仕様が変更されたために発生するエラーを直していく作業になる。最初に問題になるのは、cameraやrigidbodyなどにおいて、小文字によるアクセサー系がなくなっていることだ。これについては、「API Updater」と呼ばれるツールで自動的に修正が可能になっている。ただし、この際にも一点問題があり、「AddComponent(String typename)」のコードをこのツールで自動アップデートすると、Unity Editorでは実行できるが、端末向けにビルドした際に実行ができないコードが生成されてしまうという。この問題を回避するためには「System.Type.GetType("Typename")」メソッドを利用して、あらかじめタイプを取得しおき、それを引数にして「AddComponent」を呼び出すという処理に書き換えておく必要があるという。
その他一部のメソッドについて、例えば「InteractiveCloth」は「Cloth」、「ClothRender」は「SkinnedMeshRenderer」といった形で変更が行われており、その利用方法にも変化(例えば、「Cloth」では頂点固定の方法が変更されている)がある。また、TextureFormatの一部が削除、AnimatorStateMachineのGetStateMachineが配列アクセスに変更、BB10Playerの削除などの変更が行われているため、エラーを確認しながらその都度直していく作業が最初の段階で必要になる。
次の段階は、コード上はエラーが出ていなくても、開発者の意図通りの動作をしていない部分を修正していく作業だ。『白猫プロジェクト』においても、複数の修正が必要になったという。以下に、その一部と、実際の対処方法について紹介する。
その他にも、「厚みのない板にモーションが設定されたキャラクターを表示させた場合に表示が崩れる」という不具合があったという。これはiPhoneだけで起こる現象で、場合によってはiOS自体をクラッシュさせる重大なものだった。調査した結果、この不具合はOpenGL ES 3.0,Metalでのみ発生していたためOpenGL ES 2.0のみにすることで回避できることが分かった。しかし「根本的な原因は不明」という。その他iOSでは「DynamicBatchingで強制終了する」という、同じく原因不明の不具合があり、こちらも機能をオフにすることで対応したという。
池田氏が「致命的だった」と話すのは「CharacterController」の挙動そのものが変更されていた点だ。具体的には、キャラクターの衝突判定が変わってしまっていたため、マップ上に設けていた「仕切り」を、主人公キャラクターが全て「乗り越えて」動き回れるようになってしまったのである。これについては、全ての「SphereCollider」を「CupsulCollider」に変換することで対応した。「SphereCastでチェックする方法もあったが、できるだけプレーヤーは修正しないようにした」(池田氏)という。
また、シーンに適用したLightMapについて「動的切り替えができない」という問題も起きた。これについて、『白猫プロジェクト』では冒頭のカットシーンでのみLightMapを使っていたため、使わない方式に変更したという。「今後は3Dツール上でLightMapを付けてしまい、UnityのLightMapは使わない方向も検討している」という。
ここまでの作業で対応が不可能なバグや仕様については「(Unityの)新しいバージョンが出るのを待つ」ことになる。『白猫プロジェクト』の移行作業においては、「Animationにおいて、マテリアルのαアニメーションが反映されない」というバグが発見され、これについてはすでにリポートを行って修正を待っている段階だという。
また、Unityの「IL2CPP」(C#をC++に変換する技術)を利用してiOS 32/64bit両対応のアプリを作成した場合、バイナリサイズが非常に大きくなってしまうという仕様上の問題も残っている。Unity 5版の『白猫プロジェクト』では、IL2CPPでアプリを作成した場合、サイズが200MB近くに達したという。App Storeでは100MBを超えるサイズのアプリはWi-Fi経由でしかダウンロードできないため、大きな問題になる。Unity側でも、この問題は把握しており、現時点ではUnity 4のパッチベースで対応が続いている。他のアプリでは「4.6.4p2」で「4.6.2」と比較して半分以下のサイズになっているという実績もあるため「5でも対応されるのを待ちたい」とする。
池田氏は最後に、Unity 5版『白猫プロジェクト』について、「カラー(アルファ)アニメーションのバグ」「IL2CPPのバイナリサイズ削減」「LightMapへの対応についての社内方針」といった課題がクリアされれば、リリースが可能になるだろうという見解を示した。
Copyright © ITmedia, Inc. All Rights Reserved.