Unity udim_multipleマテリアル:UDIMマテリアルにカスタムインスペクターとスクリプト可能なオブジェクトを使用する



Unity Udim_multiple Materials



Unity udim

UnityLabsチーム Unityを使用して、最高の忠実度で非リアルタイムのレンダリング用に設計されたフィルム品質のアセットを60以上のFPSの世界に導入する実験を行っています。映画やテレビのフォーマットやパイプライン(Ptex、USD、UDIMなど)はリアルタイムエンジンでは広くサポートされていないため、これらのアセットを操作するには新しい技術とツールが必要です。これらのアセットのサイズと密度に関する明らかな問題以外にも、単一のアセット(UDIMの場合など)に関連する多数のマテリアルとテクスチャファイルが存在する可能性があり、これらを簡単に操作して変更する必要があります。 。このワークフローを合理化するために、これらすべてのマテリアルの管理と操作を支援する新しいマルチマテリアルエディタを作成しました。



UnityLabsチーム 映画品質のアセット(最大の忠実度を達成するように設計されていますが、リアルタイムレンダリングは実現しないように設計されています)をUnity 60 + FPSの世界に持ち込む試みが行われています。リアルタイムエンジンは映画やテレビのフォーマットやパイプライン(Ptex、USD、UDIMなど)を広くサポートしていないため、これらのアセットを使用するには新しいテクノロジーとツールが必要です。これらのアセットのサイズと密度の明らかな問題に加えて、単一のアセットには通常、多数のマテリアルファイルとテクスチャファイル(UDIMなど)が含まれ、これらを簡単に操作して変更する必要があります。このワークフローを簡素化するために、これらすべてのマテリアルの管理と操作を支援する新しい「マルチマテリアルエディタ」を作成しました。

UDIMおよびその他のマルチタイルUVマッピング手法は、新しいファイルタイプではなく、UVingのパイプラインと、ソーステクスチャファイルに名前を付けるための一連の規則です。これらのマルチタイルUVマッピング技術は、現在のマテリアルインスペクターで同時に編集および同期を維持するのに合理的な数を超えてマテリアルの数を増やす可能性があり、毎回マテリアルをマルチ選択することはあまり実用的ではありません。



UDIMおよびその他のマルチタイリングUVマッピングテクノロジーは、新しいファイルタイプではなく、UVingのパイプラインであり、ソーステクスチャファイルに名前を付けるための一連の規則です。これらのマルチタイリングUVマッピング手法は、妥当な範囲を超えてマテリアルの数を増やす可能性があり、同時に編集して現在のマテリアルインスペクターと同期することはできず、毎回複数回マテリアルを選択することは現実的ではありません。

マルチマテリアルエディタでは、個々のタイルには、最も一般的なパイプラインであるソースアセットからの独自のマテリアル割り当てがあると想定しています。パイプラインに当てはまらない場合は、カスタムメッシュインポーターを使用して、アセットのインポート時にメッシュを対応するマテリアルを持つ個々のサブメッシュに分割できます。

「マルチマテリアルエディタ」では、各タイルに、最も一般的なパイプラインであるソースアセットからのマテリアル割り当てがあると想定しています。これがパイプラインに当てはまらない場合は、カスタムメッシュインポーターを使用して、アセットのインポート中にメッシュを対応するマテリアルを持つ個々のサブメッシュに分割できます。



入門((入門)。

ダウンロード マルチマテリアルエディタ。インストールするには、Unity5.5以降でプロジェクトを作成するだけです。次に、このリポジトリをプロジェクトのアセットフォルダに追加します。 [作成]メニューのプロジェクトビューを右クリックしてアクセスできる、2つの新しいスクリプト可能なオブジェクトタイプがあります。

ダウンロード マルチマテリアルエディタ。インストールするには、Unity5.5以降でプロジェクトを作成するだけです。次に、このリポジトリをプロジェクトのアセットフォルダーに追加します。 [作成]メニューのプロジェクトビューを右クリックすると、2つの新しいスクリプト可能なオブジェクトタイプにアクセスできます。

マテリアルテクスチャ設定は、[作成]> [マルチマテリアル]> [マテリアルテクスチャ設定]の下にあり、UDIMマテリアルにテクスチャを割り当てるために使用できます。カスタムインスペクターは、選択したマテリアルにテクスチャ設定を適用でき、マテリアルとテクスチャがUDIM規則に従って名前が付けられていると想定します。 Texture Nameはテクスチャフィールドのマテリアルプロパティ名であり、SearchDirはそのマテリアルプロパティのテクスチャを含むディレクトリです。マルチマテリアルデータは、[作成]> [マルチマテリアル]> [マルチマテリアルデータ]の下にあり、マルチマテリアルコンポーネントで使用するためのマテリアルの配列を保持します。または、スクリプト可能なオブジェクトのインスペクタからマテリアルを直接変更できます。マルチマテリアルコンポーネントをゲームオブジェクトに追加して、オブジェクトのレンダラーの共有マテリアル配列を制御できます。マルチマテリアルデータがレンダリングから作成された場合、またはプロジェクトから割り当てられた場合、そのデータはここで変更できます。これは、一度に変更する必要があるマテリアルのグループを共有する複数のオブジェクトがある場合に役立ちます。

「マテリアルテクスチャ設定」は「作成」>「複数のマテリアル」>「マテリアルテクスチャ設定」の下にあり、UDIMマテリアルにテクスチャを割り当てるために使用できます。カスタムインスペクターは、選択したマテリアルにテクスチャ設定を適用でき、マテリアルとテクスチャがUDIM規則に従って名前が付けられていると想定します。 「テクスチャ名」はテクスチャフィールドのマテリアル属性名であり、「検索ディレクトリ」はマテリアル属性のテクスチャを含むディレクトリです。 「マルチマテリアルデータ」は「作成」>「マルチマテリアル」>「マルチマテリアルデータ」の下にあり、「マルチマテリアルコンポーネント」の一連のマテリアルが含まれています。または、スクリプト可能なオブジェクトのインスペクタから直接変更することもできます。材料。マルチマテリアルコンポーネントをゲームオブジェクトに追加して、オブジェクトレンダラーの「共有マテリアル」配列を制御できます。レンダリングから作成された場合、またはプロジェクトから割り当てられた場合、「複数のマテリアルデータ」をここで変更できます。これは、すぐに変更する必要がある一連のマテリアルを共有する複数のオブジェクトがある場合に役立ちます。

ツールについて((ツールについて)。

テクスチャ割り当ての場合を除いて、オブジェクト上またはオブジェクト間で複数のマテリアルを1つのマテリアルであるかのように操作できるツールが必要です。ほとんどのオプションを許可するために、マテリアルデータを独自のクラスに分割して、オブジェクトのレンダラーに基づいてコンポーネントで作成およびシリアル化するか、スクリプト可能なオブジェクトにアセットとして保存して、複数のオブジェクト間で共有できるようにします。次に、別のカスタムドロワークラスを使用して、この単一のカスタムインスペクター内のすべてのマテリアルを表示するためのカスタムインスペクターを作成しました。これは標準の材料検査官を使用しますが、使用している可能性のあるカスタム材料検査官もサポートします。

このツールは、1つのオブジェクトまたは複数のオブジェクト上の複数のマテリアルを1つのマテリアルであるかのように操作できるようにするために必要です(テクスチャ割り当ての場合を除く)。最も多くの選択肢を提供するために、マテリアルデータを独自のクラスに分割して、マテリアルデータをオブジェクトレンダラーベースのコンポーネントで作成およびシリアル化するか、複数のオブジェクトで使用するためにスクリプト可能なオブジェクトにアセットとして保存できるようにします。の間に。次に、別のカスタムドロワークラスを使用して、その単一のカスタムインスペクター内のすべてのマテリアルを表示するカスタムインスペクターを作成しました。これは標準のマテリアルチェッカーを使用しますが、使用する可能性のあるカスタムマテリアルチェッカーもサポートします。

マテリアル、特にUnity Standard Shaderは、インスペクターにロジックが組み込まれたカスタムUIを使用するため、標準を使用することはできません。 プロパティドロワー マテリアルのシリアル化されたプロパティの場合。つまり、意味のある方法でマテリアルを操作するには、カスタムインスペクター内でマテリアルエディターインスペクターを使用する必要があります。挿入されたエディターを作成および管理すれば、エディターの図面(パブリックGUIメソッドを含む)を別のエディターまたはEditorWindow内に挿入することができます。マルチマテリアルエディタでは、MaterialArrayDrawersクラスを使用すると、MultiMaterialEditorおよびMultiMaterialDataEditorに表示されるように、マテリアルエディタを使用してそれを実行できます。このエディターに使用されるコーディングパターンは、別のエディター内にインスペクターを描画する他の場合にも使用できます。これは、カスタムインスペクターを描画する場合に役立ちます。 スクリプト可能なオブジェクト そのオブジェクトを使用するコンポーネントに直接。

マテリアル(特にUnity Standard Shader)はカスタムUIを使用し、インスペクターに組み込まれているため、標準を使用することはできません。 プロパティドロワー ' 材料に使用されるシリアル化されたプロパティ。つまり、意味のある方法でマテリアルを操作するには、カスタムインスペクターで「マテリアルエディター」インスペクターを使用する必要があります。挿入されたエディターを作成および管理する場合、エディターのグラフィックス(およびそのパブリックGUIメソッド)を別のエディターまたはEditorWindowに挿入できます。マルチマテリアルエディタでは、MaterialArrayDrawersクラスを使用すると、MultiMaterialEditorおよびMultiMaterialDataEditorに表示されるマテリアルエディタを使用してこれを行うことができます。別のエディターでインスペクターを描画する場合、コンポーネントでオブジェクトを直接使用する場合は、このエディターで使用されるコーディングモードを使用することもできます。 スクリプト可能なオブジェクト このメソッドは、カスタムインスペクターを描画するのに役立ちます。

別のエディタのOnInspectorGUI内に描画しようとする場合、マテリアルエディタのパフォーマンスとインタラクションの制限の両方について留意すべき重要なことがいくつかあります。まず、ヘッダーGUIは、インスペクターで設定したレイアウトと四角形のコンテキストを変更できます。また、ヘッダーにコントロール(シェーダーメニューなど)が含まれている場合、そのコントロールの変更を検出することはできません。 BeginChangeCheck そして EndChangeCheck 。これは、シェーダー選択の変更が発生したときに同期できないことを意味します。シェーダーの同期を維持するために、DrawMaterialHeaderMaterialView()を使用してマテリアルヘッダーを可能な限り近くに再作成します。マテリアルエディターに反映してエディターの本体を表示する必要があるisVisibleFieldと、内部エディターの描画スタイルを複製しようとするが、Unity内部シェーダーが既にロードされていない限り表示できないShaderPopupに注意してください。

別のエディターのOnInspectorGUI内でマテリアルエディターを描画しようとする場合、パフォーマンスとインタラクションの制限に関して留意すべき重要なことがいくつかあります。まず、タイトルGUIは、インスペクターで設定したレイアウトと長方形のコンテキストを変更できます。同様に、タイトルにコントロール(シェーダーメニューなど)が含まれている場合、それは使用できません。 BeginChangeCheckEndChangeCheck コントロールの変更を検出します。これは、シェーダーの選択が変更されると、それを同期できなくなることを意味します。シェーダーの同期を維持するために、DrawMaterialHeaderMaterialView()を使用して、マテリアルヘッダーを可能な限り近くに再作成します。 isVisibleFieldとShaderPopupに注意してください。エディターの本体を表示するには、マテリアルエディターをそれらに反映する必要があります。 ShaderPopupでは、内部エディターのグラフィックスタイルをコピーしようとしますが、ロードされない限り、Unityの内部シェーダーを表示できません。

次に、マテリアルエディタのOnInspectorGUI()全体を描画しているため、どのプロパティドロワーが変更されたかはわかりません。ただ、OnInspectorGUI()ブロック内の何かが変更されただけです。これは、他のマテリアルと同期する必要がある可能性のある、マテリアルのどこかに潜在的な変更があることを意味します。少量のマテリアルのすべてのプロパティをカラーピッカーなどのインタラクティブコントロールと継続的に同期すると、パフォーマンスに大きな影響を与える可能性があります。

次に、マテリアルエディタ全体のOnInspectorGUI()を描画しているため、どのプロパティドロワーが変更されたかはわかりません。変更されたのは、OnInspectorGUI()ブロックの一部のコンテンツのみです。これは、マテリアルのどこにでも、他のマテリアルと同期する必要がある可能性のある潜在的な変更があることを意味します。カラーピッカーなどのインタラクティブコントロールを使用して、マテリアルのごく一部でもすべてのプロパティを継続的に同期すると、パフォーマンスに大きな影響を与えます。

したがって、マテリアルを同期するときに最高のパフォーマンスを得るには、変更されたプロパティのみを変更する方法が必要です。アクティブに変更されたマテリアルとマルチマテリアルの最初の異なるマテリアルをすばやく比較し、2つのマテリアル間でテクスチャを除いて異なるシリアル化されたプロパティのみをキャッシュします。次に、それらのキャッシュされた変更を他のすべてのマテリアルにのみ適用します。残念ながら、材料が大きく異なる場合は誤検知が発生する可能性があります。また、比較対象の材料と一致する場合は、変更を見逃す可能性があります。回避策として、マルチマテリアル全体のすべてのプロパティをコピーする[マテリアルに同期]ボタンをアクティブマテリアルに追加しました。

したがって、マテリアルを同期するときに最高のパフォーマンスを得るには、変更されたプロパティのみを変更する方法が必要です。アクティブに変更されたマテリアルと「マルチマテリアル」の最初の異なるマテリアルをすばやく比較し、テクスチャを除いて2つのマテリアル間のシリアル化された属性のみをキャッシュしました。次に、キャッシュされた変更のみを他のすべてのマテリアルに適用します。残念ながら、材料が大きく異なる場合、誤検知が発生する可能性があります。または、比較対象の材料と一致する場合は、変更を見逃す可能性があります。解決策は、アクティブマテリアルに[マテリアルに同期]ボタンを追加したことです。これにより、[複数のマテリアル]のすべての属性をコピーできます。

マルチマテリアルとそのエディターは、プロジェクトで必要になる可能性のある特定のワークフローに合わせてUnityのUIをカスタマイズする方法を示しています。探索する将来の領域は、別のコンポーネントのインスペクター内に複数のエディターを表示するためのより一般的なドロワーの構築、同期するシリアル化されたプロパティのフィルタリング(テクスチャを無視するだけでなく)、アニメーション化されたマテリアルの処理、および/またはマルチとのランタイムスクリプトの相互作用です。 -材料。

さまざまな資料とそのエディターが、プロジェクトで必要となる可能性のある特定のワークフローに合わせてUnityのUIをカスタマイズする方法を示しています。将来的に調査する必要がある領域は、別のコンポーネントのインスペクターに複数のエディターを表示するためのより一般的なドロワーを構築し、同期するシリアル化されたプロパティをフィルター処理し(たとえば、テクスチャを無視するだけでなく)、アニメーションマテリアルを処理することです。マルチマテリアルと組み合わせたランタイムスクリプトインタラクション。

翻訳元: https://blogs.unity3d.com/2017/08/01/multi-material-using-custom-inspectors-and-scriptable-objects-for-udim-materials/

Unity udim