Version: 2017.2
自動 API アップデーターの使用
Unity 2017.1 へのアップグレード

Unity 2017.2 へのアップグレード

このページには、 2017.2 に含まれる変更のうち、以前のバージョンからアップグレードした場合に既存のプロジェクトに影響を及ぼす可能性があるものを掲載しています。

これには例えば、以下も含まれます。

  • 再ベイクが必要になる可能性のある、データ形式の変更

  • 既存の関数・パラメーター・コンポーネントの値の意味や挙動の変更

  • 非推奨になる関数や機能(代替方法も掲載)


MonoBehaviour がエディター内でゲームオブジェクトに追加された際に MonoBehaviour.OnValidate が呼び出されるようになりました。

MonoBehaviour.OnValidate は、シーンの読み込み時や、ゲームオブジェクトの複製の作成時、またインスペクター内で値が変更された時に呼び出されます。今回はこれに加え、エディターでゲームオブジェクトに MonoBehaviour を追加した時にも呼び出されるようになりました。


Scripting: InitializeOnLoad コールバックがデシリアライズ後に実行されるようになりました。

InitializeOnLoad のコールバックのタイミングが変更されました。以前の実行タイミングでは、 Unity API の呼び出し時に既存のシリアライズ済オブジェクトに関して無効なオブジェクト ステートを発生させる可能性がありましたが、今回のアップグレードにより、デシリアライズ後、全てのオブジェクトの作成後に実行されるようになりました。オブジェクト作成の一環としてデフォルトのコンストラクタが必ず実行される必要があります。この変更により、(今まではオブジェクト コンストラクタの前に InitializeOnLoad が呼び出されていましたが、) InitializeOnLoad 静的コンストラクタの前にオブジェクト コンストラクタが実行されるようになりました。

[System.Serializable]
public class SomeClass
{
    public SomeClass()
    {
        Debug.Log("SomeClass constructor");
    }
}

public class SomeMonoBehaviour : MonoBehaviour
{
    public SomeClass SomeClass;
}

[InitializeOnLoad]
public class SomeStaticClass
{
    static SomeStaticClass()
    {
        Debug.Log("SomeStaticClass static constructor");
    }
}

このリザルトは以前は以下のようになっていました。:
SomeStaticClass static constructor (InitializeOnLoad)
SomeClass constructor (object constructor)

変更後は以下のようになります。
SomeClass constructor (object constructor)
SomeStaticClass static constructor (InitializeOnLoad)


BC5 形式に対応する新しい種類の法線マップ

これまで Unity は RGB 法線マップまたはスウィズルされた AG 法線マップ( x がアルファチャンネルで y が緑チャンネル)のみの各種圧縮形式に対応していましたが、 RG 法線マップ( x が赤チャンネルで y が緑チャンネル)にも対応になりました。 UnpackNormal シェーダー関数がアップグレードされ、 RGB ・ AG ・ RG 法線マップをシェーダーバリアントの追加なしで使用できるようになりました。 UnpackNormal 関数は、法線マップの未使用チャンネル が 1 に設定されていないとこれを行うことができません。つまり、スウィズルされた AG 法線マップの場合は (1, y, 1, x) 、 RG の場合は (x, y, 0, 1) とエンコードされる必要があります。これは Unity の法線マップエンコーダーによって強制的に行われます。

Unity に修正を加えずに使用している場合はアップグレードの必要はありません。ただし、法線マップシェーダーやエンコーディングを独自に行っている場合は、スウィズルされた AG 法線マップを (1, y, 1, x) とエンコードする必要があるかもしれません。法線マップの解凍前に、スウィズルされた AG で法線マップを混合していた場合、 UnpackNormal ではなく UnpackNormalDXT5nm を使用しなければならない場合があります。


起動時に常にエディター内でプリコンパイル済のマネージド アセンブリ( .dlls )とアセンブリ定義ファイル アセンブリが読み込まれるようになりました。

他スクリプト内にコンパイルのエラーがある場合も含め、エディター起動時には常にプリコンパイル済のマネージド アセンブリ( .dlls )とアセンブリ定義ファイル アセンブリを読み込みます。これは、エディター拡張アセンブリが、プロジェクト内の他のスクリプトのコンパイルエラーに関わらず起動時に常に読み込まれなければならない場合に役立ちます。


HDR の Emission

事前計算済みのリアルタイム GI やベイク済 GI を使用している場合、以前のバージョンの Unity で Emission が強く設定されたマテリアルは、更に強く見える場合があります。これは値の上限がなくなったためです。以前使用されていた RGBM エンコーディングは、ガンマ空間で 97、線形色空間で 8 という効率的な限度値を提供していました。 HDR カラーピッカーの最大値は 99 であったため、見かけよりも強く設定されていたマテリアルがあることも考えられます。 アップグレード後は Emission カラーは True HDR 16 ビット浮動小数点値(限度は 64K)として GI システムに 渡されます。内部的にはリアルタイム GI システムは、これらの強い値を表現できる rgb9e5 Shared Exponent 形式を使用していますが、ベイク済ライトマップは、その RGBM エンコーディングの制約を受けます。ベイク済ライトマップ用の HDR は今後のリリースで追加されます。


VR から XR への名前の変更

UnityEngine.VR.* 名前空間が UnityEngine.XR.* に変更されました。名前に VR の含まれる全てのタイプも XR バージョンに変更されました。例えば UnityEngine.VR.VRSettings は UnityEngine.XR.XRSettings となりました。

API アップデーターは、既存のスクリプトやアセンブリを新しいタイプ名および名前空間に自動的に更新するように設定されています。 API アップデーターを使用したくない場合は、手動で名前空間とタイプの更新を行うことも可能です。

名前空間の変更

  • UnityEngine.VR -> UnityEngine.XR
  • UnityEngine.VR.WSA -> UnityEngine.XR.WSA
  • UnityEngine.VR.WSA.Input -> UnityEngine.XR.WSA.Input
  • UnityEngine.VR.WSA.Persistence -> UnityEngine.XR.WSA.Persistence
  • UnityEngine.VR.WSA.Sharing -> UnityEngine.XR.WSA.Sharing
  • UnityEngine.VR.WSA.WebCam -> UnityEngine.XR.WSA.WebCam

UnityEngine.VR タイプの変更

  • VRDevice -> XRDevice
  • VRNodeState -> XRNodeState
  • VRSettings -> XRSettings
  • VRStats -> XRStats
  • VRNode -> XRNode

VR.* プロファイラー エントリーも全て XR.* に変更されました。


UnityEngine.dll が、 UnityEngine モジュールごとに別々の dll に分割されました。

(全てのパブリック スクリプト API を含む) UnityEngine.dll が、それぞれエンジンの各種サブシステムを扱う、別々のコード モジュールに分割されました。これにより Unity のコードベースが、よりクリーンな内部的依存関係で効率的に整理され、内部的ツーリングにより適した形となり、コードベースのストリップがより行いやすくなりました。このモジュールには、現在 UnityEngine.PhysicsModule.dll 内にある UnityEngine.Collider や、現在 UnityEngine.TextRendering.dll 内にある UnityEngine.Font も含まれます。

通常、この変更が既存のプロジェクトに影響を及ぼすことはありません。またスクリプトは正しいアセンブリに対して自動的にコンパイルされるようになっています。アップグレード後の Unity には、 DLL を参照する全てのプリコンパイル済アセンブリの、全ての UnityEngine タイプの type forwarders を含む、 UnityEngine.dll アセンブリファイルが 1 つ含まれます。これによってファイルを新しい場所に転送する場合の上位互換性が確保されます。

ただし、一定の条件においては、この変更によって既存のコードが破損される可能性もあります。具体的には、コードがリフレクションを使用して UnityEngine タイプを取得していて、全てのタイプが同一アセンブリに存在することを前提としている場合です。アップデート後はコライダーとフォントは別のアセンブリにあるため、こういったコードは機能しなくなります。

System.Type colliderType = typeof(Collider);
System.Type fontType = colliderType.Assembly.GetType("Font");

以下のようなタイプ フォワーダを使用してコライダーやフォントのタイプを “UnityEngine” アセンブリから取得することはアップデート後も可能です。

System.Type.GetType("UnityEngine.Collider, UnityEngine")

アップデート後であっても、全ての UnityEngine API を含む完全にモノリシックな UnityEngine.dll が Unity エディターの Managed/UnityEngine.dll フォルダー内に提供されています。これにより、 UnityEngine.dll を参照する全ての既存の Visual Studio/MonoDevelop ソリューションは、新しいモジュラー アセンブリを参照するように更新する必要なく、今までと同様にビルドされるようになっています。モジュールの内部分割は今後変更される可能性があるため、カスタムのソリューション内で UnityEngine API を参照するためにはこのアセンブリを引き続き使用することが推奨されます。


スタンダードシェーダーのマテリアルの Smoothness

GGX 版のスタンダードシェーダーを使用した完全に smooth (滑らか)なマテリアルは、 Specular Highlight (鏡面反射)を受けるようになりました。これによりマテリアルの写実性が向上します。


自動 API アップデーターの使用
Unity 2017.1 へのアップグレード