<div style="padding:15px 15px 2px 20px; border-radius:2px; margin-bottom:20px; border:1px solid #ddd">

<callout>
<p style="margin-bottom:0.75em"><b>ライセンスについて</b></p>!!
Spineランタイムをアプリケーションに組み込むにはSpineライセンスが[必要](/git/spine-runtimes/spine-unity#licensing)です。
</callout>

<div style="font-size: 1.6em; margin: 0 0 .5em;">spine-unityランタイム ドキュメント</div>!!
* [インストール](/spine-unity-installation)
* [サンプル](/spine-unity-examples)
* [アセット](/spine-unity-assets)
* [主要なコンポーネント](/spine-unity-main-components)
* [ユーティリティコンポーネント](/spine-unity-utility-components)
* [レンダリング](/spine-unity-rendering)
* [Timeline 拡張UPMパッケージ](/spine-unity-timeline)
* [オンデマンドローディング 拡張UPMパッケージ](/spine-unity-on-demand-loading)
* [FAQ](/spine-unity-faq)
</div>!!

# レンダリング

## マテリアル

![](/img/spine-runtimes-guide/spine-unity/raptor-atlas-page.png)

各アトラスページのTextureは、スケルトンインポート時に自動的に作成される独自のMaterialを必要とします。`Normal(通常)` 以外のSlotブレンドモードを使用する場合は、ブレンドモードごとに追加のMaterialも作成されます（PMA使用時の `Additive(加算)` は除きます。これは通常のマテリアルでレンダリングが可能です）。MeshRendererのMaterials配列は、現在割り当てられているアタッチメントと、それらが含まれているAtlasAssetsに応じて、毎フレームごとに[SkeletonRenderer](/spine-unity-main-components#SkeletonRendererコンポーネント)によって管理され、現在割り当てられているアタッチメントとそれらが含まれるAtlasAssets、およびSlotで使用されているブレンドモードに依存します。
> **注意:** Materialsの配列を直接変更しても、次の `LateUpdate()` で上書きされてしまうので、効果はありません。マテリアルをオーバーライドするには、[SkeletonRendererCustomMaterials](/spine-unity-utility-components#SkeletonRendererCustomMaterials)または[SkeletonGraphicCustomMaterials](/spine-unity-utility-components#SkeletonGraphicCustomMaterials)コンポーネントを使用してください。また、*_Atlas*アセットで異なるマテリアルを割り当てて、すべてのインスタンスのマテリアルを変更することもできます。*_Atlas*アセットを変更した後は、`SkeletonRenderer` コンポーネントの `SkeletonData Asset` パラメーターで `Reload` を押して新しいアトラスマテリアルを使用してスケルトンを再ロードする必要があります。

> **注意:** `SkeletonGraphic` コンポーネントでは `Spine/SkeletonGraphic*` シェーダーを持つマテリアルのみを使用してください。URP、LWRP、または `Spine/Skeleton` のような通常のシェーダーを `SkeletonGraphic` コンポーネントで使用しないでください。詳しくは [SkeletonGraphic - マテリアルの重要な要件](/spine-unity-main-components#マテリアルの重要な要件) をご覧ください。

### マテリアルの切り替えとドローコール

割り当てられたアタッチメントが複数のアトラスページに分散している場合、あるいはマテリアル `A` とマテリアル `B` のように異なるブレンドモードを持っている場合、Materials配列はマテリアルが必要とされる表示順序に従って設定されます。

例えば、もし表示順序が以下のようになっているとしたら:
> 1. Aからのアタッチメント
> 2. Aからのアタッチメント
> 3. Bからのアタッチメント
> 4. Aからのアタッチメント

マテリアルの配列は以下のようになります:
> 1. Material A (アタッチメント1と2用)
> 2. Material B (アタッチメント3用)
> 3. Material A (アタッチメント4用)

Materials配列のすべてのマテリアルは[ドローコール](http://docs.unity3d.com/Manual/DrawCallBatching.html)に対応しています。そのため、マテリアルの切り替え量が多いとパフォーマンスに悪影響を及ぼしてしまいます。

Dragonの例では、多くのドローコールがある残念なユースケースを紹介しています: 
![](/img/spine-runtimes-guide/spine-unity/render_spineunity_alternatingmaterials.png)

そのため、アタッチメントは可能な限り少ないアトラスページでパックすることや、表示順序に応じてアタッチメントをアトラスページにまとめて不要なマテリアルの切り替えを防ぐことが推奨されています。
Spineアトラスのアトラス領域の配置方法については[Spineテクスチャ・パッカー: フォルダ構造](/spine-texture-packer#フォルダ構造)をご覧ください。

### インスタンスごとにマテリアルを変更する

> **注意:** [SkeletonRenderer](/spine-unity-main-components#SkeletonRendererコンポーネント)のMaterials配列を直接変更しても次の `LateUpdate()` で上書きされてしまうので、効果はありません。以下の方法が適切でない場合は、[`SkeletonAnimation.OnMeshAndMaterialsUpdated`](/spine-unity-main-components#ライフサイクル)コールバックデリゲートを使用して、手動で毎フレーム `MeshRenderer.Materials` をオーバーライドすることができます。このコールバックは、アトラスマテリアルが割り当てられた後、`LateUpdate()` の最後に呼び出されます。

#### CustomMaterialOverrideとCustomSlotMaterials
[SkeletonRenderer](/spine-unity-main-components#SkeletonRendererコンポーネント)では、特定のスロットのマテリアルをオーバーライドしたり、結果のマテリアルをオーバーライドすることができます。

[SkeletonRenderer](/spine-unity-main-components#SkeletonRendererコンポーネント)インスタンスの実行時にオリジナルのマテリアルを新しいマテリアルに置き換えるには、以下のように `SkeletonRenderer.CustomMaterialOverride` を使用します:
```csharp
// プログラムでオリジナルのマテリアルを照会するには、以下のコードを使用してください（下記注意も参照）。
// MeshRenderer.materialは動作しません。また、 MeshRenderer.sharedMaterialも場合により失敗する可能性があります。
if (originalMaterial == null)
	originalMaterial = skeletonAnimation.SkeletonDataAsset.atlasAssets[0].PrimaryMaterial;

skeletonAnimation.CustomMaterialOverride[originalMaterial] = newMaterial; // 置換を有効にする。
skeletonAnimation.CustomMaterialOverride.Remove(originalMaterial); // 置換を無効にする。
```
> **注意:** `.material` はマテリアルそのものではなく、プライマリマテリアルのインスタンスコピーを返すので、`originalMaterial = skeletonAnimation.GetComponent!lt!MeshRenderer!gt!().material` は使用しないでください。また、`originalMaterial = skeletonAnimation.GetComponent!lt!MeshRenderer!gt!().sharedMaterial` を使用することもお勧めしません。 アクティブなフレームにアクティブなアタッチメントが無い場合など、プライマリマテリアルがまだ割り当てられていないときにNULLを返す可能性があるからです。

特定のスロットだけに置換マテリアルを使用するには `SkeletonRenderer.CustomSlotMaterials` を使用します:
```csharp
skeletonAnimation.CustomSlotMaterials[slot] = newMaterial; // 置換を有効にする。
skeletonAnimation.CustomSlotMaterials.Remove(slot); // 置換を無効にする。
```

#### バッチングを維持しながらスケルトンをティント(着色)する

スケルトンインスタンスに異なる `Materials` や `MaterialPropertyBlocks` を使用すると、バッチングが発生します。個々のスケルトンインスタンスを異なる方法でティント(着色)したいだけで、他のマテリアルプロパティを変更する必要が無い場合は、`Skeleton.R .G .B .A` カラープロパティを使用できます。ティントを適用するには、SkeletonRendererのInspectorで [`Advanced - PMA Vertex Colors`](/spine-unity-main-components#高度なパラメーターの設定) を有効にする必要があります。
```csharp
public Color color = Color.white;
...
skeleton = GetComponent<SkeletonRenderer>().Skeleton;
...
skeleton.R = color.r;
skeleton.G = color.g;
skeleton.B = color.b;
skeleton.A = color.a;
```
これらのスケルトンカラーの値は、頂点カラーを設定するもので、マテリアルプロパティには影響しません。

個々のアタッチメントをティントする場合も同様です。:
```csharp
slot = skeleton.FindSlot(slotname);
...
slot.R = slotColor.r;
slot.G = slotColor.g;
slot.B = slotColor.b;
slot.A = slotColor.a;
```
> **注意:** アニメーション内でアタッチメントカラーの値を変更している場合は、アニメーションが適用された後に、[SkeletonAnimation.UpdateComplete](/spine-unity-main-components#ライフサイクル)コールバックなどでスロットカラーの値を必ず設定してください。

#### MaterialPropertyBlocks

![](/img/spine-runtimes-guide/spine-unity/materialpropertyblock-demo.gif)  

[Renderer.SetPropertyBlock](http://docs.unity3d.com/ScriptReference/Renderer.SetPropertyBlock.html)を使って、1つの `MeshRenderer` のマテリアルプロパティ値を上書きすることができます。

```csharp
MaterialPropertyBlock mpb = new MaterialPropertyBlock();
mpb.SetColor("_FillColor", Color.red); // "_FillColor" is a named property on the used shader.
mpb.SetFloat("_FillPhase", 1.0f); // "_FillPhase" is another named property on the used shader.
GetComponent<MeshRenderer>().SetPropertyBlock(mpb);

// to deactivate the override again:
MaterialPropertyBlock mpb = this.cachedMaterialPropertyBlock; // assuming you had cached the MaterialPropertyBlock
mpb.Clear();
GetComponent<Renderer>().SetPropertyBlock(mpb);
```

> **注意:** `MaterialPropertyBlock` で使用するパラメーター名(`_FillColor`、`_FillPhase`など)は、それぞれシェーダー変数名と一致していなければなりません。なお、シェーダー変数名は、Inspectorで表示される名前(`Fill Color` や `Fill Phase` など)とは異なりますのでご注意ください。シェーダー変数名を確認するには、`.shader` ファイルを開き(マテリアルの歯車アイコンメニューから `Edit Shader` を選択)一番上の `Properties { .. }` を確認してください。そこには、すべてのパラメーターのリストがあります。以下のようなパラメーター行で**一番左にある**名前 `_FillColor` が変数名です:
```
_FillColor ("Fill Color", Color) = (1,1,1,1)
^^^^^^^^^^
```
シェーダー変数名は通常、`_` で始まり、スペースは含まれません。Inscpectorに表示されるのは、`"Fill Color"` のような隣の文字列です。

サンプルシーンの `Spine Examples/Other Examples/Per Instance Material Properties` では、インスタンスごとのマテリアルプロパティのデモをご確認いただけます。

> **最適化の注意点**
> - Renderer.SetPropertyBlockを異なるMaterial値で使用すると、レンダラー間のバッチングが発生します。MaterialPropertyBlockパラメーターが同じであれば、レンダラー間でのバッチングは行われます（例：すべてのレンダラーがティントカラーを同じ緑色に設定する）。
> - MaterialPropertyBlockのプロパティ値を変更または追加する際には必ず `SetPropertyBlock` を呼び出す必要があります。しかし、そのMaterialPropertyBlockをクラスの一部として保持しておけば、プロパティを変更するたびに新しいものをインスタンス化する必要はありません。
> - プロパティを頻繁に設定する必要がある場合は、静的メソッドを使用することができます: `Shader.PropertyToID(string)` を使うと、MaterialPropertyBlockのセッターの文字列オーバーロードを使わずに、そのプロパティのint IDをキャッシュすることができます。

## 透明度と表示順序

すべてのspine-unityシェーダーは、アルファブレンディングを使用して、アタッチメントの境界に半透明のトランジションをきれいに描きます。アルファブレンディングを使用しないと（ハードな透明度しきい値を使用して）、エイリアシングアーティファクトのような硬いギザギザのアウトラインができてしまいます。

残念ながらアルファブレンディングには古典的な問題があり、zバッファを自動深度ソートに使用できません。代わりに、三角形を後ろから前の順にレンダリングし、パーツを重ねてペイントする必要があります。各[SkeletonRenderer](/spine-unity-main-components#SkeletonRendererコンポーネント)はそれに応じてメッシュを生成し、三角形はSpineで定義された[スロットの表示順序](/spine-basic-concepts#スロット)に従います。1つのメッシュ内では、1回のドローコールでも、正しく順序付けられたスケルトンパーツを描くことができます。

複数メッシュ間では、どのメッシュがどのメッシュの上に来るべきかを決定するために、spine-unityはUnityの描画順序システムの多くを利用しています。標準的なspine-unityの設定では、スケルトン全体のメッシュは、以下の複数の要素によって決定された順序でレンダリングされます:

1. **[Camera depth](http://docs.unity3d.com/ScriptReference/Camera-depth.html)** *マルチカメラの設定に関連しています。*
2. **Material.renderQueue** *設定すると、シェーダーの`Queue`タグを上書きします。*
3. **シェーダーの`Queue`タグ** *デフォルトでは、他のスプライトと同様に`Spine`シェーダーで`"Transparent"`のキューに入っています。*
4. **[Sorting Group](https://docs.unity3d.com/ScriptReference/Rendering.SortingGroup.html)コンポーネント** *MeshRendererのGameObjectや親のGameObjectsに配置された場合*
5. **レンダラーの[SortingLayer](https://docs.unity3d.com/ScriptReference/SortingLayer.html)および[SortingOrder within a layer](https://docs.unity3d.com/ScriptReference/Renderer-sortingOrder.html)**
6. **カメラからの距離** *カメラは[平行投影(planer)または透視投影(perspective)のどちらを使用するかを設定できます](http://docs.unity3d.com/ScriptReference/Camera-transparencySortMode.html)。*

シーンのレンダラーが同じsorting layerとorderにあり、シェーダーの `Queue` タグが同じであれば、カメラまでの距離でSpine GameObjectのソートをコントロールすることができます。なお、カメラには[transparencySortMode](http://docs.unity3d.com/ScriptReference/Camera-transparencySortMode.html)プロパティがあります。

#### Sorting LayerとOrder in Layer

[SkeletonRenderer](/spine-unity-main-components#SkeletonRendererコンポーネント) のInspectorには `Sorting Layer` と `Order in Layer` プロパティがあり、`MeshRenderer`の[sortingLayerID](http://docs.unity3d.com/ScriptReference/Renderer-sortingLayerID.html)と[sortingOrder](http://docs.unity3d.com/ScriptReference/Renderer-sortingOrder.html)プロパティを実際に変更します。これらのプロパティは `SkeletonRenderer` の一部ではなく、`MeshRenderer` の一部として保存されます。

また、これらのプロパティにはコードからアクセスすることができます:
```csharp
GetComponent<MeshRenderer>().sortingOrder = 1; // Order in Layerを1に変更。
```

### ソートの誤りを防ぐには

![](/img/spine-runtimes-guide/spine-unity/incorrect-sorting.png)

特に平行投影(orthographic)カメラを使用している場合、複数のアトラスページを使用しているスケルトンが誤ってソートされてしまうことがあります。
この問題を解決するには、スケルトンGameObjectに[Sorting Group](https://docs.unity3d.com/ScriptReference/Rendering.SortingGroup.html)コンポーネントを追加する必要があります。また、カメラを少しだけ回転させるという方法もあります。例えば、カメラのトランスフォームY回転の値を0.001に設定するなどです。

### スケルトンパーツ間のオブジェクト

![](/img/spine-runtimes-guide/spine-unity/skeleton-render-separator-spineboy.png)

例えば、キャラクターが木に突っ込んだ時に、片足を木の前に、片足を木の後ろに表示させるなど、キャラクターのパーツの間に他のGameObjectを表示させたい場合があります。

spine-unityでは、スケルトンを複数のパーツに分割するために[SkeletonRenderSeparator](/spine-unity-utility-components#SkeletonRenderSeparator)コンポーネントを提供しています。

### スケルトンのフェードイン、フェードアウト

残念ながら、アルファブレンディングでは、スケルトンのアルファ値を下げて半透明にするとスケルトンの下位のパーツが透けて見えてしまいます。これは、各三角形の描画時に透明度が適用されるためです。

![](/img/spine-runtimes-guide/spine-unity/CommonError-AlphaFadeOut-Comparison.png)

この問題を解決する方法のひとつは、一時的な[RenderTexture](https://docs.unity3d.com/Manual/class-RenderTexture.html)を使用することです。キャラクター全体を通常の不透明度でRenderTextureにレンダリングし、その後、このRenderTextureのコンテンツを任意のフェード不透明度でシーンに描画することができます。
また、これを実現するために提供されている[SkeletonRenderTexture](/spine-unity-utility-components#SkeletonRenderTexture)とサンプルコンポーネント[SkeletonRenderTextureFadeout](/spine-unity-utility-components#SkeletonRenderTextureFadeout)を使用することができます。これらのコンポーネントのデモは、サンプルシーン `Spine Examples/Other Examples/RenderTexture FadeOut Transparency` で確認できます。

なお、これはフェードアウト効果を作成するための数ある方法のうちのひとつに過ぎません。スケルトンを徐々にソリッドカラーで染めたり、スケールを小さくするなど、他にも簡単な方法がある可能性があります。RenderTextureは負荷のかかる解決方法であり、従来はほとんど使用されてこなかったため、既存の2Dゲームを参考にしてみた方が良いかもしれません。

## シェーダー

![](/img/spine-runtimes-guide/spine-unity/stretchyman-only-small.png)

spine-unityランタイムにはいくつかの異なるシェーダーが同梱されています。デフォルトでは `Spine/Skeleton` シェーダーが新しくインポートされたスケルトンのMaterialに割り当てられます。シェーダーの変更は、通常通りMaterialのShaderパラメーターで行います。以下に、同梱されているSpineシェーダーのリストをご紹介します。

> **重要な注意事項:** **`SkeletonGraphic`**コンポーネントでは、`CanvasRenderer`と互換性のある特別なシェーダーのみを使用してください。詳細は[SkeletonGraphic - マテリアルの重要な要件](/spine-unity-main-components#マテリアルの重要な要件)をご覧ください。

> **重要な注意事項:** spine-unityランタイムパッケージは [**Built-In Render Pipeline**](https://docs.unity3d.com/ja/current/Manual/built-in-render-pipeline.html) 用のシェーダーのみ同梱しており、[**Universal Render Pipeline**](https://unity.com/ja/srp/universal-render-pipeline) を使用しているプロジェクトとは互換性がありません。Universal Render Pipelineを使用している場合は、代わりに[Spine URP Shaders 拡張UPMパッケージ](#URP-Shaders-拡張パッケージ)にて提供されているURP用のシェーダーを使用してください。

> **注意:**　[*ディファードシェーディングレンダリングパス*](https://docs.unity3d.com/ja/current/Manual/RenderTech-DeferredShading.html)は、Spineシェーダーではまだサポートされていません。

1. **Spine/Skeleton** *(デフォルトシェーダー)*  
	ライティングを反映しないUnlit透明シェーダー。Zバッファ(深度バッファ)への書き込みは行いません。
2. **Spine/Skeleton Graphic** *(SkeletonGraphic用のデフォルトシェーダー)*  
	[SkeletonGraphic](/spine-unity-main-components#SkeletonGraphicコンポーネント)で使用される、ライティングを反映しないUnlit透明シェーダー。Zバッファ(深度バッファ)への書き込みは行いません。`CanvasGroup` で使用する場合、`Additive(加算)` ブレンドモードはサポートされていないため、代わりに`Spine/Skeleton Graphic Tint Black` を使用する必要があります。CanvasRendererの制限により、1つのテクスチャに限定されます。
3. **Spine/Skeleton Lit**  
	シンプルなLit透明シェーダーで、ノーマルマップ(法線マップ)はサポートしていません。Zバッファ(深度バッファ)への書き込みは行いません。
4. **Spine/Skeleton Lit ZWrite**  
	シンプルなLit透明シェーダーで、ノーマルマップ(法線マップ)はサポートしていません。Zバッファ(深度バッファ)への書き込みを行います。
5. **Spine/Skeleton Fill**  
	カスタマイズ可能なカラーオーバーレイを備えたUnlit透明シェーダー。Zバッファ(深度バッファ)への書き込みは行いません。
	`FillColor` はオーバーレイの色を、`FillPhase` はオーバーレイの色の強さを決定します。
6. **Spine/Skeleton Tint**  
	カスタマイズ可能な2色のティント（暗色と明色を別々に着色すること）を備えたUnlit透明シェーダーで、[ティントブラック](/spine-slots#ティントブラック)と呼ばれます。Zバッファ(深度バッファ)への書き込みは行いません。
	
	テクスチャの明るい色は `Tint Color` で染められ、テクスチャの暗い色は `Black Point` カラーで染められます。これにより、着色されたテクスチャは、通常の乗算カラーブレンドと比較して、元の色よりも明るくなります。`Tint Color` と `Black Point` の両方を同じ色に設定すると、ソリッドカラー(べた塗り)のオーバーレイになります。`Tint Color` を黒に、`Black Point` を白に設定すると、テクスチャの色を反転することができます。
7. **Spine/Skeleton Tint Black**  
	![](/img/spine-runtimes-guide/spine-unity/tint-black-demo.gif)
	
	Spineでアニメーションされているスロットごとの[ティントブラック](/spine-slots#ティントブラック)の機能を持つ、Unlit透明シェーダーです。
	Zバッファ(深度バッファ)への書き込みは行いません。
	Spineはスロットに[ティントブラック](/spine-slots#ティントブラック)機能を提供し、アニメーションによるブラックティントを可能にします。
	
	以下の追加の設定ステップが必要です（ティントカラーの頂点データの場合）:
	- [SkeletonAnimation](/spine-unity-main-components#SkeletonAnimationコンポーネント)のInspectorの `Advanced` セクションで `Tint Black` を有効にしてください:  
	![](/img/spine-runtimes-guide/spine-unity/skeletonanimation-inspector-tintblack.png)
8. **Spine/Skeleton Tint Black Additive**  
	Spineでアニメーションされているスロットごとの[ティントブラック](/spine-slots#ティントブラック)の機能を持つ、Unlit透明シェーダーです。
	Additive(加算)ブレンドモードを使用します。
	Zバッファ(深度バッファ)への書き込みは行いません。
9. **Spine/SkeletonGraphic Tint Black**  
	[SkeletonGraphic](/spine-unity-main-components#SkeletonGraphicコンポーネント)用の `Spine/Skeleton Tint Black` シェーダーの派生です。`CanvasGroup` と一緒に使用する際に `Additive(加算)` ブレンドモードをサポートします。
	
	以下の追加の設定ステップが必要です（ティントカラー頂点データの場合）:
	1. [SkeletonAnimation](/spine-unity-main-components#SkeletonAnimationコンポーネント)のInspectorの `Advanced` セクションで `Tint Black` を有効にします。
	2. [SkeletonGraphic](/spine-unity-main-components#SkeletonGraphicコンポーネント)のMaterialを、CanvasGroupのサポートの有無に関わらず、PMAまたはストレートアルファテクスチャのワークフローに適した `Spine/Runtime/spine-unity/Materials` のそれぞれのサブフォルダにある`SkeletonGraphicTintBlack` マテリアルに設定します。
	![](/img/spine-runtimes-guide/spine-unity/skeletongraphictintblack-material.png)
	3. 親キャンバスを選択し、`Additional Shader Channels` で `TexCoord1` と `TexCoord2` を有効にします。
	![](/img/spine-runtimes-guide/spine-unity/unity-canvas-texcoord1-texcoord2.png)

	`CanvasGroup` での `Additive(加算)` ブレンドモードのためには以下の追加手順が必要です:
	4. [SkeletonGraphic](/spine-unity-main-components#SkeletonGraphicコンポーネント)のInspectorの `Advanced` セクションで `Canvas Group Tint Black` を有効にします。
	5. a) spine-unity 4.2以降の場合: [SkeletonGraphic](/spine-unity-main-components#SkeletonGraphicコンポーネント)のInspectorの `Advanced` セクションで `CanvasGroup Compatible` を有効にします。
	b) 古いバージョンの場合: [SkeletonGraphic](/spine-unity-main-components#SkeletonGraphicコンポーネント)のInspectorの `Advanced` セクションで `Canvas Group Tint Black` を有効にします。
	6. シェーダーで `CanvasGroup Compatible` を有効にしてください。
10. **Spine/Sprite**  
	これらは設定変更が可能な洗練されたシェーダーで、`Spine/Skeleton Lit` シェーダーよりも高度なライティングが可能です。
	`Spine/Sprite/Vertex Lit` シェーダーのデモは、サンプルシーン `Spine Examples/Other Examples/Sprite Shaders` で確認できます。
	1. **Spine/Sprite/Unlit**  
		ブレンドモード、オーバーレイカラー、色相、彩度、明るさの調整が可能なUnlitシェーダーです。Zバッファ(深度バッファ)への書き込みの設定を変更可能です。Fog(フォグ)をサポートしています。
	2. **Spine/Sprite/Vertex Lit**  
		ブレンドモードの設定変更が可能な洗練されたVertex-Litシェーダーです。
		ノーマルマップ(法線マップ)、セカンダリアルベド、メタリック、エミッションマップをサポートしています。 
		カラーランプによるセルシェーディング風の外観と法線に基づくリムライティング、
		オーバーレイの色、色相、彩度、輝度の調整、
		Zバッファ(深度バッファ)への書き込みの設定を変更可能です。Fog(フォグ)をサポートしています。
	3. **Spine/Sprite/Pixel Lit**  
		`Spine/Sprite/Vertex Lit` シェーダーのPixel-litバージョンです。これはピクセルごとのリアルタイムシャドウを受けることが出来る唯一のシェーダーです。
		このシェーダーは、常にZバッファ(深度バッファ)に書き込みます(`ForwardAdd` パスを使用するため、`ZWrite` が有効になっています)。
11. **Spine/Special**
	1. **Spine/Special/Skeleton Grayscale**  
		Intensityをカスタマイズできるグレースケールレンダリング用のUnlit透明シェーダーです。Zバッファ(深度バッファ)への書き込みは行いません。
	2. **Spine/Special/Skeleton Ghost**  
		[SkeletonGhost](/spine-unity-utility-components#SkeletonGhost)コンポーネントがトレイルレンダリングに使用する特別なシェーダーです。
12. **Spine/Blend Modes**  
	これらのシェーダーは、Spineエディターでブレンドモードに `Additive(加算)`、`Multiply(乗算)`、`Screen(スクリーン)` が割り当てられているスロットを対象としています。インポート時に、提供されている[SkeletonData Blend Mode Materials](/spine-unity-assets#Skeleton-Data)を介して、ブレンドモードマテリアルを自動的に割り当てることをお勧めします。
	1. **Spine/Blend Modes/Skeleton PMA Additive**  
		ライティングを反映しないUnlit透明シェーダー。Additive(加算)ブレンドモードを使用します。Zバッファ(深度バッファ)への書き込みは行いません。
	2. **Spine/Blend Modes/Skeleton PMA Multiply**  
		ライティングを反映しないUnlit透明シェーダー。Multiply(乗算)ブレンドモードを使用します。Zバッファ(深度バッファ)への書き込みは行いません。
	3. **Spine/Blend Modes/Skeleton PMA Screen**  
		ライティングを反映しないUnlit透明シェーダー。Screen(スクリーン)ブレンドモードを使用します。Zバッファ(深度バッファ)への書き込みは行いません。
13. **Spine/Outline**  
	上記のすべてのシェーダーには `Outline` パラメーターがあり、これを有効にすると、それぞれの `Spine/Outline` シェーダーのバリエーションに切り替わり、スケルトンの周囲に追加のカラーアウトラインが描画されるようになります。
	`Spine/Outline` シェーダーのデモはサンプルシーンの `Spine Examples/Other Examples/Outline Shaders` でご覧いただけます。  
	1. **Spine/Outline/OutlineOnly-ZWrite**  
		アウトラインのみをレンダリングする特殊なシングルパスシェーダーです。アタッチメントが重なった時にアウトラインのオクルージョンを適切に処理するために、Zバッファ(深度バッファ)への書き込みを行います。また、スケルトンに複数のマテリアルが必要で通常のアウトラインシェーダーではスケルトン全体ではなく各サブメッシュのアウトラインをとってしまうという場合にもこちらのシェーダーを使用することで解決できます。例えば、[`RenderCombinedMesh`](/spine-unity-utility-components#RenderCombinedMesh) コンポーネントを使用して、結合されたスケルトンメッシュをこのアウトラインのみのシェーダーで再レンダリングし、スケルトンの後ろにアウトラインを追加することができます。

### ポストプロセスエフェクト

被写界深度（DoF）のようないくつかのポスト処理エフェクトは、シェーダーがZバッファ（より正確には、深度プリパス深度バッファ）に書き込む必要があります。Spineシェーダーのいくつかは、マテリアルで有効にできる `Depth Write`（`ZWrite`とも呼ばれる）パラメーターを提供し、他のものはデフォルトでZバッファに書き込みます。提供されている SpineシェーダーのどれがZバッファに書き込むかについては、上記のドキュメントを参照してください。

`URP-HighFidelity` をレンダーパイプラインアセットとして使用している場合など、プロジェクトのGraphics設定（または Render Pipeline Asset Settings）によっては、シェーダーがZバッファに書き込むだけでは不十分な場合があります。この場合、Materialの `Render Queue` を `Transparent` から `AlphaTest` に変更する必要があります。

提供されているシェーダーに制限を感じる場合は、修正したいSpineシェーダーをコピーして、`ZWrite Off` と書かれている行をすべて `ZWrite On` に変更し（各Passセクションで発生）、タグ `"Queue"="Transparent"` を `"Queue"="AlphaTest"` に変更した自作シェーダーを作ることが可能です。これを行う場合、命名の衝突を避けるために、ファイルの最初の行でシェーダーの名前を変更することを忘れないでください。

### URP Shaders 拡張パッケージ

Universal Render Pipeline (URP)シェーダーは、別のUPM (Unity Package Manager)パッケージとして提供されています。このパッケージをダウンロードしてインストールする方法については[オプションの拡張UPMパッケージ](/spine-unity-installation#オプションの拡張UPMパッケージ)セクションを、アップデートする方法については[拡張UPMパッケージのアップデート](/spine-unity-installation#拡張UPMパッケージのアップデート)セクションをご覧ください。

URPシェーダーのUPMパッケージは、2D Renderer機能を含む、Unityの Universal Render pipeline用に作られたシェーダーを提供します。

> **注意:** `SkeletonGraphic` コンポーネントではURPシェーダーを使用しないでください。詳しくは[SkeletonGraphic - マテリアルの重要な要件](/spine-unity-main-components#マテリアルの重要な要件) をご覧ください。

> **注意:** Universal Render Pipelineに最近追加された[*デファードレンダリングパス*](https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@12.0/manual/rendering/deferred-rendering-path.html)は、Spine URPシェーダーではまだサポートされていません。

**2Dレンダラーを使用するURPシェーダー** *(URP (3D)フォワードレンダラーとは一緒に使用しないでください)*
1. **Universal Render Pipeline/2D/Spine/Skeleton**  
	`Spine/Skeleton` シェーダーのユニバーサル2D Rendererバージョンです。
2. **Universal Render Pipeline/2D/Spine/Skeleton Lit**  
	`Spine/Skeleton Lit` シェーダーのユニバーサル2D Rendererバージョンです。
3. **Universal Render Pipeline/2D/Spine/Sprite**  
	`Spine/Sprite/Vertex Lit` および `Pixel Lit` シェーダーのユニバーサル2D Rendererバージョンです。

**3Dフォワードレンダラーを使用するURPシェーダー** *(URP 2Dレンダラーとは一緒に使用しないでください)*
1. **Universal Render Pipeline/Spine/Skeleton**  
	`Spine/Skeleton` シェーダーのユニバーサルバージョンです。
2.  **Universal Render Pipeline/Spine/Skeleton Lit**  
	`Spine/Skeleton Lit` シェーダーのユニバーサルバージョンです。ピクセルごとのリアルタイムシャドウを受けるように設定することもできます。
3. **Universal Render Pipeline/Spine/Sprite**  
	`Spine/Sprite/Vertex Lit` および `Pixel Lit` シェーダーのユニバーサルバージョンです。ピクセルごとのリアルタイムシャドウを受けます。
4. **Universal Render Pipeline/Spine/Outline/Skeleton-OutlineOnly**  
	`Spine/Outline` シェーダーのユニバーサルバージョンです。URPはシェーダーごとに複数のパスを許可していないため、別のマテリアルが必要になります。本パッケージに含まれるサンプルシーン `Outline Shaders URP` で紹介している通り、[`RenderExistingMesh`](/spine-unity-utility-components#RenderExistingMesh)コンポーネントを使用した方が良いでしょう。スケルトンに複数のマテリアルが必要な場合は、`RenderExistingMesh` コンポーネントの代わりに [`RenderCombinedMesh`](/spine-unity-utility-components#RenderCombinedMesh) コンポーネントを使用できます。
	
シェーダーは通常通りマテリアルに割り当てることができ、`Project Settings - Graphics` で割り当てられた `UniversalRenderPipelineAsset` の設定が反映されます。

URPシェーダーのデモは、UPMパッケージの中のサンプルシーン `com.esotericsoftware.spine.URP-shaders/Examples` にある、`3D/URP 3D Shaders.unity`、`2D/URP 2D Shaders.unity`、`Outline Shaders URP.unity` で確認できます。

### LWRP Shaders 拡張パッケージ

Lightweight Render Pipeline (LWRP)シェーダーは、別のUPM (Unity Package Manager)パッケージとして提供されています。このパッケージをダウンロードしてインストールする方法については[オプションの拡張UPMパッケージ](/spine-unity-installation#オプションの拡張UPMパッケージ)セクションを、アップデートする方法については[拡張UPMパッケージのアップデート](/spine-unity-installation#拡張UPMパッケージのアップデート)セクションをご覧ください。

LWRPシェーダーのUPMパッケージは、以下のUnityの軽量レンダーパイプライン用に作られたシェーダーを提供します。

> **注意:** `SkeletonGraphic` コンポーネントでは、LWRPシェーダーを使用しないでください。詳しくは[SkeletonGraphic - マテリアルの重要な要件](/spine-unity-main-components#マテリアルの重要な要件)を参照してください。

1. **Lightweight Render Pipeline/Spine/Skeleton**  
	`Spine/Skeleton` シェーダーのLightweightバージョンです。
1. **Lightweight Render Pipeline/Spine/Skeleton Lit**  
	`Spine/Skeleton Lit` シェーダーのLightweightバージョンです。
1. **Lightweight Render Pipeline/Spine/Sprite**  
	`Spine/Sprite/Vertex Lit` および `Pixel Lit` シェーダーのLightweightバージョンです。

シェーダーは通常通りマテリアルに割り当てることができ、`Project Settings - Graphics` で割り当てられた`LightweightRenderPipelineAsset` の設定が反映されます。

LWRPシェーダーのデモは、解凍したパッケージの中にあるサンプルシーン `com.esotericsoftware.spine.lwrp-shaders-4.2/Examples/LWRP Shaders.unity` で確認できます。

### Shader Graph

現在、公式のShader Graph Spineシェーダーやシェーダーノードはありません。なお、[ストレートアルファ](/spine-unity-assets#乗算済み-vs-ストレートアルファエクスポート)設定を使用してSpineからテクスチャをエクスポートする場合は、Spine以外のシェーダーを使用することができます。Spineシェーダーにしかない機能を再現したい場合は、[フォーラム](/forum/?q=shader+graph)のこちらの投稿を参考にしてください。[[1](/forum/Shader-Graph-with-Normal-Map-and-Diffuse-Ramp-15755)]、[[2](/forum/Adding-normals-to-a-Shader-Graph-15077)]。ご質問がある場合は、Unityサブフォーラムに新しいスレッドを立ててください。

### Amplify Shader Editor

Amplify Shader Editorには公式に提供されているシェーダーテンプレートはありませんが、ユーザーの `Hana` さんがフォーラムの[こちらの投稿](/forum/Spine-Shader-Template-for-Amplify-16267?p=71176#p71176)でテンプレートコードを公開してくれています。

### シェーダーを自作する

まず前提として、[一般的な](https://docs.unity3d.com/2020.1/Documentation/Manual/ShadersOverview.html)Unityのカスタムシェーダーの書き方を理解してください。特に[Tutorial: Weiting vertex and fragment shaders](https://docs.unity3d.com/2020.1/Documentation/Manual/SL-ShaderPrograms.html)は良い概要となっており、speine-unityシェーダーの各部分が何をしているかをより簡単に理解することができます。

#### 既存のspine-unityシェーダーから始める

まずは既存のspine-unityシェーダーをコピーすることから始めることを強くお勧めします。その後、すでに動作しているシェーダーを徐々に修正して、求めていた効果を得るように調整することができます。例えば、最終的な色を返す前に追加の色処理を加えることができます。例えば次のコードは、グレースケール機能で拡張された `SkeletonGraphic` シェーダーの調整バージョンを作成する方法の簡単な例を示しています:

```
Properties
{
    _GrayIntensity("Intensity", Range(0, 1)) = 1 // この行はMaterialプロパティを提供するために追加しました
    [..]
}
```
```
sampler2D _MainTex;
float _GrayIntensity; // このパラメーターを追加しました
..
fixed4 frag (VertexOutput IN) : SV_Target
{
    ..
    color.rgb = lerp(color.rgb, dot(color.rgb, float3(0.3, 0.59, 0.11)), _GrayIntensity); // この行を追加しました
    return color;
}
```

#### Spineシェーダー以外のシェーダーやビジュアルシェーダーエディタを使用する際の注意点

典型的なspine-unityシェーダーとその他の非Spineシェーダーの以下のような違いに注意してください:

1. Spineスケルトンをレンダリングする場合には、`Cull Off` を設定して**必ずバックフェースカリングを無効にする**ようにしてください。
2. Spineシェーダーは通常、法線を必要としないため、Litシェーダーを使用する場合はコンポーネントで `Advanced - Add Normals` を有効にする必要があります。
3. Spineシェーダーは通常、接線を必要としないため、ノーマルマップ(法線マップ)を使用する場合はコンポーネントで `Advanced - Solve Tangents` を有効にする必要があります。
4. バージョン4.2およびそれ以前のspine-unityではSpineシェーダーはデフォルトで乗算済みアルファテクスチャを使用します。そのため、以下のいずれかを行ってください.  
	a) アトラステクスチャを[ストレートアルファ](/spine-unity-assets#乗算済み-vs-ストレートアルファエクスポート)としてエクスポートする.  
	b) シェーダーのブレンドモードをPMAブレンドモードである `Blend One OneMinusSrcAlpha` に変更する.  
5. Spineの頂点の色は、通常、PMA頂点の色です。透明または `Additive(加算)` スロットを使用する場合、次のいずれかを行うことができます  
	a) シェーダーのブレンドモードをPMAブレンドモードである `Blend One OneMinusSrcAlpha` に変更し、PMAアトラステクスチャを使用する、または  
	b) コンポーネントで`Advanced - PMA Vertex Colors`を無効にする(`Additive(加算)`スロットをレンダリングしない場合)  

通常通り、UI用および非UI用シェーダーにおける一般的なルールが適用されます:
1. `SkeletonAnimation` または `SkeletonMecanim` に対してUI用シェーダーを使用しないでください。
2. `SkeletonGraphic` に対して非UI用シェーダーを使用しないでください。

##### **`Spine/Skeleton`シェーダーの解析**

次のセクションでは、[`Spine/Skeleton` シェーダー](https://github.com/EsotericSoftware/spine-runtimes/blob/4.3/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton.shader)の解析を行います。このシェーダーは、Spineテクスチャアトラスのインポート時にMaterialが生成されると、デフォルトで適用されます。
`Spine/Skeleton` シェーダーはかなり短くて典型的なもので、次のような特徴があります:
- 乗算済みアルファ(PMA)ブレンディング
- 深度バッファの書き込み無し
- ライティング無し
- バックフェースカリング無し
- Fog(フォグ)無し
- 頂点カラーを使って乗算でテクスチャを染める
- オプションでPMAテクスチャの代わりにストレートアルファを使用する
- `"ShadowCaster"` パスを持ち、リアルタイムに影を落とすことができる
- Materialプロパティ:
	- _MainTex "メインテクスチャ"
	- _StraightAlphaInput "ストレートアルファテクスチャ"
	- _Cutoff "シャドウアルファのカットオフ"
	- 高度なパラメーター:
		- _StencilRef "ステンシルの参照"
		- _StencilComp "ステンシルの比較"
		- アウトラインパラメーター (_OutlineWidth "アウトラインの線幅"、その他。)

#### 詳細:
- **乗算済みアルファ(PMA)ブレンディング**  
	
	```hlsl
	Blend One OneMinusSrcAlpha
	```
	[(Spine-Skeleton.shader:28)](https://github.com/EsotericSoftware/spine-runtimes/blob/4.3/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton.shader#L28)
	
	ブレンディングは、`result_rgba = frag_output_rgba * src_factor + framebuffer_rgba * dst_factor`で定義されます。
	PMAの非標準的なブレンドモード`Blend One OneMinusSrcAlpha`では、`Additive(加算)`ブレンドモードに設定されているスロットを、`Normal(通常)`レンドモードのスロットと一緒に1回のレンダリングパスで描画することができます。これは、上の行で`SrcFactor`に(`SrcAlpha`の代わりに)`One`を使うことで実現しています。これにより、修正されていない`frag_output_rgba`の値が、`OneMinusSrcAlpha`でウェイト付けされた`framebuffer_rgba`に追加されます:  
	a) `Normal(通常)`ブレンドでは、フラグメントシェーダーは`RGB`に`A`を乗算し、`A`はそのままにします。
	b) `Additive(加算)`ブレンドでは、`RGB`にアルファを乗算せずに`A`を`0`に設定して`result_rgba = frag_output_rgba + (1-0) * framebuffer_rgba`を受け取ります。

	`SkeletonRenderer` または `SkeletonGraphic` コンポーネントで[Advanced - `PMA Vertex Colors`](/spine-unity-main-components#高度なパラメーターの設定)が有効になっている場合、`Normal(通常)` および `Additive(加算)` スロットブレンドモードは、頂点カラーとしてシェーダーに暗黙的に渡されます:  
	```hlsl
	struct VertexInput {
	    float4 vertexColor : COLOR
	}
	```
	[(Spine-Skeleton.shader:51)](https://github.com/EsotericSoftware/spine-runtimes/blob/4.3/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton.shader#L51)
	
	PMAの頂点カラーとサンプリングされたPMAのテクスチャカラーを掛け合わせる際、スロットの `Normal(通常)` または `Additive(加算)` ブレンドモードが自動的に適用されます:
	```hlsl
	return (texColor * i.vertexColor);
	```
	[(Spine-Skeleton.shader:75)](https://github.com/EsotericSoftware/spine-runtimes/blob/4.3/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton.shader#L75)

	そのため、シェーダーで適切な `Normal(通常)` と `Additive(加算)` PMAブレンドモードをサポートする必要があります:
	1. `Blend One OneMinusSrcAlpha` としてブレンド関数を定義する。
	2. テクスチャの色と頂点の色を掛け合わせる。
	3. コンポーネントで[Advanced - `PMA Vertex Colors`](/spine-unity-main-components#高度なパラメーターの設定)を有効にする。
	
	> 標準的なブレンドモード `Blend SrcAlpha OneMinusSrcAlpha` を使用したシェーダーを使用し、`Additive(加算)` スロットを必要としない場合、使用したアトラステクスチャをSpineから[ストレートアルファ](/spine-unity-assets#乗算済み-vs-ストレートアルファエクスポート)としてエクスポートする必要があります。
 
- **深度バッファの書き込み無し**  
	```hlsl
	ZWrite Off
	```
	[(Spine-Skeleton.shader:27)](https://github.com/EsotericSoftware/spine-runtimes/blob/4.3/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton.shader#L27)

	深度バッファへの書き込みが無いのは、アルファブレンディングされた2Dスプライトシェーダーの典型です。透明なオブジェクトは、深度バッファでの深度ソートに頼らず、[`Camera.transparencySortMode`](https://docs.unity3d.com/ScriptReference/Camera-transparencySortMode.html)に従って、前後の順序で描画されます。`Spine/Skeleton` は、この特性をUnity独自の `Sprites/Default` シェーダーと共有しています。

	> 深度への書き込みを有効にしたシェーダーを使用する際は、特にライティングを使用している場合Z-Fightingを防ぐために `SkeletonRenderer` または`SkeletonGraphic` コンポーネントで `Advanced - Z-Spacing` を `0` 以外の値に設定してください。
	なお、深度バッファを使用すると、エッジのエイリアシング効果など、半透明領域の周囲で望ましくない結果が生じることがあります。

- **ライティング無し**  
	 `Spine/Skeleton` シェーダーは、シーンに配置されているLightsの影響を受けず、常に `texColor * i.vertexColor` のフル輝度でレンダリングされます。
	
	シェーダーでライティングを適用するには、実際に使用されているLitシェーダーから始めて、自分のコピーを適宜変更することをお勧めします。
	単純に `Lighting Off` から `Lighting On` に変更しただけでは期待した効果は得られず、ご自身の頂点シェーダー(頂点ごとのライティングの場合)やフラグメントシェーダー関数(ピクセルごとのライティングの場合)でライトを評価し、それに応じて色のIntensity(強度)を乗じる必要があります。また、URP、URP-2D、標準パイプラインシェーダーは、それぞれ異なるライティング評価設定を使用しているので、それに合わせてリファレンスシェーダーを選択することに注意してください。

- **バックフェースカリング無し**  
	```hlsl
	Cull Off
	```
	[(Spine-Skeleton.shader:26)](https://github.com/EsotericSoftware/spine-runtimes/blob/4.3/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton.shader#L26)

	Spineスケルトンをレンダリングするための唯一の厳格な条件は、2Dシェーダーによく見られる**バックフェースカリングを無効**にすることです。
	
	> ほとんどの3Dシェーダーでは、バックフェースカリングが有効になっています。Spineメッシュでは、パーツがマイナスにスケールされたり、スケルトンの方向を反転させたりすると、この処理によって一部の三角形が見えなくなってしまいます。

- **Fog無し**  
	`Spine/Skeleton` シェーダーはFog(フォグ)の影響を受けません。

	シェーダーでFogを有効にするには、シェーダーコードに追加の頂点パラメーターと関数呼び出しが必要です。以下 `UnityCG.cginc` より:
	```hlsl
	multi_compile_fog Will compile fog variants.
	UNITY_FOG_COORDS(texcoordindex) Declares the fog data interpolator.
	UNITY_TRANSFER_FOG(outputStruct,clipspacePos) Outputs fog data from the vertex shader.
	UNITY_APPLY_FOG(fogData,col) Applies fog to color "col". Automatically applies black fog when in forward-additive pass.
	Can also use UNITY_APPLY_FOG_COLOR to supply your own fog color.
	```

	シェーダーでFogを適用する方法については、`Spine/Sprite/Unlit` シェーダーを参考にしてください。:
	```hlsl
	#pragma multi_compile_fog
	```
	[(SpritesUnlit.shader:77)](https://github.com/EsotericSoftware/spine-runtimes/blob/4.3/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Sprite/SpritesUnlit.shader#L77)
	```hlsl
	UNITY_FOG_COORDS(1) // to declare it at the free attribute TEXCOORD1
	```
	[(SpriteUnlit.cginc:L34)](https://github.com/EsotericSoftware/spine-runtimes/blob/4.3/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Sprite/CGIncludes/SpriteUnlit.cginc#L34)
	```hlsl
	UNITY_TRANSFER_FOG(output,output.pos);
	```
	[(SpriteUnlit.cginc:64)](https://github.com/EsotericSoftware/spine-runtimes/blob/4.3/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Sprite/CGIncludes/SpriteUnlit.cginc#L64)

- **頂点カラーを使って乗算でテクスチャを着色する**  
	前述の「*乗算済みアルファ(PMA)ブレンディング*」をご覧ください。

- **オプションでPMAテクスチャの代わりにストレートアルファを使用する**  
	`Spine/Skeleton` シェーダーのブレンドモードは常にPMAブレンディングに設定されているため、入力テクスチャが乗算済みアルファカラーを持っていない場合、サンプリング後にPMAカラーに変換する必要があります。以下の行ではこの機能を実装しています:  
	```
	// bool Material parameter, enables the _STRAIGHT_ALPHA_INPUT shader keyword when enabled
	[Toggle(_STRAIGHT_ALPHA_INPUT)] _StraightAlphaInput("Straight Alpha Texture", Int) = 0
	..
	// compiles the shader in two variants so that shader keywords can switch between both variants
	#pragma shader_feature _ _STRAIGHT_ALPHA_INPUT
	..
	// when enabled, multiply texture rgb values by the texture alpha value.
	#if defined(_STRAIGHT_ALPHA_INPUT)
	texColor.rgb *= texColor.a;
	#endif
	```

- **`"ShadowCaster"`パスを持ち、リアルタイムに影を落とすことを可能にする**  
	[`Tags { "LightMode"="ShadowCaster" }`](https://github.com/EsotericSoftware/spine-runtimes/blob/4.3/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton.shader#L80-L119)を持つセカンドパスは `LightMode` によって自動的にShadowCasterパスとして識別されます。
	`ShadowCaster` パスは、RGB カラーを一切書き込まず、代わりに深度情報をシャドウバッファに書き込みます。そのため、必ず [`ZWrite On`](https://github.com/EsotericSoftware/spine-runtimes/blob/4.3/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton.shader#L84) を使用します。
	半透明の深度を書き込むことはできないので、フラグメントは深度バッファに書き込まれるか、影を落とさないように破棄されます。これは、しきい値関数コールで行います:  
	```hlsl
	clip(texcol.a * i.uvAndAlpha.a - _Cutoff);
	```
	[(Spine-Skeleton.shader:115)](https://github.com/EsotericSoftware/spine-runtimes/blob/4.3/spine-unity/Assets/Spine/Runtime/spine-unity/Shaders/Spine-Skeleton.shader#L115)
	
	ここでは、`_Cutoff` Materialパラメーターがアルファのしきい値を定義しており、x &lt; 0の場合、`clip(x)` によってフラグメントが破棄されます。

- **Materialプロパティ:**
	- _MainTex "メインテクスチャ"  
		メインのテクスチャ。
	- _StraightAlphaInput "ストレートアルファテクスチャ"  
		前述の*「オプションでPMAテクスチャの代わりにストレートアルファを使用する」*を参照してください。
	- _Cutoff "シャドウアルファのカットオフ"  
		前述の*「`"ShadowCaster"`パスを持ち、リアルタイムに影を落とすことができる」*を参照してください。
	- 高度なパラメーター：
		- _StencilRef "ステンシルの参照"  
			マスク・インタラクションに使用します。
		- _StencilComp "ステンシルの比較"  
			マスクインタラクションに使用され、`SkeletonRenderer` または `SkeletonGraphic` コンポーネントが `Mask Interaction` プロパティに従って設定されます。
		- アウトラインパラメーター(_OutlineWidth "アウトラインの線幅"、その他。)  
			アウトラインシェーダーバリアント `Spine/Outline/Skeleton` に切り替えたときに使用されます。通常の非アウトラインシェーダーバリアント `Spine/Skeleton` では使用されません。

[次: Timeline 拡張UPMパッケージ](/spine-unity-timeline)
[前: ユーティリティコンポーネント](/spine-unity-utility-components)