Unity 5.5 へのアップグレード
5.4 ネットワーク API の変更

Unity 5.4 へのアップグレード

プロジェクトを Unity 5.3 から Unity 5.4 へとアップグレードする場合、プロジェクトに影響する可能性がある変更がいくつかあります。

ネットワーク: マルチプレイヤー API の変更

ネットワーク API に関する多くの変更

ネットワーク: WebRequest は正式版になりました

WebRequest インターフェースが UnityEngine.Experimental.Networking から UnityEngine.Networking になりました。UnityWebRequest を使用している Unity 5.2 と 5.3 のプロジェクトは更新する必要があります。

シーンビュー: トーンマッピングは自動的に適用されません

ImageEffectTransformsToLDR 属性をもつイメージエフェクトは、シーンビューに自動的に適用されなくなりました。シーンビューにエフェクトを適用するための新しい属性は ImageEffectAllowedInSceneView です。5.4 の Standard Assets は更新され、この変更が反映されています。

シェーダー: 名称変更された変数

一貫性を保つため、多数のビルトインシェーダー変数が名称変更されました。

  • _Object2World_World2Objectunity_ObjectToWorldunity_WorldToObject へ変更
  • _World2Shadowunity_WorldToShadow[0] へ、_World2Shadow1unity_WorldToShadow[1] へ… のように変更
  • _LightMatrix0unity_WorldToLight へ変更
  • _WorldToCamera, _CameraToWorld, _Projector, _ProjectorDistance, _ProjectorClip, _GUIClipTextureMatrix にはすべて、 unity というプレフィックスがつくように変更

インポートするときに、参照変数は .shader と .cginc ファイルで自動的に名称変更されます。ただし、インポート後は、手動で変数の名称変更を行わない限り、そのシェーダーを Unity 5.3 以前のバージョンで使用することはできません。

シェーダー: Uniform 配列

Unity 5.4 では、シェーダープロパティーの配列の処理方法が変更され、シェーダーの float、vector、matrix の配列 ( MaterialPropertyBlock.SetFloatArray , Shader.SetGlobalFloatArray 他経由) に、ネイティブのサポートが設定されています。これらの新しい API では、配列に最大 1,023 の要素が可能です。

個々の配列要素を参照するための数字付きの名称を使用する旧方式 ( _Colors0_Colors1 など) は MaterialMaterialPropertyBlock では非推奨です。Material でシリアライズされたプロパティーには、もう配列要素を設定することはできません (ただし、uniform 配列の名称が数字付きである場合は可能です)。

シェーダー: 5.4 におけるその他の変更

デフォルトのシェーダーコンパイルターゲットは、“#pragma target 2.5” (DX9 の SM3.0、WinPhone の DX11 9.3 性能レベル) です。DX9 SM2.0 と DX11 9.1 性能レベルもまだ、“#pragma target 2.0” でターゲットに設定することができます。

現在、ビルトインシェーダーの大半は 2.5 をターゲットにしています。目立った例外は、Unlit、VertexLit、固定関数シェーダーです。つまり、大半のビルトインシェーダーと新しく作成されたシェーダーは、デフォルトでは、2004 年より前に作られた PC GPU で作動しないということを意味します。詳しくはこちらのブログを参照してください。

すでに非推奨となっている Material クラスのコンストラクター Material(文字列) は、5.4 で動作しなくなりました。使用するとエラーメッセージが表示され、結果的にマジェンタの誤ったシェーダーになります。

スクリーン空間のディレクショナルライトの影を計算していた内部シェーダーは、Graphics Settings に移動しました。プロジェクトにそのシェーダーのコピーを置くことによって、ディレクショナルライトの影のカスタマイズしたバージョンを使用している場合は、もう使用することはできません。代わりに Edit > Project Settings > Graphics の順に開き、そこでカスタムシェーダーを選択してください。

リフレクションプローブは 2 つのテクスチャ間のサンプラーを共有します。シェーダーで手動でテクスチャをサンプリングし、“undeclared identifier samplerunity_SpecCube1” のエラーが発生した場合は、コードをUNITY_PASS_TEXCUBE(unity_SpecCube1) から UNITY_PASS_TEXCUBE_SAMPLER(unity_SpecCube1,unity_SpecCube0) へ変更します。

UnityEditor.ShaderUtil.ShaderPropertyTexDim は非推奨なので、 Texture.dimension を使用してください。

ComputeBuffer

自動変換される OpenGL シェーダーの ComputeBuffer のデータレイアウトは、DirectX ComputeBuffers のレイアウトに一致するように変更されました。OpenGL で ComputeBuffer を使用する場合は、以前の OpenGL に特化したレイアウトルールに合わせ微調節するためのコードを削除してください。詳しくは 、コンピュートシェーダーを参照してください。

Playable: 5.4 へのマイグレーション

  • Playable はクラスではなく構造体です。

  • Playable 構造体は、ネイティブの Playable クラスへのポインターではなくハンドルです。

  • Playable 構造体が null でないからといって必ずしも Playable が使用可能なわけではありません。.IsValid メソッドを使用してその Playable が使用可能かを確認してください。

  • 空の input や output に対し null を返していたメソッドはすべて、Playable.Null を返すようになりました。

  • Playable.Null は無効な Playable です。

  • Playable.Null は空の input を確保するため、または、接続していた input を暗示的に非接続にするために AddInputSetInputSetInputs に渡されることがあります。

  • メソッドの input として Playable.Null や無効な Playable を使用したり、無効な Playable でメソッドを呼び出すと、その作業に適切な例外が発生します。

  • Playable を null と比較することは無意味です。 Playable.Null と比較してください。

  • Playable は使用したいクラスの static メソッドの Create を使ってアロケーションしてください。

  • Playables は Playable ハンドルの .Destroy メソッドを使ってアロケーションを解除してください。

  • アロケーションを解除しない Playable はメモリーリークとなります。

  • Playable は、ボクシングやボクシング解除 (ボクシングに関する詳細情報はこちら) を避けてパフォーマンスを向上させるために、構造体に変換されました。

  • Playable をオブジェクトにキャストすることは、暗示的、または、明示的にボクシングやボクシング解除の起因となり、パフォーマンスを低下させます。

  • Playable クラスからの継承は、子クラスのインスタンスのボクシングやボクシング解除の原因となります。

  • 現在、アニメーションのみが使用可能なため、 ScriptPlayableCustomAnimationPlayable に取り換えられました。

  • 元の Playable から派生させることはできなくなりました。カスタム作成した Playable に単純に Playable をアグリゲートしてください。

Oculus Rift: Unity 5.3 からプロジェクトをアップグレード

Oculus VR プロジェクトを Unity 5.3 からアップグレードするには、以下の手順で行ってください。

バーチャルリアリティサポートを再度、有効にします。

  • Player Settings を開きます (Menu: Edit > Project Settings > Player)。
  • Other Settings を選び Virtual Reality Supported チェックボックスをチェックします。チェックボックスの下に表示される Virtual Reality SDK リストを使用し、各ビルドターゲットごとに Virtual Reality Devices を追加、または、削除します。

Oculus Spatializer を削除します。

  • Audio Settings Window (Menu: Edit > Project Settings > Audio ) で Spatializer Plugin ドロップダウンを使って、 Oculus Spatializer Audio Plugin をプロジェクトから削除します。Oculus Spatializer Audio Plugin が、ネイティブの spatializer と矛盾を起こしビルドの妨げとなる可能性があるためです。

兄弟の並べ替え

Unity 5.4 では、兄弟のゲームオブジェクトが並べ替えされるときにトリガーするイベントに変更があります。兄弟 ゲームオブジェクトとはヒエラルキーウィンドウで同じ親を持つゲームオブジェクトのことです。以前のバージョンの Unity では、兄弟のゲームオブジェクトの順序が変わると、すべての兄弟が OnTransformParentChanged の呼び出しを受けました。 5.4 では、兄弟のゲームオブジェクトはこの呼び出しを受けることはなくなりました。代わりに、親のゲームオブジェクトが OnTransformChildrenChanged の呼び出しを受けます。

つまり、プロジェクト内に、兄弟が並べ替えられたときに OnTransformParentChanged の呼び出しに依存しているコードがあっても、この呼び出しはもう発生しません。そのため、代わりに親オブジェクトがOnTransformChildrenChanged の呼び出しを受け取るようにコードをアップデートする必要があります。

新しい挙動を使用するとパフォーマンスが向上するため、このように変更されました。

ランタイム時の大きなゲームオブジェクトの階層の再編成

Transform コンポーネントの最適化のためにTransform.SetParent を使用したり、1000 以上ものゲームオブジェクトを含む階層に Destroy を実行するのに、以前よりも長い時間がかかるようになりました。ランタイムに SetParent を呼び出したり、または、そのように大きな階層をランタイムに再編成するのは推奨されません。

Windows ストア

生成された Visual Studio プロジェクトフォーマットが .NET スクリプティングバックエンド SDK すべてのためにアップデートされました。これにより、生成されたオブジェクトで何も変更がないときに発生する不必要な再ビルドが修正されました。既存の生成された *.csproj (特にそれが “Generate C# projects” オプション付きでビルドされた場合) を削除しなくてはならない場合があります。そうすることによって、それを再生成できます。

スクリプトシリアライズエラー

デシリアライズ (読み込み) 中に Unity API がコンストラクターとフィールドイニシアライザーからから呼び出される場合に、キャッチすべき 2 つの新しいスクリプトシリアライゼ―ションエラーが追加されました。デシリアライズはさまざまなスレッドからメインスレッドへと発生する可能性があります。そのため、デシリアライズ中に Unity API に呼び出しすることは安全ではありません。詳細は、Unity マニュアルのスクリプトシリアライゼーション ページを参照してください。

Retina ディスプレイのサポート

エディターは Mac OS X の高解像度テキスト、UI、3D ビューで Retina ディスプレイをサポートするようになりました。

エディターの GUI はピクセル空間というよりは、ポイント空間で決定されます。標準解像度のディスプレイでは、各ポイント (pt) が 1 ピクセル (px) のため変化はありません。しかし、Retina ディスプレイでは、各ポイントは 2 ピクセルです。現在の画面対 UI の比率は EditorGUIUtility.pixelsPerPoint で求めることができます。Unity では複数のウィンドウが可能なため、モニター上のそれぞれが異なるピクセル密度を持つことが可能で、この値がビューによって変化することがあります。

エディターコードで標準の Editor、GUI、Layout メソッドのいずれかを使用している場合は、たいてい何も変更する必用はありません。

Screen.widthScreen.height を使用している場合は、代わりにEditorWindow.position.widthEditorWindow.position.height に変更します。なぜなら、画面サイズがピクセルで測られているのに、UI はポイントで定義されているからです。インスペクターに表示するカスタムエディターには、スクロールバーを適切に表示できるように EditorGUIUtility.currentViewWidth を使用します。

UI に RenderTexture など他のコンテンツを表示したい場合、おそらくそのサイズはポイントで計算されています。Retina ディスプレイでは、ポイントサイズをピクセルサイズに変換しなくてはなりません。これを行うための新しいメソッドが EditorGUIUtility に含まれています。

カスタムの背景で GUIStyles を使用する場合、正確に寸法を 2 倍にしたテクスチャを ‘GUIStyleState.scaledBackgrounds’ 配列に入力することによって Retina バージョンの背景テクスチャを加えることができます。

動力不測のグラフィックスハードウェアが設定された Mac では、増加した解像度のために 3D ビューでエディターのフレームレートが非常に遅くなることがあります。Finder で Unity.app の “Get Info” を選び、“Open in Low Resolution” をチェックすることによって Retina サポートを無効にすることができます。

物理演算: メッシュと物理演算の transform ドリフト

以下の変更が行われました。

  • 物理演算メッシュに無効な (non-finite) 頂点が含まれる場合、物理演算メッシュを却下するよう変更

  • 重複する Transform の update を送信しないことによって物理演算 transform ドリフトを避けるよう変更

5.3 のビヘイビアとしては、アニメーションシステムが、constant であるアニメーションカーブのために Transform のアップデートメッセージを常に送信していました。これらのメッセージは Rigidbody のスリープ状態を解除し、この問題を修正することは 5.3 では危険を伴うものでした。

5.4 のビヘイビアとしては、位置の変化がない場合は、Rigidbody は (大方の予測通り) スリープしたままです。

プロジェクトが常に Rigidbody のスリープ状態を解除する 5.3 のビヘイビアに依存している場合は、5.4 では期待するように動作しないことがあります。

Web Player

Unity 5.4 から Web Player はターゲットから除かれました。プロジェクトを Unity 5.4 にアップグレードすると、Web Player プラットフォームにはデプロイできなくなります。

旧 Web Player プロジェクトを維持する必要がある場合は、5.4 以降にアップグレードしないようにしてください。

Unity 5.5 へのアップグレード
5.4 ネットワーク API の変更