Unity は Procedural Materials と呼ばれる新しいアセットの種類を導入しています。これらは本質的に標準的なマテリアルと同じですが,それらが使用するテクスチャは,事前に定義されて格納されるのではなく,実行時に生成することができます。
テクスチャをプロシージャルに生成するスクリプトコードは一般的にストレージ上で使用する容量や転送量がビットマップ画像より小さく,このためプロシージャル マテリアルはダウンロード時間を節約できます。さらに,生成スクリプトはマテリアルの実行時の見栄えのプロパティに幅を持たせるためのパラメータを持たせることができます。これらのプロパティはカラーのバリエーションから壁のブロックのサイズまで種類があります。これはひとつのプロシージャル マテリアル から多くのバリエーションが生成できることを意味するだけでなくマテリアルをフレームごとの単位でアニメーションできるという意味です。多くの興味深い視覚効果が実現できます - 例えばキャラクターが徐々に石に変わったり,硫酸が表面に触れて傷つける瞬間を創造してみてください。
Unity のプロシージャル マテリアル システムは, Allegorithmic によって開発された, Substanceと呼ばれる業界標準の商品にもとづいています。
Unityではプロシージャル マテリアルはスタンドアローンおよびWebPlayerビルド向けのターゲット(Windows および Mac OS X)で完全にサポートされています。他のすべてのプラットフォームでは,Unity は 事前レンダリングまたは通常のマテリアルへの 焼きこみ をビルドの際に行います。これは実行時のプロシージャル生成の長所を打ち消すにも関わらず,エディター上で基本的なマテリアルのバリエーションを作成するには便利です。
プロシージャル マテリアルは Substance Archive ファイル (SBSAR) として提供されていて,他のアセット同様にインポートできます(Assets フォルダに直接ドラッグ&ドロップするか,または,
を使用します)。Substance Archive アセットはひとつ以上の プロシージャルマテリアル を含み,さらにこれが必要とする全てのスクリプトおよび画像を含みます。コンパイルされてない SBS ファイルは未サポートです。別に実装されているにも関わらず,Unity は他のマテリアルと同様にプロシージャル マテリアルを取り扱います。例えばプロシージャルマテリアルをメッシュに割り当てるには,他のマテリアルと同様にメッシュ上にドラッグ&ドロップするのみです。
各々のプロシージャル マテリアルは,特定のマテリアルの種類を生成するカスタムスクリプトです。これらのスクリプトがUnityスクリプトと共通しているのは,インスペクタ上に変数を公開して,アクセスすることができることです。たとえば,“レンガの壁” プロシージャル マテリアルによって プロパティを公開して,レンガの列の数,レンガの色,モルタルの色などセットすることが出来ます。潜在的には,ひとつのアセットから無限にマテリアルのバリエーションが作成できることになります。これらのプロパティは,MonoBehaviour スクリプトのパブリック変数と同様に,実行時にスクリプトからセットすることが出来ます。
さらにプロシージャル マテリアルは複雑なテクスチャ アニメーションを取り扱うことが出来ます。例えば,時計の針または床を這うゴキブリをアニメーションできます。
プロシージャルマテリアルはプロシージャルに生成されたテクスチャおよび格納されたビップマップの任意の組み合わせで動作します。さらに,含まれるビットマップ画像は使用前にフィルタリングおよび修正が出来ます。標準的なマテリアルと異なって,プロシージャル マテリアルは解像度に依存しないテクスチャとして,SVGファイルの形式でベクトル画像を使用できます。
ゼロからプロシージャルマテリアルを作成するために利用可能なデザイン ツール はアーティストの使用するツールと同様に 視覚的で,ノードベースの編集が出来ます。これによりコーディングがほとんど,または全く経験のないアーティストでも作成が可能となります。例として,Allegorithmic の Substance Designer により “レンガの壁” のプロシージャル マテリアル作成中のスクリーンショットを示します。
Unity のプロシージャル マテリアルが業界標準の Substance 製品に基づいているため, プロシージャル マテリアル アセットはインターネット上の情報から,すなわち Unity のアセットストアを含めて,ただちに利用可能です。Allegorithmic の Substance Designer を使用してプロシージャル マテリアル を作成できますが,Substance テクノロジーを取り扱う他のアプリケーション(例えば 3D モデリングアプリケーション)があり,同様にUnity と親和性があります。
プロシージャル マテリアルは本質的にビットマップ画像よりも少ない容量を使用する傾向があります。しかし,トレードオフとして,スクリプトにもとづいていて,そのマテリアルを生成するスクリプトの実行は CPU および GPU リソースを消費します。プロシージャル マテリアルが複雑であるほど,実行時のオーバーヘッドが大きくなります。
プロシージャル マテリアルはキャッシングの一種をサポートし,マテリアルはもし最後生成されたとき以降に変更されていれば,そのパラメータを更新します。さらに,いくつかのマテリアルは理論的には変更できるいくつかのプロパティがあり,実際には実行時に変更する必要性があるのはわずかはです。そういった場合, Unity に更新されない変数を伝えて,前回のマテリアル生成のデータを出来るかぎりキャッシュさせるようにすることが出来ます。一般的にこれによってパフォーマンスは著しく改善されます。
プロシージャル マテリアルは隠れた,システム全体に渡った変数,例えば経過時間またはプロシージャル マテリアルの数など(このデータはアニメーションに便利),を参照することが出来ます。これらの変数の値の変更により,たとえ明示的に定義されたパラメータのうちひとつも変更されていない場合も,強制的にプロシージャル マテリアルが更新される場合があります。
プロシージャル マテリアルはエディターでの便利機能として純粋に使用できます(すなわち,プロシージャル マテリアルのパラメータをセットして, “焼き込む” ことにより標準マテリアルを生成できます)。これによりマテリアル生成の実行時オーバーヘッドを取り除きますが,当然ながら焼き込みされたマテリアルはゲームプレイの際は変更やアニメーションが出来ません。
プロシージャル マテリアルの複雑さにより実行時パフォーマンスが影響されることがあるため,Allegorithmic 社は Substance Player ツールの中でプロファイリング機能を提供しています。このツールは無料で Allegorithmic ウェブサイト よりダウンロード出来ます。
サブスタンス プレイヤーは Unity に統合されている最適化されたレンダリング エンジンと同等のエンジンを使用するため,レンダリングの測定は Substance Designer よりも Unity でのパフォーマンスを正しく表現します。