シェーダーによっては、複数のレンダーパイプラインを同時にサポートする必要があります。SubShader (サブシェーダー) と Pass (パス) にパッケージ要件を追加すると、シェーダーコードがインストールされていないパッケージのインクルードファイルを使用したり、コンパイルに特定のバージョンのパッケージ を必要とする場合に、コンパイルエラーを回避することができるようになります。
機能名 | ビルトインレンダーパイプライン | ユニバーサルレンダーパイプライン (URP) | HD レンダーパイプライン (HDRP) | カスタム SRP |
---|---|---|---|---|
ShaderLab:PackageRequirements ブロック | あり | あり | あり | あり |
サブシェーダーまたはパスのパッケージ要件を指定するには、PackageRequirements
ブロックを使用します。ShaderLab は 1 つのサブシェーダーまたはパスにつき 1 つの PackageRequirements
ブロックをサポートしますが、各ブロックは複数のパッケージ要件を指定することができます。
ノート: PackageRequirements
ブロックを提供する場合、これは、サブシェーダーまたは パス内の他のすべての宣言の前に来る必要があります。
シグネチャ | 機能 |
---|---|
PackageRequirements{ [要件定義]} |
パスまたはサブシェーダーのパッケージ要件を定義します。 |
パッケージの要求事項を宣言する方法は複数あります。それぞれ、異なる動作を提供します。それらは以下の通りです。
バージョン制限では、一連のバージョン範囲を定義します。必要なパッケージのインストール済みバージョンが、この範囲のいずれにも含まれていない場合、そのパッケージの要件は満たされていません。同様に、要件で Unity のバージョン制限のセットが指定されている場合は、Unity の現在のバージョンに適用されます。バージョン制限の構文については、バージョンの構文 を参照してください。
サブシェーダーやパスが、プロジェクトが満たさないパッケージ要件を宣言している場合、Unity はそのサブシェーダーやパスを以降の処理およびコンパイルから除外します。これは、プロジェクトに必要なパッケージが含まれていないか、含まれていても互換性のあるバージョンでない場合に起こります。シェーダーに要件を満たすサブシェーダーが 1 つもない場合、またはサブシェーダーに要件を満たすパスが 1 つもない場合、コンソールウィンドウに警告メッセージが表示されます。
ShaderLab のパッケージ要件では、バージョンは major.minor
または major.minor.patch
の形式を使用します。major.minor
のみを使用する場合、Unity は patch
に 0
を使用します。パッケージのバージョンには -preview
や -preview.n
という postfix (接尾辞) を入れることもできます。ここで -preview
は -preview.0
と同じ意味です。プレビュー版は非プレビュー版の前に置かれます。ですから、 1.2.3-preview.4
は 1.2.2
の後、かつ 1.2.3
の前にきます。
バージョン範囲を指定する方法は複数あります。それぞれ、異なる動作を提供します。それらは以下の通りです。
1.2.3
は、1.2.3
から始まるすべてのバージョンを含みます。[1.2.3]
は、バージョン 1.2.3
のみを含みます。[1.2.3,2.3.4]
は、1.2.3 から 2.3.3 までのすべてのバージョンを含みます。また、1 つのパッケージに対して、バージョン範囲のセットを指定することもできます。個々の範囲からバージョン範囲のセットを作成するには、セパレーター文字としてセミコロンを使用します。例えば、[2.0,3.4.5];[3.7];4.0
は、バージョン 2.0.0 から 3.4.5 まで、バージョン 3.7.0、そしてバージョン 4.0.0 以降のバージョンを含んでいます。
パッケージのバージョンを設定する場合、以下の点に注意してください。
構文が上記に従わない場合、そのバージョン制限は無効です。無効なパッケージの要件で何が起こるかについての詳細は、エラーチェック を参照してください。
次のコード例は、サブシェーダーとパスの両方でパッケージ要件を指定する方法を示しています。サブシェーダーは、“com.my.package” というパッケージに対する単一のパッケージ要件を宣言しており、このパッケージの 2.2.0 以降のすべてのバージョンで動作します。サブシェーダーは、2 つのパスを持ちます。
最初の Pass は以下を必要とします。 * バージョン 10.2.1 から 11.0 までの Universal Render Pipeline パッケージ。 * バージョン 3.2 以上の Text Mesh Pro パッケージ。
2 つ目の Pass は以下を必要とします。 * バージョン 8.0 から 8.5 までの High-Definition Render Pipeline パッケージ。
Shader "Examples/ExampleShader"
{
SubShader
{
PackageRequirements
{
"com.my.package": "2.2"
}
Pass
{
PackageRequirements
{
"com.unity.render-pipelines.universal": "[10.2.1,11.0]"
"com.unity.textmeshpro": "3.2"
}
}
Pass
{
PackageRequirements
{
"com.unity.render-pipelines.high-definition": "[8.0,8.5]"
}
}
}
}
決して満たすことができないパッケージ要件を定義した場合、シェーダーインポート処理はエラーにより失敗します。このセクションでは、最も一般的な無効なパッケージ要件定義の例について説明します。
PackageRequirements {
"com.some.package.x": "[10.2.1,9.0]" // Error, empty version range
"com.some.package.y": "[10.2.1.9,11.0]" // Error, incorrect version format
"com.some.package.z": "[2.3,3.5],[3.0,4.0]" // Error, ranges intersect
"" : "[2.3.4,3.4.5]" // Error, no package name provided
}
PackageRequirements {
"com.some.package.x": "[10.2.1,11.0]"
"com.some.package.x": "[11.2.1,12.0]" // Error, dependency on "com.some.package.x" declared twice
"unity" : "2021.2"
"unity" : "2021.3" // Error, dependency on Unity version declared twice
}
PackageRequirements {
"com.some.package.x": "unity=[2021.2.1,2021.3.3]"
"unity" : "2021.2" // Error: Unity version requirement cannot be declared on a package and on its own simultaneously
}
SubShader {
PackageRequirements {
"com.some.package.x": "[2.3.4,3.4.5]"
"com.some.package.z": "[1.1,3.2]"
"unity": "2021.2"
}
Pass {
PackageRequirements {
"com.some.package.y": "[1.2.2,2.5]" // Fine, SubShader doesn’t declare a dependency on "com.some.package.y"
"com.some.package.z": "[2.0,3.1]" // Fine, SubShader dependency intersects the provided version range
"com.some.package.x": "[1.1.1, 2.2.2]" // Error, SubShader version range for "com.some.package.x" does not intersect the provided range
"com.some.package.w": "unity=[2021.2.1,2021.2.5]" // Fine, SubShader dependency intersects the provided version range
"com.some.package.u": "unity=[2020.2.1,2020.2.5]" // Error, SubShader Unity version range does not intersect the provided range
}
}
}