Version: Unity 6.0 (6000.0)
言語 : 日本語
Unity 6 へのアップグレード
Unity 2023.1 へのアップグレード

Unity 2023.2 へのアップグレード

このページには、2023.1 バージョンから 2023.2 へのアップグレード時に既存のプロジェクトに影響を与える可能性がある、Unity 2023.2 の変更点を記載しています。

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

環境ライティング: アンビエントプローブとスカイボックスリフレクションプローブがデフォルトでベイクされなくなりました

Unity のプログレッシブライトマッパーは、デフォルトでアンビエントプローブとスカイボックスリフレクションプローブをベイクしなくなり、Lighting ウィンドウの Recalculate Environment Lighting 設定は削除されました。

新しく作成されたシーンに環境ライティングが含まれないように、Unity はデフォルトのスカイボックスマテリアルに一致する環境ライティングを含むデフォルトのライティングデータアセットを割り当てます。

以下の場合は、Lighting ウィンドウで Generate Lighting を選択する必要があります。

  • 以前の自動ベイク動作に依存するシーンのライトを修正する。
  • 環境ライティング設定を変更した場合に、新しいシーンのライティングの変更を確認する。

以前の自動ベイク動作に依存しながらデフォルトの環境ライティング設定を使用する場合、Unity はデフォルトのライティングデータアセットを使用するようにシーンをアップグレードします。

自動生成ライティングが削除されました

Lighting ウィンドウの Auto Generate 設定は削除され、関連する API は廃止されました。

シーンのベイクしたライティングを生成するには、以下のいずれかを実行します。

  • Lighting ウィンドウで Generate Lighting を選択します。
  • Lightmapping.Bake API を使用します。
  • Lightmapping.BakeAsync API を使用します。

編集中にライトマップを確認する必要がある場合には、シーンビュー描画モードを選択し、Lighting DataPreview に設定できるようになりました。これによって、ベイクしたライティングのプレビューが表示されます。プレビューライトマップは非破壊で、シーンをベイクした後に使用できます。

シーンが自動生成ライティングに依存している場合は、ベイクしたライティングは行われなくなります。Lighting ウィンドウで Generate Lighting を選択し、ライトを手動で再ベイクします。

スクリプトを使用してシーンを開く場合は、自動生成されたライティングの完了を待つのではなく、Lightmapping.Bake または Lightmapping.BakeAsync を使用する必要があります。

グラフィックス形式 DepthAuto、ShadowAuto、VideoAuto が非推奨になりました

以下のグラフィックス形式は、2022.1 で非推奨になりましたが、現在は廃止され、使用するとコンパイルエラーが発生します。

  • GraphicsFormat.DepthAuto
  • GraphicsFormat.ShadowAuto
  • GraphicsFormat.VideoAuto

GraphicsFormatUtility.GetGraphicsFormat API が古い形式を返さなくなりました。代わりに以下の処理を行います。

  • RenderTextureFormat.DepthGraphicsFormat.DepthAuto ではなく GraphicsFormat.None に変換します。GraphicsFormat.None は深度のみのレンダリングを示します。
  • RenderTextureFormat.ShadowmapGraphicsFormat.ShadowAuto ではなく GraphicsFormat.None に変換します。GraphicsFormat.None 形式でレンダーテクスチャを作成する場合は、RenderTextureDescriptor.shadowSamplingMode を ShadowSamplingMode.CompareDepths に設定して深度比較サンプリングを有効にする必要があります。

GraphicsFormat.DepthAutoGraphicsFormat.ShadowAuto は両方とも深度ステンシル形式とみなされていましたが、カラーフォーマットとして使用されるため、コードの調整が必要な場合があります。

例えば、以下のスニペットでは、GraphicsFormatUtility.IsDepthFormattrue ではなく false を返します。

RenderTextureDescriptor desc = new RenderTextureDescriptor(256, 256, RenderTextureFormat.Depth, 32);
bool isDepthOnly = GraphicsFormatUtility.IsDepthFormat(desc.graphicsFormat);

RenderTexture または RenderTextureDescriptor が深度専用かどうかをチェックするには、以下のいずれかを使用します。

  • if (renderTexture.graphicsFormat == GraphicsFormat.None && renderTexture.depthStencilFormat != GraphicsFormat.None)
  • if (renderTexture.format == RenderTextureFormat.Depth || renderTexture.format == RenderTextureFormat.Shadowmap)

ミップマップ制限がデフォルトでランタイムテクスチャに影響を与えなくなりました

ランタイムに作成された 2D テクスチャのミップマップアップロードはデフォルトで制限されなくなります。以前は、ミップマップ制限は Texture2D コンストラクター (コンストラクターが TextureFormat で呼び出される場合は ignoreMipmapLimit ブーリアンパラメーター、GraphicsFormat で呼び出される場合は IgnoreMipmapLimit TextureCreationFlag を指定する) によって、または構築されたテクスチャの tex.ignoreMipmapLimit を切り替えることによって明示的に無効にする必要がありました。この動作が変更され、ランタイム作成の 2D テクスチャにミップマップ制限がオプトインされるようになりました

プロジェクトに変更を加えないと、以下の場合に、ユーザーは GPU 帯域幅とメモリの最適化を見逃し、テクスチャが最大解像度でアップロードされるようになったため、意図した水準よりも品質が低くなる可能性があります。

  • ランタイムテクスチャが品質設定に従うことを意図せずに想定しているユーザー。
  • ランタイムテクスチャを意図的に品質設定に従うように設定することを必要とし、デフォルトの Texture2D コンストラクターを使用してこれを実現したユーザー。

以下の場合、ユーザーはこの変更の影響を受けません。

  • ランタイムテクスチャをフル解像度で明示的に維持することを必要とするユーザー。
  • ランタイムテクスチャを意図的に品質設定に従うように設定することを必要とし、以下の明示的な設定によって実現したユーザー。
    • TextureFormat と ignoreMipmapLimitfalse であるコンストラクターを使用、
    • 構築後に tex.ignoreMipmapLimitfalse に設定。

これらのユーザーは、非推奨のコンストラクターを使用している場合は、スクリプトをアップグレードすることもできます。

スクリプトをアップグレードするには、MipmapLimitDescriptor を指定して Texture2D コンストラクターを使用し、ランタイムテクスチャが品質設定の影響を受けることを示します。

この変更は、Texture2DArrays の新しいミップマップ制限サポートとの一貫性を確保するために行われました。各テクスチャ形状によって独自のデフォルトのミップマップ制限に関する動作を定義するのではなく、一貫性を確報することを選択し、ランタイムテクスチャが明示的にミップマップ制限を有効にするようにしました。このオプトイン動作はオプトアウトよりも優先されます。ランタイムテクスチャは、予想よりも少ないミップを予期せずアップロードする方が、予想よりも多くのミップをアップロードするよりも有害であるため、より汎用性の高い方法で頻繁に使用されるためです。

UXML によるカスタムコントロールの作成が強化されました

UI Toolkit の UXML を使用することによるカスタムコントロールの作成をシンプルにし、ワークフローのスピードと直感的な操作性を向上させました。

主な改善点は、UxmlElement 属性と UxmlAttribute 属性の導入です。これらの属性は、属性のオーサリングを簡素化し、プロパティ名から属性名を自動的に派生させます。そのため、UxmlTraits クラスや UxmlFactory クラスは必要ありません。

特定のデータ型用のカスタム属性コンバーターを作成できるようになりました。これにより、UXML 属性文字列との間で値のシームレスな変換が可能になります。また、UxmlObject も強化され、カスタムの非ビジュアル要素をビジュアル要素内で定義できるようになりました。新しいシステムは、Unity のシリアル化を活用し、ソースジェネレーターを使用して、各カスタム要素クラスのすべての UxmlAttribute 定義から要素の UxmlSerializedData クラスを作成し、カスタムプロパティドロワー、デコレーター、およびさまざまな属性をサポートできるようにします。

“属性オーバーライド” の導入により、UXML 属性の動作をカスタマイズでき、継承された属性を使用する際の柔軟性が向上します。これらの改善により、Unity 2023.2 以降で複雑な UI 要素を作成するためのより効率的でユーザーフレンドリーな操作性が実現します。

例えば、以下のコードサンプルは、UxmlFactoryUxmlTraits を使用して作成したカスタムコントロールです。

public class HealthBar : VisualElement
{
   private const float k_LowValue = 0;
   private const float k_HighValue = 100;

   // Declare as usable with Uxml
   public new class UxmlFactory : UxmlFactory<HealthBar, UxmlTraits> { }
   // Define attributes (and connect with class properties) for Uxml 
   public new class UxmlTraits : BindableElement.UxmlTraits
   {
       UxmlColorAttributeDescription m_Color = new UxmlColorAttributeDescription { name = "color", defaultValue = Color.white };
       UxmlFloatAttributeDescription m_Value = new UxmlFloatAttributeDescription { name = "value", defaultValue = k_HighValue };

       public override void Init(VisualElement ve, IUxmlAttributes bag, CreationContext cc)
       {
           base.Init(ve, bag, cc);
           var bar = ve as HealthBar;
           bar.color = m_Color.GetValueFromBag(bag, cc);
           bar.value = m_Value.GetValueFromBag(bag, cc);
       }
   }

   public Color color { get; set; }

   [Range(k_LowValue, k_HighValue)]
   public float value { get; set; }
}

以下のコードサンプルは、以前のコードサンプルと同じ動作をしますが、新しい UxmlElementUxmlAttributes システムを使用します。

[UxmlElement]
public class HealthBar2 : VisualElement
{
   private const float k_LowValue = 0;
   private const float k_HighValue = 100;

   [UxmlAttribute]
   public Color color { get; set; } = Color.white;

   [UxmlAttribute]
   [Range(k_LowValue, k_HighValue)]
   public float value { get; set; } = k_HighValue;
}

その他の例と情報については、Unity UI Toolkit ドキュメントを参照し、今秋の詳細なブログ投稿にご期待ください。

Assets/Create メニューとスクリプトテンプレートが再編成されました

Assets/Create メニューが再編成され、分類されました。このオーバーホールの一環として、Unity ビルトインスクリプトテンプレートファイルの名前が変更されました。

CreateAssetMenuAttribute``, MenuItemAt 属性またはカスタムスクリプトテンプレートを使用して Assets/Create メニューに要素を追加したユーザーは、他の要素に対する相対的な配置が異なるため、メニュー項目の優先順位を変更することが必要な可能性があります。

EditorApplication.ExecuteMenuItem API でこれらのメニュー項目を実行してアセットを作成していたユーザーは、メニュー項目への新しいパスを確認する必要があります。

以前に Unity ビルトインスクリプトテンプレートをオーバーライドしたことがあるユーザーは、オーバーライドファイルの名前を更新して、ビルトインの新しい名前と一致することを確認する必要があります。

UI Toolkit イベント処理の再編成と簡素化

ExecuteDefaultAction メソッドと ExecuteDefaultActionAtTarget メソッドは非推奨になりました。これらを置き換えるために以下のメソッドが追加されました。

  • HandleEventTrickleDown
  • HandleEventBubbleUp

Unity は、イベントディスパッチパスの各要素に対して、対象要素のコールバックの TrickleDown の直後と BubbleUp の前にこれらの新しいメソッドを実行します。これらのメソッドの間、ディスパッチフェーズはそれに応じて TrickleDown または BubbleUp に設定され、イベントの `currentTarget` はメソッドを実行する要素と一致します。

AtTarget ディスパッチフェーズと PreventDefault メソッドは非推奨になりました。StopPropagation または StopPropagationImmediately の呼び出しは、HandleEventTrickleDown および HandleEventBubbleUp コールバックの以降の呼び出しを停止すると同時に、TrickleDown および BubbleUp コールバックの以降の実行を停止するようになりました。

新しいメソッドにアップグレードしないほとんどの場合について、コードの動作に大きな変化はありません。UI Toolkit は、古いメソッドを以前と同じ順序、または最小限の調整を行った状態で呼び出します。ただし、UI Toolkit 内のすべての標準コントロールは新しいメソッドを使用するように移行されロジックの実行順序が適宜調整されています。古いメソッドの呼び出しとアップグレードされたコントロールの使用を混在させると、一部のロジックが以前のバージョンの Unity に対して同期しない場合があります。

既存のコードを新しいメソッドにアップグレードするには、次の手順に従います。

  • ExecuteDefaultActionExecuteDefaultActionAtTargetHandleEventBubbleUp で置換し、PreventDefaultStopPropagation で置換します (または、StopPropagation が同じコードブロック内ですでに呼び出されている場合は、PreventDefault の呼び出しを削除します。これは、ほとんどのケースをカバーします)。
  • BubbleUp コールバック中の古いコード呼び出し PreventDefault が原因で問題が発生し、それが不可能になり、イベントがすでにターゲットに達しているために StopPropagation で置き換えることができない場合は、StopPropagation を呼び出す TrickleDown フェーズでコールバックを追加することを検討してください。通常は、このステップでこのようなシナリオに十分に対処できます。
  • 上記の変更が古いコードの機能を維持するのに十分ではないまれなケースでは、ケースバイケースの徹底分析が必要です。これらのコンテキストでは、解像度は必ずしも単純ではない可能性があります。
Unity 6 へのアップグレード
Unity 2023.1 へのアップグレード
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961