Unity を検索

マテリアルバリアント:複雑なマテリアルライブラリを管理するためのソリューション

2022年8月3日 カテゴリ: Engine & platform | 10 分 で読めます
Different color Unity logo spheres on a shelf
Different color Unity logo spheres on a shelf
取り上げているトピック
シェア

あるマテリアルへの変更を、他の複数のマテリアルに自動的に適用したいと思ったことはありませんか。あるいは、局所的な微調整をやるときにベースとなるマテリアルを再利用したいと思ったこともあるのではないでしょうか。Unity 2022.1 では、エディターでマテリアルバリアントを管理するために、すべてのレンダーパイプラインと互換性のあるプレハブと同様の概念を導入しています。

マテリアルバリアントを使う準備をする

チームや個人のクリエイターが複数のマテリアルを同時に管理できるように作られたマテリアルバリアントは、コラボレーションの向上、マテリアルの再利用性の向上、イテレーションの速度向上、およびスムーズな更新とエラーのリスク軽減によるアセットライブラリの充実を可能にします。サーフェスのプロパティの多くが共通ながら、いくらかだけ異なるマテリアルを再利用し、より精緻に管理するためのソリューションとして求める声が高かったものです。

Material Variants hierarchy settings in Unity
マテリアルバリアントのヒエラルキーの閲覧

マテリアルバリアントを使うと、通常のマテリアルをベースにしたテンプレートやマテリアルプレハブを作成することができます。テンプレートとなるマテリアルから共通のプロパティを持つバリアントを作成し、異なるプロパティのみをオーバーライドすることができます。

Smoothness Override in a child material
子マテリアルにおけるスムースネスのオーバーライド

テンプレートのマテリアルの共通プロパティやオーバーライドされないプロパティの変更は、自動的にバリアントのマテリアルに反映されます。また、マテリアルの特定のプロパティをバリアントでオーバーライドできないようにロックすることもできます。

Lock the material’s properties to prevent them from being overridden in the variants.
マテリアルの特定のプロパティをバリアントでオーバーライドできないようにロックする。

例として、プロジェクトにおける木材のマテリアルのバリエーションのヒエラルキーをこのように設定することができます。

Wood

  • Oak:テクスチャは異なるが、スムースネスとメタリックのプロパティは Wood と同じ。
    • White Oak:Oak とベースカラーの色合いだけが異なる。
    • Red Oak:Oak とベースカラーの色合いだけが異なる。
  • Cherry:テクスチャは異なるが、スムースネスとメタリックのプロパティは Wood と同じ。

Wood マテリアルでスムースネスやメタリックのプロパティを変更すると、ヒエラルキー内のすべてのマテリアルに変更が自動的に反映されます。

洗練された再利用性で、より高速なイテレーションを実現

ここでは、マテリアルバリアントの3つの主な利点を紹介します。

  • 再利用性の向上:プロジェクト間で共有されるベースマテリアルのライブラリを効率的に構築し、特定のプロジェクトやシーンでそれらをオーバーライドすることができます。
  • 規模に応じた安全でスピーディなイテレーション 多くのマテリアルが扱われ、複数のアーティストが参加する中規模から大規模のプロジェクトでは、シーンやインスタンスごとに微調整が必要なときにマテリアルバリアントを使用すると、すべてのマテリアルをコピーする手間を省くことができます。アーティストは、関連するマテリアルの変更のし忘れ(または戻し忘れ)や、パフォーマンスに影響する別のシェーダーの使用などによるビジュアル上のバグ発生を防ぐために重複するマテリアルを追跡する必要がありましたが、これが必要なくなります。
  • シェーダーグラフで作ったマテリアルによる効率化:シェーダーグラフで作ったシェーダーによって自動生成されたマテリアルからバリアントを作成する場合、グラフのブラックボードで設定されたデフォルト値がすべての子バリアントに自動的に伝搬されるため、シェーダーグラフから直接 Base Material プロパティを編集でき、ブラックボードを通じて値を変更する場合はシーン内のリアルタイムなビジュアライゼーションも利用できます。

どのような仕組みになっているのか

マテリアルバリアントは通常のマテリアルアセットですが、オーバーライドされたパラメーターのリストに加えて、親への参照が保存されています。エディターでの強力なパフォーマンスを保証するために、継承された値はキャッシュされます。マテリアルがアクセスを受け、その親のいずれかが最後に解決された後に変更された場合にのみ、再度ヒエラルキーの解決が行われます。

プレハブとは異なり、マテリアルバリアントはアセットデータベースに依存することなくヒエラルキーを維持します。ヒエラルキーに変更があった場合、内部的に子のマテリアルを再インポートする必要がなく、メモリ上に読み込まれた子のマテリアルのみが新しく継承された値で更新されるため、より高速なイテレーションが可能になります。

ただし、マテリアルバリアントの概念はマテリアルオーサリングのワークフローを改善するために存在し、エディターでのみ有効であることに注意してください。実行時には何の影響もなく、実行時の全体的な性能の最適化には役立ちません。同じシェーダーを使用する限り、異なるプラットフォーム間で異なるマテリアルをオーサリングするために使用することができます。1 つのマテリアルバリアントのヒエラルキーにつき、1 つのシェーダーしか設定できないため、特定のレベルに固有のシェーダーを設定して、特定のプラットフォームをターゲットにすることはできません。しかし、マテリアルバリアントを使用することで、マテリアルのプロパティを編集したり、プラットフォームをターゲットにする際に特定のキーワードを有効にしたりすることができます。

スクリプトからマテリアルバリアントを操作する

マテリアルバリアントは親からキーワードを受け継ぎません。これは、キーワードの状態が他のプロパティの値に依存することが多いからです。例えば、あるキーワードが、テクスチャがマテリアルに割り当てられたときのみ設定されるかもしれません。このワークフローをサポートするために、ShaderGUI クラスに ValidateMaterial という新しい API を追加しました。このメソッドは、ShaderGUI を使用するマテリアルが変更されるたびに、またはマテリアルバリアントの場合は、そのヒエラルキーが解決されるたびに呼び出されます。これにより、キーワードの状態を最新に保つことができます。

最後に、Material Inspector のフィールドのカスタム GUI を作成する場合、プレハブについてはすでに用意されている関数と同様の関数が追加されました。BeginPropertyEndProperty です。これらの呼び出しの間にプロパティのカスタム GUI コードをラップすると、Unity にロックアイコンが表示され、マテリアルバリアントのコンテキストメニューが表示されます。

始めよう

マテリアルバリアントを使用するには、Unity 2022.1 以降をご利用いただく必要があります。

マテリアルバリアントは既存のマテリアルと互換性があります。既存のマテリアルのバリアントを作成するには、プロジェクトウィンドウで、マテリアル アセットを右クリックし、Create > Material Variant を選択してください。また、既存のマテリアルをマテリアルバリアントに変換することも可能です。これは、すでに重複したマテリアルがあり、それらをプロジェクト内の新しいワークフローで再び共通の親マテリアルの子にしたい場合に便利です。

さらに、親マテリアルの一部のプロパティをロックして子マテリアルが変更できないようにしたり(サーフェスオプションなど)、親マテリアルに影響しない子マテリアルのプロパティを変更したり(ベースマップカラーなど)、すべての子マテリアルに適用する必要がある変更を親に適用したり(新しいベースマップテクスチャなど)することが可能です。

どの時点でも、マテリアルバリアントのヒエラルキーをチェックして、どのレベルで行った変更の影響も確認できますし、ヒエラルキーの正しいレベルで変更を行っているかどうかも確認できます。マテリアルバリアントは、親子関係の再設定、巻き戻し、上向きのオーバーライドの適用など、多くの便利な機能を提供します。詳しくは、こちらのドキュメンテーションをご覧ください。

今後の予定

現段階では新機能の計画はまだなく、現在は安定性の確立に集中しています。フィードバックやご質問は、専用の Unity フォーラムのスレッドで受け付けています。

このシステムをお試しいただいた後、私たちの初期設計の品質を検証するために、少し時間をいただきこちらのアンケートにご協力いただけると幸いです。新機能の提案や検討中の機能への投票については、こちらから公開ロードマップをご覧くだ

2022年8月3日 カテゴリ: Engine & platform | 10 分 で読めます
取り上げているトピック
関連する投稿