Unityプロジェクトをアップグレードした時に起きた問題

#はじめに
今回はUnity2017のプロジェクトをUnity2020にアップグレードした時に起きたトラブルを
シンプルなプロジェクトを作り検証した結果をまとめてみました。
ただ、結局のところ何が起こっているのかまでは調べてはいないのであしからず…

#試した環境
Windows10
Unity2017.4.10f1（元のプロジェクト）
PlatformはiOS
※ 新規プロジェクト作って、Assets直下に以下のスクリプトを仕込んでいます。

```csharp:Test.cs
public class Test
{
	public System.Reflection.Emit.ILGenerator test;
}
```

Unity2019.2.21f1（段階的にアップグレードするのに使用）
Unity2020.2.1f1（アップグレードしたいバージョン）
※ Unity2020を起動する時、エラーがあると`Enter Safe Mode?`と出るので Ignoreで対処。

#アップグレードした流れ
##パターン１（成功例）
① Unity2017.4.10f1のプロジェクトをUnity2019.2.21f1で起動。
② 起動すると以下のようなエラーが出る。

```
Assets\Test.cs(3,32): error CS0234: The type or namespace name 'ILGenerator' does not exist in the namespace 'System.Reflection.Emit' (are you missing an assembly reference?)
```
③ Api Compatibility Level* を .NET 4.x に変更することでエラーは解消。Unityを終了する。
④ Unity2019.2.21f1になったプロジェクトをUnity2020.2.1f1で起動。
⑤ 起動すると以下のようなエラーが出る。
  ※ この時、Api Compatibility Level* は .NET Standard2.0 に戻っている。

```
Deterministic compilation failed. You can disable Deterministic builds in Player Settings
Library\PackageCache\com.unity.multiplayer-hlapi@1.0.2\Editor\Tools\Weaver\AssemblyInfo.cs(22,28): error CS8357: The specified version string contains wildcards, which are not compatible with determinism. Either remove wildcards from the version string, or disable determinism for this compilation
```
⑥ これを修正するためにPackageManagerのIn ProjectでMultiplayerHLAPI 1.0.2 を 1.0.8に更新。
　あるいはMultiplayerHLAPIがいらなければ削除する。エラー解消。
  ※ MultiplayerHLAPIが存在する場合、1.0.8に更新する前に Api Compatibility Level* を
　 .NET 4.xに変更すると以下のエラーが出るが、プロジェクトを起動し直すと消える。

```
Microsoft (R) Visual C# Compiler version 3.5.0-dev-20359-01 (8da8ba0c)
Copyright (C) Microsoft Corporation. All rights reserved.
```

##パターン２（失敗例）
※ パターン１の流れでUnity2019.2.21f1でエラーを無視した時の流れです。
① Unity2017.4.10f1のプロジェクトをUnity2019.2.21f1で起動。
② 起動すると以下のようなエラーが出る。

```
Assets\Test.cs(3,32): error CS0234: The type or namespace name 'ILGenerator' does not exist in the namespace 'System.Reflection.Emit' (are you missing an assembly reference?)
```
③ エラーはひとまず無視してプロジェクトを終了。
④ Unity2019.2.21f1になったプロジェクトをUnity2020.2.1f1で起動。
⑤ 起動すると以下のようなエラーが出る。

```
Deterministic compilation failed. You can disable Deterministic builds in Player Settings
Library\PackageCache\com.unity.multiplayer-hlapi@1.0.2\Editor\Tools\Weaver\AssemblyInfo.cs(22,28): error CS8357: The specified version string contains wildcards, which are not compatible with determinism. Either remove wildcards from the version string, or disable determinism for this compilation
```
⑥ これを修正するためにPackageManagerのIn ProjectでMultiplayerHLAPI 1.0.2 を 1.0.8に更新。
　あるいはMultiplayerHLAPIがいらなければ削除する。
⑦ 以下のエラーが出る。

```
Assets\Test.cs(3,32): error CS0234: The type or namespace name 'ILGenerator' does not exist in the namespace 'System.Reflection.Emit' (are you missing an assembly reference?)
```
⑧ Api Compatibility Level* を .NET 4.x に変更しても解決しない。
⑨ 解決方法不明。

##パターン３（失敗例）
① Unity2017.4.10f1のプロジェクトをUnity2020.2.1f1で起動。
② 起動すると以下のようなエラーが出る。

```
Assets\Test.cs(3,32): error CS0234: The type or namespace name 'ILGenerator' does not exist in the namespace 'System.Reflection.Emit' (are you missing an assembly reference?)
```
③ Api Compatibility Level* を .NET 4.x に変更しても解決しない。
④ 解決方法不明。

#パターン１とパターン２の比較
プロジェクトで最終的に何が違っているのかを調べ、Libraryフォルダ等を削除し、全てのファイルを比較。
するとProjectSettingsフォルダの`ProjectSettings.asset`に以下の違いがありました。
![2021-01-15_19h04_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/837803/7e4ee76e-340f-d4db-2331-94b07d46648d.png)
左がエラーが出ないプロジェクトで、右がエラーの出るプロジェクトです。
Unityエディター内ではこの項目がどこで変更出来るかは分からなかったのですが、直接書き換えてから
エラーが出ていたプロジェクトを開くとエラーが出なくなりました。
※ パターン２の検証直後だと、apiCompatibilityLevelPerPlatform: {} になってたので何かを触ると iOS: 6
　 は付いたみたいです。.NET 4.x 辺りを触って戻してとかした時かな…？

#結論
とりあえず、Unity2017.4.10f1でSystem.Reflection.Emitを使用しているプロジェクトをUnity2020.2.1f1に
アップグレードする場合、Unity2019.2.21f1で起動して .NET 4.xに変更、Unity2020.1.1f1で起動すれば解決する。
※ 細かいバージョン誤差での挙動は不明、Unity2019で自動的に入るパッケージは使ってなければ削除でもOK。

まあ、Unityバージョンの開きが大きいので何かしらのトラブルは起こるとは思いますが
同様の現象が起きた人の参考になればと思います。

#追記
そういえば、そもそもアップグレード以前にどうなのか調べてなかったので調べたら
Unity2019.4.16f1(iOS) => .Net 4.x に変更するとエラーは出ない。
Unity2020.2.1f1(iOS) => .Net 4.x に変更してもエラーは出る。
よくよく見ると、Unity2020.2.1f1で.Net 4.x に変更した時に mscorlib.dllの参照が出来てない気がする…
まあ、参照出来てないよっていうエラーが出てるので出来てないのは当然だと思うけど。
(2021/01/27)