Posted at

運用中のプロジェクトでUnityのバージョンアップをする際にAssetBundle絡みで詰まった事

More than 1 year has passed since last update.


概要

運用中のプロジェクトでUnity 5.3から2017.4へバージョンアップをする際に、AssetBundle絡みで詰まった事などを書きたいと思います。

iPhoneX対応などで急遽アップデートを余儀なくされたプロジェクトの担当者の方々の救いになれば…


バージョン選定について


  • 5.4, 5.5あたりは割とバグが多くて地雷なので、やめておいたほうが良い

  • 5.6と2017.4は実はあんまり変わらない説


    • 厄介なAPIの仕様変更などは大体5.6までで、アップデートの工数には大差無い



  • 2017.4は2020年3月までサポートされる

以上の事から、今選ぶのであれば2017.4が最適なのかなと思います。

他にも、将来的にはGoogle PlayでAndroidの64bit対応も必須になる予定で、その時に恐らく2017.4か2018.3以降にアップデートする必要性があるので、長い目で見ると今のうちに2017系に上げておくのが良いのかなと…

参考:Meeting Google Play requirements in the future – Unity Blog


We are also happy to share that our native 64-bit support for Android is in its final development stage and is being tested internally. We aim to make it public in Unity 2018.2 as a preview and expecting it to mature in time for full release in 2018.3 (which is expected to ship in Q4 2018), well before the requirement is enforced by Google Play.



AssetPostProcessorの仕様変更

5.5, 5.6くらいでAssetPostProcessor周りのAPIが結構変わっています。

これのせいで、新しいバージョンで開くとアセットが意図しない設定で読み込まれ、Reimportでめちゃくちゃ時間が掛かったり、metaファイルに含まれている情報(Multiple Spriteの分割情報など)が失われたりします!!

そのため、アップデートの際は以下の手順を踏むことにしました。


  1. AssetPostProcessorを使っているコードを完全に修正する

  2. 一度全てのアセットのmetaファイルを前バージョンの状態に戻す

  3. 全てのアセットをReimportする

AssetPostProcessor周りを修正する場合は、修正しながらReimportを繰り返し、前のバージョンのインポート設定と見比べて変わっていないかチェックしながら行うと確実です。

左が5.3、右が2017.4の画像です。インポート設定に差異が無いことが確認できます。


Obsolateになったプロパティ

TextureImporter.lightmapTextureImporter.normalmapがobsoleteとなっています。

これ、なんとプロパティに代入しようとすると勝手にTextureTypeがDefaultに変わったりするので地雷です。

非推奨になったプロパティはアクセスしないようにしておきましょう。


TextureImporterFormatにDefault設定が無くなった

5.3ではDefault設定でテクスチャの圧縮形式を設定することができましたが、5.6くらいからはプラットフォームごとにしか設定できなくなりました。

プラットフォームによって対応形式が異なるので、当然のAPI変更ですね。

そのため、TextureImporter.textureFormatを使って設定していた場合は、プラットフォームごとに設定するように書き換える必要があります

参考:画像フォーマットを一括で設定したい【最新】 - Roba Memo - 素人のUnity覚書と奮闘記


AssetBundleのビルドについて

5.3と2017.4ではAssetBundleの互換性が無いため、全てのAssetBundleをビルドし直す必要があるのですが、その際に前のバージョンでビルドしたAssetBundleを上書きする形でビルドしようとするとイマイチ上手くいかない可能性があります!!

AssetBundleはビルド先に既にファイルが存在する場合にインクリメンタルビルドしてくれる機能があるのですが、どうもそれによって上手くいかないことがあったりします。(色々と試行錯誤していたので、何が原因なのかはハッキリと分からないのですが…)

そのため、完全な新規ビルドになるように、以下のいずれかの状態でビルドすると確実です。


まとめ


  • AssetPostProcessorの仕様変更が辛かった

  • AssetBundleはForceRebuildしておくと安心

何度もビルドし直してめちゃくちゃ時間かかってしんどかったので、少しでもその手間が省けると幸いです…