あるマテリアルへの変更を、他の複数のマテリアルに自動的に適用したいと思ったことはありませんか。あるいは、局所的な微調整をやるときにベースとなるマテリアルを再利用したいと思ったこともあるのではないでしょうか。Unity 2022.1 では、エディターでマテリアルバリアントを管理するために、すべてのレンダーパイプラインと互換性のあるプレハブと同様の概念を導入しています。
チームや個人のクリエイターが複数のマテリアルを同時に管理できるように作られたマテリアルバリアントは、コラボレーションの向上、マテリアルの再利用性の向上、イテレーションの速度向上、およびスムーズな更新とエラーのリスク軽減によるアセットライブラリの充実を可能にします。サーフェスのプロパティの多くが共通ながら、いくらかだけ異なるマテリアルを再利用し、より精緻に管理するためのソリューションとして求める声が高かったものです。
マテリアルバリアントを使うと、通常のマテリアルをベースにしたテンプレートやマテリアルプレハブを作成することができます。テンプレートとなるマテリアルから共通のプロパティを持つバリアントを作成し、異なるプロパティのみをオーバーライドすることができます。
テンプレートのマテリアルの共通プロパティやオーバーライドされないプロパティの変更は、自動的にバリアントのマテリアルに反映されます。また、マテリアルの特定のプロパティをバリアントでオーバーライドできないようにロックすることもできます。
例として、プロジェクトにおける木材のマテリアルのバリエーションのヒエラルキーをこのように設定することができます。
Wood
Wood マテリアルでスムースネスやメタリックのプロパティを変更すると、ヒエラルキー内のすべてのマテリアルに変更が自動的に反映されます。
ここでは、マテリアルバリアントの3つの主な利点を紹介します。
マテリアルバリアントは通常のマテリアルアセットですが、オーバーライドされたパラメーターのリストに加えて、親への参照が保存されています。エディターでの強力なパフォーマンスを保証するために、継承された値はキャッシュされます。マテリアルがアクセスを受け、その親のいずれかが最後に解決された後に変更された場合にのみ、再度ヒエラルキーの解決が行われます。
プレハブとは異なり、マテリアルバリアントはアセットデータベースに依存することなくヒエラルキーを維持します。ヒエラルキーに変更があった場合、内部的に子のマテリアルを再インポートする必要がなく、メモリ上に読み込まれた子のマテリアルのみが新しく継承された値で更新されるため、より高速なイテレーションが可能になります。
ただし、マテリアルバリアントの概念はマテリアルオーサリングのワークフローを改善するために存在し、エディターでのみ有効であることに注意してください。実行時には何の影響もなく、実行時の全体的な性能の最適化には役立ちません。同じシェーダーを使用する限り、異なるプラットフォーム間で異なるマテリアルをオーサリングするために使用することができます。1 つのマテリアルバリアントのヒエラルキーにつき、1 つのシェーダーしか設定できないため、特定のレベルに固有のシェーダーを設定して、特定のプラットフォームをターゲットにすることはできません。しかし、マテリアルバリアントを使用することで、マテリアルのプロパティを編集したり、プラットフォームをターゲットにする際に特定のキーワードを有効にしたりすることができます。
マテリアルバリアントは親からキーワードを受け継ぎません。これは、キーワードの状態が他のプロパティの値に依存することが多いからです。例えば、あるキーワードが、テクスチャがマテリアルに割り当てられたときのみ設定されるかもしれません。このワークフローをサポートするために、ShaderGUI クラスに ValidateMaterial という新しい API を追加しました。このメソッドは、ShaderGUI を使用するマテリアルが変更されるたびに、またはマテリアルバリアントの場合は、そのヒエラルキーが解決されるたびに呼び出されます。これにより、キーワードの状態を最新に保つことができます。
最後に、Material Inspector のフィールドのカスタム GUI を作成する場合、プレハブについてはすでに用意されている関数と同様の関数が追加されました。BeginProperty と EndProperty です。これらの呼び出しの間にプロパティのカスタム GUI コードをラップすると、Unity にロックアイコンが表示され、マテリアルバリアントのコンテキストメニューが表示されます。
マテリアルバリアントを使用するには、Unity 2022.1 以降をご利用いただく必要があります。
マテリアルバリアントは既存のマテリアルと互換性があります。既存のマテリアルのバリアントを作成するには、プロジェクトウィンドウで、マテリアル アセットを右クリックし、Create > Material Variant を選択してください。また、既存のマテリアルをマテリアルバリアントに変換することも可能です。これは、すでに重複したマテリアルがあり、それらをプロジェクト内の新しいワークフローで再び共通の親マテリアルの子にしたい場合に便利です。
さらに、親マテリアルの一部のプロパティをロックして子マテリアルが変更できないようにしたり(サーフェスオプションなど)、親マテリアルに影響しない子マテリアルのプロパティを変更したり(ベースマップカラーなど)、すべての子マテリアルに適用する必要がある変更を親に適用したり(新しいベースマップテクスチャなど)することが可能です。
どの時点でも、マテリアルバリアントのヒエラルキーをチェックして、どのレベルで行った変更の影響も確認できますし、ヒエラルキーの正しいレベルで変更を行っているかどうかも確認できます。マテリアルバリアントは、親子関係の再設定、巻き戻し、上向きのオーバーライドの適用など、多くの便利な機能を提供します。詳しくは、こちらのドキュメンテーションをご覧ください。
現段階では新機能の計画はまだなく、現在は安定性の確立に集中しています。フィードバックやご質問は、専用の Unity フォーラムのスレッドで受け付けています。
このシステムをお試しいただいた後、私たちの初期設計の品質を検証するために、少し時間をいただきこちらのアンケートにご協力いただけると幸いです。新機能の提案や検討中の機能への投票については、こちらから公開ロードマップをご覧くだ