Unity2017から2019にアップデートした際の備忘録

##はじめに

[QualiArts Advent Calendar 2020](https://qiita.com/advent-calendar/2020/qualiarts) の5日目の記事になります。

こんにちは。QualiArtsでUnityエンジニアをやっている@meshiaです。

今回はUnityのバージョンを2017から2019にアップデートした際に対応したことについてまとめてみました。
近年ゲームアプリ開発でUnityを採用しているプロジェクトは多くなってきていますが、
既に運用フェーズに入っているプロジェクトだと、
破壊的な変更を避けて、なかなかアップデートに踏み切れないプロジェクトも少なくないと思います。
2017から2019という限定的な状況ではありますが、アップデートの参考になれば幸いです。

なお、アップデート自体は現在進行中で、 調査中の事項も多いため、
**参考程度**にすることを強くオススメします。

##環境

**◯Unityのバージョン**
`2017.4.40f` → `2019.4.9f`

UnityはLTS版とよばれるバージョンがあります。
LTSとは、`Long Time Support`の略で長期サポート版という意味です。
リリースから2年間は`x.4.xf`というパッチバージョンリリースによる不具合修正がされているようです。
今回アップデートする`2019.4.9f`はLTS版にあたります。

**◯バージョン選択 参考**
[堅実なUnityバージョンの選び方](https://www.slideshare.net/UnityTechnologiesJapan002/unity-180202373)

##アップデート経緯

ここら辺はバックグラウンド的な話が入るので飛ばしていただいてもかまいません。
細かい理由はありますが、以下の2点の理由からアップデート判断に踏み切っています。

**◯サポートが切れる**
Unity2017は、2018月4月24日に`Unity 2017.4.1`がリリースされており、
ちょうど今年(2020年)でサポートが切れるため

**◯ARFoundationが使いたい**
プロジェクトでAR機能の開発をすることになり、ARFoundationを採用しました。
2017.4.40fではサポートされていないのと、
ARFoundation自体は[2018年12月14日に初出](https://forum.unity.com/threads/arfoundation-1-0-0-preview-22-released.598261/)のようですが、
2019年になって挙動が安定するバージョンがリリースされたはじめたため、`2019.4.9f`を採用しました。

##ArgumentException: Requested value ‘X86’ was not found.

[参考](https://stackoverflow.com/questions/56309148/argumentexception-requested-value-x86-was-not-found/57632412#57632412)

```
ArgumentException: Requested value 'X86' was not found.(以下略)
```

Google Play Service関連が古かった？
[DL(即時で始まるので注意)](https://github.com/googlesamples/unity-jar-resolver/raw/v1.2.158/external-dependency-manager-1.2.158.unitypackage0)で解決



##Allow unsafe Code

Unity 2018.1f あたりから`Project Settings -> Player -> Other Settings`に増えた項目です。
デフォルトでOffなため、アップデート直後だとunsafeを使用しているスクリプトでエラーが出力されます

![スクリーンショット 2020-12-05 1.51.50のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878185/39b37e1d-40d8-94f2-3867-79d7c8f9a574.png)

##EditorGUILayout.ColorFieldの引数変更
EditorGUILayout.ColorFieldの引数が変わりました。([公式リファレンス](https://docs.unity3d.com/ja/current/ScriptReference/EditorGUILayout.ColorField.html))

`Obsolete public static Color ColorField (GUIContent label, Color value, bool showEyedropper, bool showAlpha, bool hdr, ColorPickerHDRConfig hdrConfig, params GUILayoutOption[] options);`


上記の呼び方は廃止されているので引数の指定を変える必要があります。

##PBXProject.GetUnityTargetName()の廃止

PBXProject.GetUnityTargetName()は廃止されているので、対応が必要
定数で`"Unity-Iphone"`を定義するか、Guidを知りたい場合は`PBXProject.GetUnityMainTargetGuid`で代用

[参考](http://www.kokosoft.pl/forums/topic/ios-unity-2019-3-0b11-pbxproject-getunitytargetname-is-deprecated/)

##Rider関連のエラー

エディタでRiderを採用している場合に発生しうるエラーです。([参考](https://unity-yuji.xyz/unity-2019-2-loads-it-directly-from-rider-installation-to-disable-this-open-riders-settings/))

```
Please delete /Users/XXXX(中略)/Assets/Plugins/Editor/JetBrains/JetBrains.Rider.Unity.Editor.Plugin.Repacked.dll. Unity 2019.2+ loads it directly from Rider installation. To disable this, open Rider’s settings, search and uncheck ‘Automatically install and update Rider’s Unity editor plugin’.
```

Assetsフォルダ以下のJetBrains（Rider）プラグインファイルを削除することで解消。

##Firebaseのエラー

プロジェクトでFirebaseを利用している場合は以下のエラーが発生する可能性があります。([参考](https://satococoa.hatenablog.com/entry/2017/10/25/160043))

```
The type 'Task' exists in both 'Unity.Tasks, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' and 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' [Assembly-CSharp]

```

・.NET3以前はなかったメソッドをFirebase側が用意してくれていたため、
・.NET4であるUnity2019はなので、Firebase側を.NET4対応版にアップデートする必要があった
・使用しているFirebaseプラグインをアップデートすることで解消

##UnityFramework

Unity 2019.3より、UnityFrameworkが登場しています。([公式ブログ](https://blogs.unity3d.com/jp/2019/06/17/add-features-powered-by-unity-to-native-mobile-apps/))
xCodeプロジェクトのFramework追加周りを処理している部分に関して修正が必要になる可能性があります。

・UnityFrameworkはEmbedded Frameworkとして扱われる
・Frameworkを追加するTargetを"Unity-Iphone"から"UnityFramework"に変更する必要がある

ここらへんはプロジェクトによって対応が変わってくると思うので詳細は割愛します。

##まとめ

Unityアップデート作業は、運用の長く続くのプロジェクトにおいて、おざなりにされるケースが結構あります。
このようなレアケースでも参考になれば幸いです。
運用形態などによって、解消する必要のあるエラーや対応すべき事項は変わってくるので、
あくまで一例として参考にしていただければと思います。