Unity5.6.5からUnity2018.2にアップデートする

# Unityバージョン 2018.2.0f2へ(途中で2018.2.21f1へ切り替え)


**はじめに言います。悪いことは言わないのでUnity2018.4系に上げるのをオススメします。**
Googleが2019年8月までにAndroidの64bit対応の必須化を呼びかけています。
(追記：Unity5.6以前の場合2021年8月まで伸びました https://pc.watch.impress.co.jp/docs/news/1164859.html)
それに伴い64bit対応がされているUnityバージョンに上げたいと思います。
Unity的にはUnity 2018.2をプレビューとして公開し、2018.3（2018年第4四半期に出荷予定）のフルリリースらしいので現状上がっている2018.2へのアップデートを目指していきます。
私がどのような対応をしているのか書きながら対応していきます。

↓Googleの呼びかけ
[Improving app security and performance on Google Play for years to come](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html)

↓Unityの対応
[Meeting Google Play requirements in the future](https://blogs.unity3d.com/jp/2017/12/20/meeting-google-play-requirements-in-the-future/)

#SDKなどの設定
設定の必要のない箇所も紹介していきます。

Android NDK	r10e → r13b

　![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/a2eb662c-c883-22a9-a0a9-1737a9143e7a.png)
まずNDKをr13bにします。

　![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/15f560bf-e606-eb69-7edb-0d83d26b5484.png)
OpenGLES3に対応するためPlayerSettingsでAuto Graphics APIにチェックを入れてみました。
心なしかUnityの動作が早くなったような、気がする。

　![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/29341cb9-2f81-b8da-f591-b58bd51b1ac5.png)

　アンチエイリアスの処理を追加。

# Android SDK などのバージョン

Android SDK Build-Tools 28.0.3
Android SDK Platform-Tools 28.0.1
Android SDK Tools 26.1.1
PlatformはAndroid4.1～Android9.0(API28)までインストール

他のバージョンでは動かない(ビルドできない)こともあるみたい。


## エラーの解消をしていきます

### **エラー1**

Windowsのエラーから見ていきましょうか。

```
error CS0117: `UnityEngine.Application' does not contain a definition for `isWebPlayer'
```

isWebPlayerは無くなったようですね。

>Application.platform == RuntimePlatform.WebGLPlayer

とすれば良いようです。

### **エラー2**

```
error CS0619: `UnityEditor.BuildTarget.WebPlayer' is obsolete: `WebPlayer has been removed in 5.4'
```

BuildTarget.WebPlayerもなくなったようですね。
そもそもサポートしてないようですね……。
消しちゃいましょう。
[Unity:BuildTarget](https://docs.unity3d.com/ja/2018.2/ScriptReference/BuildTarget.html)

### **エラー3**

```
error CS0619: `UnityEngine.RuntimePlatform.OSXWebPlayer' is obsolete: `WebPlayer export is no longer supported in Unity 5.4+.'
```

これも同じです。消します。
というか、なぜ5.4でサポート終了のハズのものが残っているのか……。

### **エラー4**

```
error CS1061: Type `UnityEngine.Playables.PlayableGraph' does not contain a definition for `rootPlayableCount' and no extension method `rootPlayableCount' of type `UnityEngine.Playables.PlayableGraph' could be found. Are you missing an assembly reference?
```

rootPlayableCountがなくなったんですかね？　
どうやら、もともとanimator.GetTimeを利用していたようです。
ローカルタイムの取得方法は無く、同じものを実装するのは大変そうだったのと
使っている箇所は1箇所だったので、担当者に話して別の実装方法で入れてもらうことにします。

### **エラー5**

```
 error CS0117: `UnityEngine.Caching' does not contain a definition for `enabled'
```
キャッシュが有効化どうかを取れなくなったようです。
WebPlayerしかキャッシュの有効/無効を切り替えられないので不要になったんだと思います。
消します。
[Caching.enabled](https://docs.unity3d.com/jp/460/ScriptRefererootPlayableCountnce/Caching-enabled.html)

### **エラー6**

```
error CS1540: Cannot access protected member `UnityEngine.RuntimeAnimatorController.RuntimeAnimatorController()' via a qualifier of type `UnityEngine.RuntimeAnimatorController'. The qualifier must be of type `AuctionTopController' or derived from it
```

RuntimeAnimatorController anime = new RuntimeAnimatorController();
これを
AnimatorOverrideController anime = new AnimatorOverrideController();
に変更。
そして、anime.runtimeAnimatorControllerを使うようにした。


### **エラー7**

```
error CS0234: The type or namespace name `iOS' does not exist in the namespace `UnityEditor'. Are you missing an assembly reference?
```
　iOSのネームスペースないみたいですね。
あ、ダウンロード忘れてました。
BuildSettingsで、ダウンロードします。

### **エラー8**

```
error CS0029: Cannot implicitly convert type `UnityEditor.Build.Reporting.BuildReport' to `string'
```

BuildReportの返り値が変わったようですね。
stringエラーが発生した場合、エラーメッセージを返します。
↓
BuildReportエラーが発生した場合、エラーメッセージを返します。

エラー内容が詳細になったようですが、具体的にコレまで何を返していたのかわからないので、
とりあえずToString()をつけて返すようにしました。

---
さて、いよいよエラーもなくなったので起動！　
と、思ったらエラーです。

### **エラー9**

```
InvalidOperationException: Header value contains invalid characters
```

Headerに無効な文字が含まれるらしい。
前までは普通にWWW関数は動いていたのでバグか、もしくは厳しくなったか。とりあえず調べていきます。

↓Unity2017ですが、カッコを識別できないらしいです。
https://github.com/parse-community/Parse-SDK-dotNET/issues/268

一応、()を置換するようにしました。

```
	private static string Escape (string s) {
		s = s.Replace ("(", "&#40");
		s = s.Replace (")", "&#41");
		return s;
	}
```
まだエラーがでました。
これだけが、問題じゃないとすると他にも禁止文字が有るのでしょうか？　
調査できました。
tokenの値になぜかEOFが入っていたようです。

```
	private static string Escape (string s) {
		s = s.Replace ("(", "&#40");
		s = s.Replace (")", "&#41");
		s = s.Replace("\0","");
		return s;
	}
```
と、すると動きました。
なんで、これまで動いていたんでしょうね？

さて今度こそ。
と思ったら次のエラーが出ました。

### **エラー10**

```
NullReferenceException: Object reference not set to an instance of an object
```

ぬるぽです。
WWW関数にてヘッダーがnullらしいです。
処理を見る限り、コレまではnullで動いていたようです。
コレを許容しない作りに変わったんだと思います。

```
WWW www = (header == null) ? new WWW (url, form) : new WWW (url, form, header);
```
このように実装。

### **エラー11**

```
Failed to erase object from ms_IDToPointer. It was not part of the set.
```

意味不明なエラー。
しかもエラー後、Unityがクラッシュする。
どこを探してもそれらしい資料が見つからず3日間も探した結果、
見つかったのが、こちらの投稿。(原因を探している間に投稿されたっぽい）
[Unity 2018.2.0f2 Crashing to Desktop with "Object is already loaded" errors.](https://answers.unity.com/questions/1529144/unity-20182f2-crashing-to-desktop-with-object-is.html)
一応Unity側で修正されたようです。

クラッシュした時にでたログを見る限り、どうやらUI周りが怪しいとわかりました。
レガシー機能となっておりGUI Layerを使用しており、そこでした。
一応機能は使えるので放置していましたが、このようなバグがあるようです。
怖いのでGUI LayerはCanvasに置き換えるべきですね。
エラーが出ない場合もありますが、そもそもサポート外なので置き換えたほうが良さそう。
一筋縄ではいかない修正箇所……。

追記：
移行の際にカメラのオブジェクトが壊れてしまっていた模様……。
旧プロジェクトからシーンとPrefabをコピーし直したら治りました。
この3日間一体私は何を……皆も気をつけようね！
古いシステムがあるとクラッシュするんですかね？
metaデータのせいで参照エラーになることもあるようなので
前のプロジェクトから移行するときはmetaデータをちゃんと削除しよう。

### **エラー12**
CRIWAREでエラー。
こちらを参考にアップデート。
[ADX2LE情報](https://www53.atwiki.jp/soundtasukeai/pages/22.html#id_75893aff)

---

描画周りが壊れているところがありあますが、とりあえず実機（Android)にて動きました。

次にメインの64bit対応ビルドの方法をしていきます。
**64bit対応ビルドの方法**
http://d.hatena.ne.jp/nakamura001/20180717/1531822914

---

### **エラー13**

　再びCRIWAREでエラー。

```
DllNotFoundException: Unable to load DLL 'cri_ware_unity': The specified module could not be found.
```

　原因が判明。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/94d20f87-fe7a-06b5-361a-be57e324a8c1.png)
https://twitter.com/OrotiYamatano/status/1022700662365278209

　![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/e7b79182-43e1-1b35-ad6e-52439b1c88fd.png)
https://twitter.com/piggest965/status/1022702917965340673

ぴぎーさん！　ありがとうございます！　
最新版に対応されてなかったので、CRIWAREへ問い合わせすることになりそうです。

追記：
2018年9月末に公式リリースされた。公式マニュアルにしたがって追加しよう。

---
　CRIWAREの問い合わせ中にiOSの方をデバックできるように修正を初めます。

---
### **エラー14**

Xcodeでビルド中にエラー
P31Unity.mm search not found
どうやら課金プラグイン。
一旦保留。多分アップデートすれば治る


### **エラー15**
```
error CS1070: The type `UnityEngine.EllipsoidParticleEmitter' has been forwarded to an assembly that is not referenced. Enable the built in package 'Particles Legacy' in the Package Manager window to fix this error.
```
EllipsoidParticleEmitterの関数が死んだようです。
機能としては残っているようですが、スクリプトから呼び出せない様です……。
新しいパーティクルエフェクトに変えないといけないですね。
とりあえず、注釈化します。

何やら、こちらが使えそう。
https://forum.unity.com/threads/release-legacy-particle-system-updater.510879/


### **エラー16** 

アンドロイドリリースビルド時なぜか署名ができない。

~~Android 7.0から署名にSHA-256が必要になったらしい。~~

android card viewの古いjarに原因がある？ようでした。
古いgoogleのjarを削除し、gradleにてgoogle play services周りのライブラリを一新することで動くようになりました。
google play servicesは動かないものがあるようなので注意が必要のようです。
後、SDK周りのバージョンで動くもの動かないものがあるようです。
私は以下のようにしました。

Android SDK Build-Tools 28.0.3
Android SDK Platform-Tools 28.0.1
Android SDK Tools 26.1.1


### **エラー17**
request.isErrorがエラー。
リクエスト関係。
request.isNetworkErrorで修正。


### **エラー18(後で修正します)**
ビルド後、Androidネイティブでエラー。
ClassNotFound
一旦エクスポードビルドをしてAndroidStudioで読み込むとエラー内容が判明。
どうやらAssets\Plugins\Android\libsに入ってるネイティブのライブラリ(jar)を読み込んでいない。

調べた結果Multidexがデフォルトでtrueになるようでした。

APKには64K 参照制限があることが判明！
https://developer.android.com/studio/build/multidex
http://shinonome.hatenablog.jp/entry/2015/08/19/233716

MultiDexを使わない場合は以下の設定
---

``` .gradle
android {
    defaultConfig {
         multiDexEnabled false
    }
}
```

MultiDexを使う場合は以下の設定(Android 5.0以降と以前どちらもビルドする場合)
---
``` .gradle
android {
    defaultConfig {
         multiDexEnabled true
    }
    dexOptions {
        preDexLibraries false  //Android5以前はデフォルトは使えないらしいのでfalseにする
    }
}


dependencies {
    implementation 'com.android.support:multidex:1.0.3' //Android5以前はライブラリがないので追加
}

```

AndroidStudioにてFile>Settings>Build,Execution,Deployment>Instant Runで
Enable Instant Run~のチェックを外す。(Android5移行ではMultiDexを有効にするとInstant Runと競合するらしい)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173560/d5c5b707-acd5-997a-2e48-03eb28e44b55.png)

アンドロイドマニュフェストの対応も必要
https://qiita.com/yyama2/items/9701a45556e90580c35d

---

あと、なぜかshrinkResourcesをtrueにすると不要なファイルを削除してくれるはずが、必要なファイルも消してしまっているようなので泣く泣くfalseにすることにした。

``` .gradle
android {
    buildTypes {
        debug {
            shrinkResources false
        }
     }
}
```

### **エラー19**

Could not find com.android.tools.build:aapt2とエラーが出たのでallprojectsを以下のように変更。
参考サイト→https://stackoverflow.com/questions/50279792/could-not-find-com-android-tools-buildaapt23-2-0

``` .gradle
allprojects {
    repositories {
        google()
        jcenter()
        flatDir {
            dirs 'libs'
        }
    }
}
```

### **osファイルの一新**

Android 64bit の対応をするためにOSファイルの追加が必要です。
なんだかんで言ってUnityバージョンアップでココが一番面倒です。
なぜなら、場合によってはライブラリを作っているソフト元に問い合わせないと手に入らないからです……。


### **エラー20**

Androidのいくつかの端末の実機でのみで落ちる現象が発生。
出るエラーはOut of Memory。

Build SettingsのCompression Methodを圧縮形式をしていしていると発生する模様。
多分Unityのバグ。
Defaultに変更することで対応。

(Gradlebuild時にOut of Memory(unable to create new native thread)でBuild出来ないバグがあったりするが、GradleVersionが違うものだと上手くビルド出来たりする。
エクスポートビルドするとAndroidStudioで参照されているGradleVersionを使うようになるのでビルドが可能になる場合があり)

### 随時執筆していきます