コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【greegdm01】「リアルタイムマルチプレイのタワーディフェンス『ポイッとヒーロー』のUnity5移行事例」メモ

http://greegdm01.peatix.com/

発表資料

ポイッとヒーロー紹介

https://itunes.apple.com/jp/app/poittohiro-4ren-xie-litawadifensu/id872812137?mt=8&uo=4&at=10l8JW&ct=hatenablog

テーマ

Unity4からUnity5

Unity5に移行した理由

  • iOSの64bit対応問題
    • Unity4.6よりUnity5のほうが対応が早かった
    • いずれメジャーバージョンアップするのなら、このタイミングですべきと判断

移行時にハマったポイント

  • アニメーションが動かなくなった
  • 3Dモデルが白くなった
  • Androidでタッチが効かなくなった
  • Android実機で全体的に重くなった

アニメーションが動かなくなった

  • エラー animationがないよ
The name `animation` does not exist in the current context
  • Unity5からanimationプロパティがなくなった
    • GetComponent()を使う
// 旧コード
// Animation anim = animationl
// Unity5でのコード
Animation anim = obj.GetComponent<Animation>();
  • エラーは消えたが、一部の位置を動かすアニメーションの挙動がおかしい
  • Unity5の新機能:GenerateRootMotionCurves
    • 下記設定でアニメーションで移動できる
      1. 「Generate Root Motion Curves」を選択する
      2. 「Apply Root Motion」をオンにする
  • GenerateRootMotionしていないのに、ApplyRootMotionしている場合、移動せず、その場でアニメーションする
    • Unity4のAnimatorはデフォルトでApplyRootMotionにチェックが入っているので、移行時に動かなくなる
    • AnimatorのApplyRootMotionのチェックを外したら直った

3Dモデルが白くなった

  • ライティングがおかしい
  • Unity5からシェーダーのライトの計算が変更
    • 光の強度で2xの乗算を行わなくなった
    • それに伴い、互換性を保つためライトは自動で2倍の明るさに
  • カスタムシェーダを使っている場合は、手動で「光の強度で2xの乗算を行わなく」しないとライト2倍の影響で、白くなってしまう
    • カスタムシェーダーの光の強度を2倍している部分を修正する
c.rgb = s.Albedo * _LightColor0.rgb * (diff * atten * 2);
c.rgb = s.Albedo * _LightColor0.rgb * (diff * atten);

Androidでタッチが効かなくなった

  • Android端末で全てのタッチが効かなくなった
    • AndroidManifest.xmlのForwardNativeEventsToDalvikのvalueをfalseに変更
<!--旧コード-->
<meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
<!--Unity5でのコード-->
<meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" />

Android実機で全体的に重くなった

  • Android端末で全体的にFPSが低下
    • 情報が少なく、原因不明のためUnityのプロファイラ(実機)で地道に調査
  • CPUのスパイクが多発
    • Loading.LoadFileHeaders
  • Loading.LoadFileHeaderの正体
    • Resources.Load
      • Unity5からResources.Loadの挙動が変わった?
  • Resources.Loadの速度比較(Android実機)
for (int i = 0; i < 100; i++){
    prefab = Resources.Load("Cube") as GameObject;
}
  • 2回目以降のResources.Loadが重い
    • キャッシュが効いてない?
  • Resources.Loadをオーバーラップして、オンメモリのキャッシュに乗せる
// Load(Overwrap&キャッシング)
static public UnityEngine.Object Load( string path )
{
    if ( !cache.ContainsKey( path ) )
    {
        cache[ path ] = UnityEngine.Resources.Load( path );
    }
    return cache[ path ];
}

余談 Unityのパフォーマンス

  • Unityのパフォーマンスについての常識は日々更新される
    • 中身がブラックボックスだからこそ最新版でベンチマークをとることが大事

おまけ

Unity5.1へ

  • 現在ポイッとヒーローではUnityを再度バージョンアップ中
  • Unity5.0.2p3→Unity5.1.2p1

Unity5.1にするメリット

  • iOSの実行ファイルサイズが減少
    • Unity5.0.2p3:98.6MB
    • Unity5.1.2p1:69.2MB
  • 約30MBのサイズ減少
    • メモリに優しい

Unity5.1でハマった点

  • モデルのライティングが壊れたり一部のテクスチャが貼られない現象
    • Automatic Graphics APIのチェックを外して、OpenGLES2を最優先に
  • Unityはバージョンアップの度に、PlayerSettingsの内容がひっそりと変わることがあるので要チェック

まとめ

  • 運用中のプロダクトでもUnity5に移行することは難しくない
    • 今すぐ決断し、快適なUnity5生活を