Version: 2021.3
言語: 日本語
Legacy Upgrade Guides
Unity 2017.3 へのアップグレード

Unity 2018 LTS へのアップグレード

ノート: このセクションのアドバイスには、リリース順に従ってください。例えば、プロジェクトを 2018 年から 2020 年にアップグレードする必要がある場合、2020 年のアップグレードガイドを読む前に、2019 年のアップグレードガイドを読んで変更すべき点がないかどうかを確認します。

This page lists changes in Unity 2018 LTS which might affect existing projects when you upgrade from a Unity 2017 version.

Note that 2018 LTS is also known as 2018.4.

このページに含まれる内容


プレハブの改良

  • プレハブは自動的に 新しいプレハブシステム にアップグレードされます。
  • プレハブのネストをサポートするために、プレハブのワークフローが変更されました。プレハブを編集するには、プレハブモードで開く必要があります。Project ウィンドウでプレハブを編集することはできなくなりました。
  • また、ゲームオブジェクトの削除、ゲームオブジェクトの親の変更、または Transform を RectTransform へ置き換えることなど、プレハブモードで構造的な変更を行うこともできます。その他、プレハブインスタンスからプレハブアセットへのリンクを完全に削除して、必要に応じてその結果のゲームオブジェクトそのものを再構築できるようにしたい場合は、プレハブインスタンスを展開することもできます。プレハブインスタンスを切断することはできなくなりました。
  • プレハブアセットをプレハブモードで編集中の場合、ゲームオブジェクトを作成するエディターは、ObjectFactory.CreateGameObject を使用して、ゲームオブジェクトがプレハブシーン内にあるようにする必要があります。
  • 安全対策として、開いているプレハブのスクリプトに [ExecuteInEditMode] 属性がある場合、スクリプトを再生モードにするとプレハブモードは終了します。このようにスクリプトとプレハブモードに互換性を持たせる方法の詳細は、スクリプトリファレンスの ExecuteInEditMode と新しい ExecuteAlways 属性を参照してください。
  • プレハブはインポートされたアセットとして扱われるようになったため、スクリプトからプレハブアセットに任意の変更を加えることはできなくなりました。代わりに、PrefabUtility.LoadPrefabContentsPrefabUtility.SaveAsPrefabAssetPrefabUtility.UnloadPrefabContents を使用する必要があります。
  • AssetDatabase.AddObjectToAsset を使用してアセットをプレハブに追加する場合は、必要なオブジェクトを追加した後に PrefabUtility.SavePrefabAsset を呼び出す必要があります。

ページ始めに戻る

USS flex の短縮表記が CSS 標準に準拠するようになりました

  • USS の flex ディレクティブは、flex-growflex-shrinkflex-basis を示す最多で 3 つのパラメーターを受け入れるようになりました。flex-shrink と flex-basis パラメーターは必須ではありません。これらを指定しない場合は、flex-basis のデフォルトは 0 になり、flex-shrink のデフォルトは 1 になります。
  • 2018.3 以前では、flex: Nflex N 0 auto と同等でした。これは現在 flex:N 1 0 と同等にすることで CSS 標準に準ずるにようになりました。古いセマンティックを維持するには、USS ファイル内のすべての flex: N ディレクティブを flex: N 0 auto に置き換える必要があります。

ページ始めに戻る

マネージユーザースレッドで未処理の例外の記録をサポート

  • 2018.3 より前のバージョンでは、Unity エディターはマネージユーザースレッドでスローされた未処理の例外を記録しませんでした。2018.3 以降、マネージユーザースレッドでスローされた未処理の例外は Unity エディターコンソールに記録されるようになりました。 ログにはすべてのマネージユーザースレッドが含まれるようになったため、プロジェクトで常にスローされていたにもかかわらず、今までコンソールに出力されなかった例外が表示される場合があります。

ページ始めに戻る

VFACE シェーダー変数が DirectX (11 & 12) で反転するようになりました

  • キューブマップにレンダリングする場合、VFACE シェーダー変数は DirectX と他のグラフィックス API の間で一貫していませんでした。今では同じ動作をします。
  • キューブマップをレンダリングするために DirectX シェーダーで VFACE の bool シェーダー変数を使用する場合は、コード内のロジックを反転する必要があります。
  • Issue ID 1027670 (英語) を参照してください。

ページ始めに戻る

PhysX を 3.3.1 から 3.4.2 へアップグレード

物理的な動作が変更されたため、新しいバージョンでは一部のプロジェクトで動作が異なる場合があります。特に以下の点に注意してください。

  • Persistent Contact Manifold モードで、接触パッチに最大 6 つの接触を加えられるようになりました。これは、以前のバージョンの “各パッチに 5 つの接触” から増加されました。マニフォールド内のパッチをマージする新しいコードと、接触を選択する新しいコードがあります。衝突は以前よりはるかに正確に表示されるようになりました。接触を特別な処理に依存するプロジェクトは、新しいコードと互換性を持たせるために調整する必要があるかもしれません。たいてい、凸体がメッシュやプリミティブと衝突する場合に、この問題が発生します。
  • 新しいアルゴリズムが Terrain との接触 の計算に使用されるようになりました。Terrain との接触は、以前は特殊なケースとして扱われましたが、現在は、MeshCollider に使用されるのと同じメッシュの基本的なコードが使用されるようになりました。このコードは、堅牢性、正確性、パフォーマンスが優れていますが、TerrainData.thickness をサポートしません。つまり、地面を貫通する効果が可能であるということです。地面の貫通を回避するには、動きの速いオブジェクトに対して継続的な衝突検出を有効にする必要があります。以前は、 TerrainData.thickness よりも浅い位置に物体が埋まっていると、自動的に地上へ押し出されていましたが、法線の向きは正しくありませんでした。以前の動作に変更する場合には、Physics 設定の Enable Unified Heightmaps オプションをオフにします。
  • どのような場合でも、負のメッシュスケーリング が直接、メッシュのベイクを発生させることはなくなりました。凹メッシュはもうベイクされることはありません。ただし、凸メッシュをベイク処理するには、まだスケーリングが必要です。この変更により、scale.x * scale.y * scale.z < 0 の場合、負のスケーリングはメッシュの法線を反転させます。さらに、スキューやシアーなどの重要なスケーリングも以前と同様にベイク処理する必要があります。
  • 凸メッシュインフレーション は、推奨されません。なぜなら、新しい凸包計算アルゴリズム (Quickhull) は入力メッシュのすべての種類の不完全性に対してより寛容であるため、凸メッシュインフレーションは必要ないと考えられるためです。

ページ始めに戻る

AssetBundle.mainAsset プロパティは廃止されました

  • Unity バージョン 5.0 より前では、ユーザーは AssetBundle.BuildAssetBundle API を使ってアセットバンドルを構築しなければなりませんでした。AssetBundle.BuildAssetBundle API は AssetBundle の mainAsset プロパティを使ってロードしたあとにオブジェクトを返す必要がありました。
  • AssetBundle.BuildAssetBundle API は Unity 5.0 では廃止予定とされ、AssetBundle.BuildAssetBundles に置き換えられました。これにより、アセットバンドルからアセットを取得する方法が変更されました。
  • アセットバンドルからコンテンツを取得するには、アセットの名前、または AssetBundle.LoadAsset API の相対パスを取得する必要があります。アセットバンドルの構築や アセットバンドルの機能の利用法、AssetBundle スクリプトティング API に関してはドキュメントを参照してください。

ページ始めに戻る

NavMesh コンポーネントを使ったプロジェクトのアップグレード

プロジェクトを 2018.2 以前のバージョンから 2018.3b に移行し、それに Unity の GitHub リポジトリから取得した NavMesh コンポーネントを使用する場合は、この ブランチ を使用する必要があります。

ページ始めに戻る

パーティクルシステムの不具合の修正

Unity 2018.3 にはパーティクルのバグ修正がいくつか含まれており、これは以前のバージョンで作成されたプロジェクトに影響を与える可能性があります。

  • ビルボードのパーティクルに統一されていない Transform スケールを使用すると、Y 軸と Z 軸の反転が発生しました。 この問題は修正されました。
  • メッシュパーティクルに統一されていない Transform スケールを使用すると、スケール後に回転が加えられるというバグが存在しました。これは、2017.x のバグで、5.6 以前では正しく動作していました。このバグを修正すると 5.6 以前で作成されたコンテンツは正しく動作しますが、2017.x で作成されたコンテンツが変更されます。
  • Spherical Wind Zone は樹木と、パーティクルに対して逆の効果 (樹木に風を送ると、パーティクルが風と反対方向にひき寄せられる) を与えていました。これは修正されたため、Spherical Wind Zone はパーティクルを引き寄せるのではなく、送り出すようになりました。以前の動作に戻したい場合は、External Forces Multiplier を無効にするか、Wind Zone の強さを調整してください。樹木や Directional Wind Zone を持つシーンが不適切な影響を受ける可能性があるので、Unity が自動的に変更することはできません。

ページ始めに戻る

C# コンパイラーを Roslyn にアップグレード

2018.3 より前では、Unity エディターはプロジェクト内の C# ファイルをコンパイルするときに Mono C# コンパイラー (mcs) を使用していました。2018.3 以降、Roslyn C# コンパイラー (csc) が、新しいスクリプトランタイム (.NET 4.x Equivalent) を対象としたプロジェクトに使用されています。 Roslyn へ切り替えると、動作が異なる場合があります。

  • C# 7.3 がサポートされます。
  • 追加の警告が通知されることがあります。
  • Roslyn コンパイラーの応答ファイルは、csc.rsp という名前にしてください。詳細は プラットフォーム依存コンパイル を参照してください。

ページ始めに戻る

UnityScript と Boo スクリプトコンパイラーは廃止されました

UnityScript (.js) と Boo (.boo) スクリプトファイルは、エディタでーコンパイルできなくなりました。

詳細は、2017 年 8 月の ブログ を参照してください。Unityscript2csharp ツールを使用して UnityScript を C# に変換できます。

ページ始めに戻る

Animator のルートモーションの再生方法の変更

Animator のルートモーションの再生方法が少し変更され、Animation ウィンドウでルートモーションアニメーションを作成する際の不具合を修正しました。

ルートモーションカーブをアニメーションクリップ用に生成する必要がなくなりました。 ルートモーションのアプリケーションは、Animator.applyRootMotion のみに依存するようになりました。

2018.2 と 2018.4 の対応表

ケース ルートモーション生成 Animator.applyRootMotion 2018.2 2018.3 & 2018.4 (LTS)
A はい はい ルートの Transform に累積的にルートモーションを適用します。 2018.2 と同様
B いいえ いいえ アニメーションクリップで編集したように、位置、回転、スケールのカーブを適用します。 2018.2 と同様
C* はい いいえ ルート Transform の移動はありません。 アニメーションクリップで編集したように、位置、回転、スケールのカーブを適用します。
D* いいえ はい ルート Transform の移動はありません。 ルートの Transform に累積的にルートモーションを適用します。

ケース C と D の場合、2018.3 で同じ結果を得るには、OnAnimatorMove を実装します。次に、ルートモーションを適用しない場合は Animator.deltaPositionAnimator.deltaRotation を破棄してください。

プロジェクトで applyRootMotion を使用してルート Transform の位置、回転、スケールアニメーションをミュートにする場合は、ルートの Transform プロパティを手動でオーバーライドする必要があります。

ページ始めに戻る

UIElements.ContextualMenu の変更

UIElements.ContextualMenu メニューアクションコールバックは、 EventBase パラメーターの代わりに ContextualMenu.MenuAction パラメーターを取るようになりました。

ContextualMenu.InsertSeparator は追加の string パラメーターを取るようになりました。

ページ始めに戻る

マルチプレイヤー - 非推奨のネットワーキング API が排除されました (RakNet ベース)

この機能は Unity 5.1 で非推奨となり、排除されました。Unity 2018.2 のプロジェクトでは使用することはできません。

Unity のネットワークに関する詳しい情報は マルチプレイヤーゲームとネットワーク を参照してください。

ページ始めに戻る

透明度を使った Photoshop データファイル (PSD) のインポート

Photoshop は、透明度がある場合にはピクセル色を微調整し、それらをマットカラー (背景) とブレンドします。アルファチャンネルを適切に準備するプロセスは、アルファテクスチャのインポートの仕方 を参照してください。

前述のページにある、カラーレイヤーの拡張は無視することができます。重要なのは、別のアルファチャンネル/マスクを持つ “不透明” な (透明ではなく) 画像を作成する必要があるという説明です。Unity は色を微調整してマットを取り除いていましたが、この方法は 2018.2 で終了しました。透明度を持つ PSD があると、エッジが白く見える場合があります。これを修正するには、上のリンクのページを参考に (透明度の代わりに) 実際のアルファチャンネルを作成してください。

ページ始めに戻る

ゲームオブジェクトが無効、または破棄されている間に MonoBehaviour から返されたコルーチンは起動しなくなりました 

以前のバージョンでは、ゲームオブジェクトが無効にされたり破棄されたりすると、その子の MonoBehaviour で実行中のコルーチンのすべてが停止しました。ただし、特定の場合では、ゲームオブジェクトが無効にされたり破棄されたりする間に呼び出されたメソッド (例えば、OnBecameInvisible()) が開始したコルーチンを実行することができました。それが原因で、コンポーネントの順序特有の動作が発生し、場合によってはクラッシュしました。

Unity 2018.1 では、ゲームオブジェクトが無効、または破棄された状態で返されたコルーチンは実行されなくなりました。

ページ始めに戻る

BuildPipeline API は文字列でなく、BuildReport オブジェクトを返すようになりました

BuildPipeline.BuildPlayerBuildPipeline.BuildAssetBundles などの BuildPipeline API は、以前は文字列を返していました。ビルドが成功した場合は空で、ビルドが失敗した場合はエラーメッセージが表示されました。

2018.1 では、これは新しい BuildReport オブジェクトに変更されました。このオブジェクトには、ビルド処理に関するより豊富な情報が含まれています。

ビルドが成功したかどうかを確認するには、report オブジェクトの summary プロパティを取得し、その result プロパティを確認します。ビルドが成功した場合は BuildResult.Succeeded になります。以下はその例です。

var report = BuildPipeline.BuildPlayer(...);

if (report.summary.result != BuildResult.Succeeded)
{
    throw new Exception("Build failed");
}

ページ始めに戻る

Player Quit 通知をメッセージからイベントに変更

以前は、Unity のスタンドアロンプレイヤーが終了したときに通知を受けるには、MonoBehaviour の OnApplicationQuit メソッドを実装し、プレイヤーの終了をキャンセルするには Application.CancelQuit を呼び出していました。

新しく 2 つのイベントが導入されました。これらは Application.wantsToQuitApplication.quitting です。Unity スタンドアロンプレイヤーの終了時に通知を受けるためには、これらのイベントをリッスンします。Application.wantsToQuit は、プレイヤーが終了しようとするときに呼び出されます。wantsToQuit のリスナーは true または false を返す必要があります。プレイヤーに終了を続けさせたい場合は true を返し、終了をキャンセルする場合は false を返します。Application.quitting イベントは、プレイヤーが終了することが確実でキャンセルできない場合に呼び出されます。

Application.CancelQuit は非推奨になりました。代わりに Application.wantsToQuit を使用してください。

using UnityEngine;

public class PlayerQuitExample
{

    static bool WantsToQuit()
    {

        // エディターを終了したいですか?

        return true;

    }

    static void Quit()
    {

        Debug.Log("Quitting the Player");

    }

    [RuntimeInitializeOnLoadMethod]

    static void RunOnStart()
    {

        Application.wantsToQuit += WantsToQuit;

        Application.quit += Quit;

    }
}

ページ始めに戻る

.Net プラットフォームで AvatarBuilder.BuildHumanAvatar は非推奨になりました

この変更は WSAPlayerX86、WSAPlayerX64、WSAPlayerARM のランタイムプラットフォームに影響します。

現時点で、代わるものはありません。

ページ始めに戻る

TouchScreenKeyboard.wasCanceled と TouchScreenKeyboard.done は非推奨になりました

新しい TouchScreenKeyboard.status では、古い非推奨の状態やその他の状態を含む参照もできます。

ページ始めに戻る

Unity Installer から MonoDevelop 5.9.6 が排除され、Unity の MonoDevelop 5.9.6 へのサポートは廃止されました

MonoDevelop 5.9.6 は、macOS インストーラーのバンドル C# スクリプトエディターとして、macOS の Visual Studio for Mac に置き換えられました。Visual Studio 2017 Community は、Windows に Unity と一緒にインストールされる唯一の C# スクリプトエディターです。

MonoDevelop を Unity 実行ファイル近くのデフォルトの場所にインストールしても、Unity は Preferences の “MonoDevelop” (ビルトイン) 外部スクリプトエディターと認識しません。C# スクリプトエディターがインストールされておらず、Preferences で選択されていない場合、Unity は C# (.cs) スクリプトを開くためにシステムデフォルトのアプリケーションを使用します。

ページ始めに戻る

BuildPipeline コールバックインターフェースは BuildReport オブジェクトを使用するようになりました

BuildPipeline コールバックインターフェースで、IPreprocessBuildIPostprocessBuildIProcessScene は変更され、BuildReport オブジェクトに渡すように変更されました。 これはビルドパス/ターゲットプラットフォームの以前のパラメーターを置き換えます。これらのインターフェースを実装している場合は、コードを変更する必要があります。

ビルドパスとターゲットプラットフォームの両方が、BuildReport オブジェクトからアクセスできます。ビルドパスは report.summary.outputPath、ターゲットプラットフォームは report.summary.platform です。

ページ始めに戻る

プラグインフォルダーにあるアセットは、専用のインポーターを通してインポートされなくなりました

以前は、プラグインフォルダー (例えば、拡張子が .bundle、.plugin、.folder のディレクトリなど) にあるアセットは、専用のインポーターを使用してインポートされていました。テクスチャはテクスチャインポーター、オーディオクリップはオーディオインポーターなどを通してインポートされました。現在、これらすべてのアセットはデフォルトのインポーターを使用してインポートされるようになりました。つまり、以前のようにそれらのアセットを参照できなくなりました。なぜなら、特別なタイプ (テクスチャ、オーディオクリップなど) が廃止されたからです。プラグインフォルダーはパッケージに含まれているため、プラグインでアクセスする以外は、内部のアセットに外からアクセスすることはできません。

これらのアセットを使い続けるには、それらをプラグインフォルダーの外に移動する必要があります。

ページ始めに戻る

パーティクルシステムのメッシュパーティクルに適用されたピボットオフセットの値が正しくありませんでした

メッシュにピボットオフセットを適用するための数式が誤っており、ビルボードパーティクルに対する作用の仕方が一定でありませんでした。正しいスケールを実現するには、ピボットオフセットにパーティクルのサイズを乗じます。このようにすると、ピボットオフセットの 1 がパーティクルの全幅の 1 倍と等しくなります。

メッシュの場合、サイズは 2 回乗算されていました。つまり、ピボットの値はパーティクルサイズの 2 乗を使って算出されていました。 このため、さまざまなサイズのパーティクルを含むシステムで一貫した結果を得ることができませんでした。

同じサイズのパーティクルを使用するシステムでは、この動作の変化を補正するために、式をリバースエンジニアリングしてピボットオフセットを調整する量を決定できます。この動作の変更は以下のように行われています。

従来の式: offset = size * size * pivot

新しい式: offset = size * pivot

従って、すべてのパーティクルのサイズが等しい場合は以下のようになります。

newOffset = pivot / size

パーティクルのサイズがばらばらのシステムでは、対象のシステムの目視での再評価が必要になります。

ページ始めに戻る

GPU インスタンシングがグローバルイルミネーションをサポート

2018.1 から、グローバルイルミネーション (GI) は Unity の GPU インスタンシングレンダリングによってサポートされています。各 GPU インスタンスは、さまざまな ライトプローブ、1 つの ライトマップ (ただしアトラスでは異なる領域)、1 つの Light Probe Proxy Volume コンポーネント (すべてのインスタンスを含む空間ボリューム用にベイク処理) のいずれかからの GI をサポートできます。スタンダードシェーダーとサーフェスシェーダーにはこれらの変更が自動的に含まれますが、これらの機能を有効にするにはカスタムシェーダーコードを更新する必要があります。

ページ始めに戻る

描画とサイズの関数のデフォルトの管理

UnityEditor.IMGUI.Controls 名前空間内の BoxBoundsHandle、CapsuleBoundsHandle、SphereBoundsHandle、ArcHandle、JointAngularLimitHandle などの複雑なハンドルには、コントロールポイントの外観を変更するために割り当て可能なデリゲートがあります。以前は、これらのデリゲートに null の値を割り当てると、デフォルトの動作に戻りました。しかし、現在では、これらに null の値を代入すると動作しなくなり、特定のコントロールハンドルを無効にしやすくなりました。コントロールハンドルをデフォルトの動作にリセットする必要がある場合は、各クラスにデフォルトメソッドのための public の API ポイントがあります。

ページ始めに戻る

‘unsafe’ C# コードを Unity エディターでコンパイルするにはオプションを有効にする必要があります

‘unsafe’ C# コードをコンパイルするには、定義済みアセンブリ (Assembly-CSharp.dll など) の Player Settings と Assembly Definition Files アセンブリのインスペクターで、Allow ‘unsafe’ code オプションを有効にする必要があります。 このオプションを有効にすると、スクリプトをコンパイルするときに Unity は C# コンパイラーに unsafe オプションを渡すようになります。

ページ始めに戻る

‘UnityPackageManager’ ディレクトリは ‘Packages’ に名称変更

2017.2 と 2017.3 では、Unity Package Manager は UnityPackageManager ディレクトリを導入し、manifest.json という名前のファイルを格納しました。パッケージのコンテンツには、Packages から始まる仮想相対パスを使用してスクリプトからアクセスできました。

2018.1 では、パッケージ化されたアセットの仮想相対パスとの一貫性のために UnityPackageManager ディレクトリを Packages に改名しました。manifest.json ファイルは自動的に新しいディレクトリに移されます。

その結果、以下のようになります。

  • プロジェクトで Perforce や Git などのバージョン管理システム (VCS) を使用している場合は、UnityPackageManager ディレクトリではなく Packages ディレクトリを追跡するように設定を更新する必要があります。

  • プロジェクトで Nuget (または任意の外部パッケージマネージャー) を使い、それを通して Packages ディレクトリを使用している場合は、別のディレクトリを使用するように設定を変更する必要があります。これは、パッケージが Unity Package Manager によって取得されてしまうわずかな可能性を排除するために有効です。Unity Package Manager によって取得されると、コンパイルエラーやインポートエラーのようなデバッグが難しい問題の原因となる可能性があります。

  • 新しいディレクトリに移行した後、UnityPackageManager ディレクトリを安全に削除することができます。

Legacy Upgrade Guides
Unity 2017.3 へのアップグレード