ライセンスについて
Spineランタイムをアプリケーションに組み込むにはSpineライセンスが必要です。
レンダリング
マテリアル
各アトラスページのTextureは、スケルトンインポート時に自動的に作成される独自のMaterialを必要とします。Normal(通常)
以外のSlotブレンドモードを使用する場合は、ブレンドモードごとに追加のMaterialも作成されます(PMA使用時の Additive(加算)
は除きます。これは通常のマテリアルでレンダリングが可能です)。MeshRendererのMaterials配列は、現在割り当てられているアタッチメントと、それらが含まれているAtlasAssetsに応じて、毎フレームごとにSkeletonRendererによって管理され、現在割り当てられているアタッチメントとそれらが含まれるAtlasAssets、およびSlotで使用されているブレンドモードに依存します。
注意: Materialsの配列を直接変更しても、次の
LateUpdate()
で上書きされてしまうので、効果はありません。マテリアルをオーバーライドするには、SkeletonRendererCustomMaterialsまたはSkeletonGraphicCustomMaterialsコンポーネントを使用してください。また、_Atlasアセットで異なるマテリアルを割り当てて、すべてのインスタンスのマテリアルを変更することもできます。_Atlasアセットを変更した後は、SkeletonRenderer
コンポーネントのSkeletonData Asset
パラメーターでReload
を押して新しいアトラスマテリアルを使用してスケルトンを再ロードする必要があります。
注意:
SkeletonGraphic
コンポーネントではSpine/SkeletonGraphic*
シェーダーを持つマテリアルのみを使用してください。URP、LWRP、またはSpine/Skeleton
のような通常のシェーダーをSkeletonGraphic
コンポーネントで使用しないでください。詳しくは SkeletonGraphic - マテリアルの重要な要件 をご覧ください。
マテリアルの切り替えとドローコール
割り当てられたアタッチメントが複数のアトラスページに分散している場合、あるいはマテリアル A
とマテリアル B
のように異なるブレンドモードを持っている場合、Materials配列はマテリアルが必要とされる表示順序に従って設定されます。
例えば、もし表示順序が以下のようになっているとしたら:
- Aからのアタッチメント
- Aからのアタッチメント
- Bからのアタッチメント
- Aからのアタッチメント
マテリアルの配列は以下のようになります:
- Material A (アタッチメント1と2用)
- Material B (アタッチメント3用)
- Material A (アタッチメント4用)
Materials配列のすべてのマテリアルはドローコールに対応しています。そのため、マテリアルの切り替え量が多いとパフォーマンスに悪影響を及ぼしてしまいます。
Dragonの例では、多くのドローコールがある残念なユースケースを紹介しています:
そのため、アタッチメントは可能な限り少ないアトラスページでパックすることや、表示順序に応じてアタッチメントをアトラスページにまとめて不要なマテリアルの切り替えを防ぐことが推奨されています。 Spineアトラスのアトラス領域の配置方法についてはSpineテクスチャ・パッカー: フォルダ構造をご覧ください。
インスタンスごとにマテリアルを変更する
注意: SkeletonRendererのMaterials配列を直接変更しても次の
LateUpdate()
で上書きされてしまうので、効果はありません。以下の方法が適切でない場合は、SkeletonAnimation.OnMeshAndMaterialsUpdated
コールバックデリゲートを使用して、手動で毎フレームMeshRenderer.Materials
をオーバーライドすることができます。このコールバックは、アトラスマテリアルが割り当てられた後、LateUpdate()
の最後に呼び出されます。
CustomMaterialOverrideとCustomSlotMaterials
SkeletonRendererでは、特定のスロットのマテリアルをオーバーライドしたり、結果のマテリアルをオーバーライドすることができます。
SkeletonRendererインスタンスの実行時にオリジナルのマテリアルを新しいマテリアルに置き換えるには、以下のように SkeletonRenderer.CustomMaterialOverride
を使用します:
// 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<MeshRenderer>().material
は使用しないでください。また、originalMaterial = skeletonAnimation.GetComponent<MeshRenderer>().sharedMaterial
を使用することもお勧めしません。 アクティブなフレームにアクティブなアタッチメントが無い場合など、プライマリマテリアルがまだ割り当てられていないときにNULLを返す可能性があるからです。
特定のスロットだけに置換マテリアルを使用するには SkeletonRenderer.CustomSlotMaterials
を使用します:
skeletonAnimation.CustomSlotMaterials.Remove(slot); // 置換を無効にする。
バッチングを維持しながらスケルトンをティント(着色)する
スケルトンインスタンスに異なる Materials
や MaterialPropertyBlocks
を使用すると、バッチングが発生します。個々のスケルトンインスタンスを異なる方法でティント(着色)したいだけで、他のマテリアルプロパティを変更する必要が無い場合は、Skeleton.R .G .B .A
カラープロパティを使用できます。ティントを適用するには、SkeletonRendererのInspectorで Advanced - PMA Vertex Colors
を有効にする必要があります。
...
skeleton = GetComponent<SkeletonRenderer>().Skeleton;
...
skeleton.R = color.r;
skeleton.G = color.g;
skeleton.B = color.b;
skeleton.A = color.a;
これらのスケルトンカラーの値は、頂点カラーを設定するもので、マテリアルプロパティには影響しません。
個々のアタッチメントをティントする場合も同様です。:
...
slot.R = slotColor.r;
slot.G = slotColor.g;
slot.B = slotColor.b;
slot.A = slotColor.a;
注意: アニメーション内でアタッチメントカラーの値を変更している場合は、アニメーションが適用された後に、SkeletonAnimation.UpdateCompleteコールバックなどでスロットカラーの値を必ず設定してください。
MaterialPropertyBlocks
Renderer.SetPropertyBlockを使って、1つの MeshRenderer
のマテリアルプロパティ値を上書きすることができます。
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で定義されたスロットの表示順序に従います。1つのメッシュ内では、1回のドローコールでも、正しく順序付けられたスケルトンパーツを描くことができます。
複数メッシュ間では、どのメッシュがどのメッシュの上に来るべきかを決定するために、spine-unityはUnityの描画順序システムの多くを利用しています。標準的なspine-unityの設定では、スケルトン全体のメッシュは、以下の複数の要素によって決定された順序でレンダリングされます:
- Camera depth マルチカメラの設定に関連しています。
- Material.renderQueue 設定すると、シェーダーの
Queue
タグを上書きします。 - シェーダーの
Queue
タグ デフォルトでは、他のスプライトと同様にSpine
シェーダーで"Transparent"
のキューに入っています。 - Sorting Groupコンポーネント MeshRendererのGameObjectや親のGameObjectsに配置された場合
- レンダラーのSortingLayerおよびSortingOrder within a layer
- カメラからの距離 カメラは平行投影(planer)または透視投影(perspective)のどちらを使用するかを設定できます。
シーンのレンダラーが同じsorting layerとorderにあり、シェーダーの Queue
タグが同じであれば、カメラまでの距離でSpine GameObjectのソートをコントロールすることができます。なお、カメラにはtransparencySortModeプロパティがあります。
Sorting LayerとOrder in Layer
SkeletonRenderer (またはサブクラスのSkeletonAnimation とSkeletonMecanim)のInspectorには Sorting Layer
と Order in Layer
プロパティがあり、MeshRenderer
のsortingLayerIDとsortingOrderプロパティを実際に変更します。これらのプロパティは SkeletonRenderer
の一部ではなく、MeshRenderer
の一部として保存されます。
また、これらのプロパティにはコードからアクセスすることができます:
ソートの誤りを防ぐには
特に平行投影(orthographic)カメラを使用している場合、複数のアトラスページを使用しているスケルトンが誤ってソートされてしまうことがあります。 この問題を解決するには、スケルトンGameObjectにSorting Groupコンポーネントを追加する必要があります。また、カメラを少しだけ回転させるという方法もあります。例えば、カメラのトランスフォームY回転の値を0.001に設定するなどです。
スケルトンパーツ間のオブジェクト
例えば、キャラクターが木に突っ込んだ時に、片足を木の前に、片足を木の後ろに表示させるなど、キャラクターのパーツの間に他のGameObjectを表示させたい場合があります。
spine-unityでは、スケルトンを複数のパーツに分割するためにSkeletonRenderSeparatorコンポーネントを提供しています。
スケルトンのフェードイン、フェードアウト
残念ながら、アルファブレンディングでは、スケルトンのアルファ値を下げて半透明にするとスケルトンの下位のパーツが透けて見えてしまいます。これは、各三角形の描画時に透明度が適用されるためです。
この問題を解決する方法のひとつは、一時的なRenderTextureを使用することです。キャラクター全体を通常の不透明度でRenderTextureにレンダリングし、その後、このRenderTextureのコンテンツを任意のフェード不透明度でシーンに描画することができます。 また、これを実現するために提供されているSkeletonRenderTextureとサンプルコンポーネントSkeletonRenderTextureFadeoutを使用することができます。これらのコンポーネントのデモは、サンプルシーン Spine Examples/Other Examples/RenderTexture FadeOut Transparency
で確認できます。
なお、これはフェードアウト効果を作成するための数ある方法のうちのひとつに過ぎません。スケルトンを徐々にソリッドカラーで染めたり、スケールを小さくするなど、他にも簡単な方法がある可能性があります。RenderTextureは負荷のかかる解決方法であり、従来はほとんど使用されてこなかったため、既存の2Dゲームを参考にしてみた方が良いかもしれません。
シェーダー
spine-unityランタイムにはいくつかの異なるシェーダーが同梱されています。デフォルトでは Spine/Skeleton
シェーダーが新しくインポートされたスケルトンのMaterialに割り当てられます。シェーダーの変更は、通常通りMaterialのShaderパラメーターで行います。以下に、同梱されているSpineシェーダーのリストをご紹介します。
重要な注意事項:
SkeletonGraphic
コンポーネントでは、CanvasRenderer
と互換性のある特別なシェーダーのみを使用してください。詳細はSkeletonGraphic - マテリアルの重要な要件をご覧ください。
重要な注意事項: spine-unityランタイムパッケージは Built-In Render Pipeline 用のシェーダーのみ同梱しており、Universal Render Pipeline を使用しているプロジェクトとは互換性がありません。Universal Render Pipelineを使用している場合は、代わりにSpine URP Shaders 拡張UPMパッケージにて提供されているURP用のシェーダーを使用してください。
注意: ディファードシェーディングレンダリングパスは、Spineシェーダーではまだサポートされていません。
-
Spine/Skeleton (デフォルトシェーダー)
ライティングを反映しないUnlit透明シェーダー。Zバッファ(深度バッファ)への書き込みは行いません。 -
Spine/Skeleton Graphic (SkeletonGraphic用のデフォルトシェーダー)
SkeletonGraphicで使用される、ライティングを反映しないUnlit透明シェーダー。Zバッファ(深度バッファ)への書き込みは行いません。CanvasGroup
で使用する場合、Additive(加算)
ブレンドモードはサポートされていないため、代わりにSpine/Skeleton Graphic Tint Black
を使用する必要があります。CanvasRendererの制限により、1つのテクスチャに限定されます。 -
Spine/Skeleton Lit
シンプルなLit透明シェーダーで、ノーマルマップ(法線マップ)はサポートしていません。Zバッファ(深度バッファ)への書き込みは行いません。 -
Spine/Skeleton Lit ZWrite
シンプルなLit透明シェーダーで、ノーマルマップ(法線マップ)はサポートしていません。Zバッファ(深度バッファ)への書き込みを行います。 -
Spine/Skeleton Fill
カスタマイズ可能なカラーオーバーレイを備えたUnlit透明シェーダー。Zバッファ(深度バッファ)への書き込みは行いません。FillColor
はオーバーレイの色を、FillPhase
はオーバーレイの色の強さを決定します。 -
Spine/Skeleton Tint
カスタマイズ可能な2色のティント(暗色と明色を別々に着色すること)を備えたUnlit透明シェーダーで、ティントブラックと呼ばれます。Zバッファ(深度バッファ)への書き込みは行いません。テクスチャの明るい色は
Tint Color
で染められ、テクスチャの暗い色はBlack Point
カラーで染められます。これにより、着色されたテクスチャは、通常の乗算カラーブレンドと比較して、元の色よりも明るくなります。Tint Color
とBlack Point
の両方を同じ色に設定すると、ソリッドカラー(べた塗り)のオーバーレイになります。Tint Color
を黒に、Black Point
を白に設定すると、テクスチャの色を反転することができます。 -
Spine/Skeleton Tint Black
Spineでアニメーションされているスロットごとのティントブラックの機能を持つ、Unlit透明シェーダーです。 Zバッファ(深度バッファ)への書き込みは行いません。 Spineはスロットにティントブラック機能を提供し、アニメーションによるブラックティントを可能にします。
以下の追加の設定ステップが必要です(ティントカラーの頂点データの場合):
- SkeletonAnimationのInspectorの
Advanced
セクションでTint Black
を有効にしてください:
- SkeletonAnimationのInspectorの
-
Spine/Skeleton Tint Black Additive
Spineでアニメーションされているスロットごとのティントブラックの機能を持つ、Unlit透明シェーダーです。 Additive(加算)ブレンドモードを使用します。 Zバッファ(深度バッファ)への書き込みは行いません。 -
Spine/SkeletonGraphic Tint Black
SkeletonGraphic用のSpine/Skeleton Tint Black
シェーダーの派生です。CanvasGroup
と一緒に使用する際にAdditive(加算)
ブレンドモードをサポートします。以下の追加の設定ステップが必要です(ティントカラー頂点データの場合):
- SkeletonAnimationのInspectorの
Advanced
セクションでTint Black
を有効にします。 - SkeletonGraphicのMaterialを、CanvasGroupのサポートの有無に関わらず、PMAまたはストレートアルファテクスチャのワークフローに適した
Spine/Runtime/spine-unity/Materials
のそれぞれのサブフォルダにあるSkeletonGraphicTintBlack
マテリアルに設定します。 - 親キャンバスを選択し、
Additional Shader Channels
でTexCoord1
とTexCoord2
を有効にします。
CanvasGroup
でのAdditive(加算)
ブレンドモードのためには以下の追加手順が必要です: 4. SkeletonGraphicのInspectorのAdvanced
セクションでCanvas Group Tint Black
を有効にします。 5. a) spine-unity 4.2以降の場合: SkeletonGraphicのInspectorのAdvanced
セクションでCanvasGroup Compatible
を有効にします。 b) 古いバージョンの場合: SkeletonGraphicのInspectorのAdvanced
セクションでCanvas Group Tint Black
を有効にします。 6. シェーダーでCanvasGroup Compatible
を有効にしてください。 - SkeletonAnimationのInspectorの
-
Spine/Sprite
これらは設定変更が可能な洗練されたシェーダーで、Spine/Skeleton Lit
シェーダーよりも高度なライティングが可能です。Spine/Sprite/Vertex Lit
シェーダーのデモは、サンプルシーンSpine Examples/Other Examples/Sprite Shaders
で確認できます。- Spine/Sprite/Unlit
ブレンドモード、オーバーレイカラー、色相、彩度、明るさの調整が可能なUnlitシェーダーです。Zバッファ(深度バッファ)への書き込みの設定を変更可能です。Fog(フォグ)をサポートしています。 - Spine/Sprite/Vertex Lit
ブレンドモードの設定変更が可能な洗練されたVertex-Litシェーダーです。 ノーマルマップ(法線マップ)、セカンダリアルベド、メタリック、エミッションマップをサポートしています。 カラーランプによるセルシェーディング風の外観と法線に基づくリムライティング、 オーバーレイの色、色相、彩度、輝度の調整、 Zバッファ(深度バッファ)への書き込みの設定を変更可能です。Fog(フォグ)をサポートしています。 - Spine/Sprite/Pixel Lit
Spine/Sprite/Vertex Lit
シェーダーのPixel-litバージョンです。これはピクセルごとのリアルタイムシャドウを受けることが出来る唯一のシェーダーです。 このシェーダーは、常にZバッファ(深度バッファ)に書き込みます(ForwardAdd
パスを使用するため、ZWrite
が有効になっています)。
- Spine/Sprite/Unlit
-
Spine/Special
- Spine/Special/Skeleton Grayscale
Intensityをカスタマイズできるグレースケールレンダリング用のUnlit透明シェーダーです。Zバッファ(深度バッファ)への書き込みは行いません。 - Spine/Special/Skeleton Ghost
SkeletonGhostコンポーネントがトレイルレンダリングに使用する特別なシェーダーです。
- Spine/Special/Skeleton Grayscale
-
Spine/Blend Modes
これらのシェーダーは、SpineエディターでブレンドモードにAdditive(加算)
、Multiply(乗算)
、Screen(スクリーン)
が割り当てられているスロットを対象としています。インポート時に、提供されているSkeletonData Blend Mode Materialsを介して、ブレンドモードマテリアルを自動的に割り当てることをお勧めします。- Spine/Blend Modes/Skeleton PMA Additive
ライティングを反映しないUnlit透明シェーダー。Additive(加算)ブレンドモードを使用します。Zバッファ(深度バッファ)への書き込みは行いません。 - Spine/Blend Modes/Skeleton PMA Multiply
ライティングを反映しないUnlit透明シェーダー。Multiply(乗算)ブレンドモードを使用します。Zバッファ(深度バッファ)への書き込みは行いません。 - Spine/Blend Modes/Skeleton PMA Screen
ライティングを反映しないUnlit透明シェーダー。Screen(スクリーン)ブレンドモードを使用します。Zバッファ(深度バッファ)への書き込みは行いません。
- Spine/Blend Modes/Skeleton PMA Additive
-
Spine/Outline
上記のすべてのシェーダーにはOutline
パラメーターがあり、これを有効にすると、それぞれのSpine/Outline
シェーダーのバリエーションに切り替わり、スケルトンの周囲に追加のカラーアウトラインが描画されるようになります。Spine/Outline
シェーダーのデモはサンプルシーンのSpine Examples/Other Examples/Outline Shaders
でご覧いただけます。- Spine/Outline/OutlineOnly-ZWrite
アウトラインのみをレンダリングする特殊なシングルパスシェーダーです。アタッチメントが重なった時にアウトラインのオクルージョンを適切に処理するために、Zバッファ(深度バッファ)への書き込みを行います。また、スケルトンに複数のマテリアルが必要で通常のアウトラインシェーダーではスケルトン全体ではなく各サブメッシュのアウトラインをとってしまうという場合にもこちらのシェーダーを使用することで解決できます。例えば、RenderCombinedMesh
コンポーネントを使用して、結合されたスケルトンメッシュをこのアウトラインのみのシェーダーで再レンダリングし、スケルトンの後ろにアウトラインを追加することができます。
- Spine/Outline/OutlineOnly-ZWrite
ポストプロセスエフェクト
被写界深度(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パッケージセクションを、アップデートする方法については拡張UPMパッケージのアップデートセクションをご覧ください。
URPシェーダーのUPMパッケージは、2D Renderer機能を含む、Unityの Universal Render pipeline用に作られたシェーダーを提供します。
注意:
SkeletonGraphic
コンポーネントではURPシェーダーを使用しないでください。詳しくはSkeletonGraphic - マテリアルの重要な要件 をご覧ください。
注意: Universal Render Pipelineに最近追加されたデファードレンダリングパスは、Spine URPシェーダーではまだサポートされていません。
2Dレンダラーを使用するURPシェーダー (URP (3D)フォワードレンダラーとは一緒に使用しないでください)
- Universal Render Pipeline/2D/Spine/Skeleton
Spine/Skeleton
シェーダーのユニバーサル2D Rendererバージョンです。 - Universal Render Pipeline/2D/Spine/Skeleton Lit
Spine/Skeleton Lit
シェーダーのユニバーサル2D Rendererバージョンです。 - Universal Render Pipeline/2D/Spine/Sprite
Spine/Sprite/Vertex Lit
およびPixel Lit
シェーダーのユニバーサル2D Rendererバージョンです。
3Dフォワードレンダラーを使用するURPシェーダー (URP 2Dレンダラーとは一緒に使用しないでください)
- Universal Render Pipeline/Spine/Skeleton
Spine/Skeleton
シェーダーのユニバーサルバージョンです。 - Universal Render Pipeline/Spine/Skeleton Lit
Spine/Skeleton Lit
シェーダーのユニバーサルバージョンです。ピクセルごとのリアルタイムシャドウを受けるように設定することもできます。 - Universal Render Pipeline/Spine/Sprite
Spine/Sprite/Vertex Lit
およびPixel Lit
シェーダーのユニバーサルバージョンです。ピクセルごとのリアルタイムシャドウを受けます。 - Universal Render Pipeline/Spine/Outline/Skeleton-OutlineOnly
Spine/Outline
シェーダーのユニバーサルバージョンです。URPはシェーダーごとに複数のパスを許可していないため、別のマテリアルが必要になります。本パッケージに含まれるサンプルシーンOutline Shaders URP
で紹介している通り、RenderExistingMesh
コンポーネントを使用した方が良いでしょう。スケルトンに複数のマテリアルが必要な場合は、RenderExistingMesh
コンポーネントの代わりに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パッケージセクションを、アップデートする方法については拡張UPMパッケージのアップデートセクションをご覧ください。
LWRPシェーダーのUPMパッケージは、以下のUnityの軽量レンダーパイプライン用に作られたシェーダーを提供します。
注意:
SkeletonGraphic
コンポーネントでは、LWRPシェーダーを使用しないでください。詳しくはSkeletonGraphic - マテリアルの重要な要件を参照してください。
- Lightweight Render Pipeline/Spine/Skeleton
Spine/Skeleton
シェーダーのLightweightバージョンです。 - Lightweight Render Pipeline/Spine/Skeleton Lit
Spine/Skeleton Lit
シェーダーのLightweightバージョンです。 - 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からテクスチャをエクスポートする場合は、Spine以外のシェーダーを使用することができます。Spineシェーダーにしかない機能を再現したい場合は、フォーラムのこちらの投稿を参考にしてください。[1]、[2]。ご質問がある場合は、Unityサブフォーラムに新しいスレッドを立ててください。
Amplify Shader Editor
Amplify Shader Editorには公式に提供されているシェーダーテンプレートはありませんが、ユーザーの Hana
さんがフォーラムのこちらの投稿でテンプレートコードを公開してくれています。
シェーダーを自作する
まず前提として、一般的なUnityのカスタムシェーダーの書き方を理解してください。特にTutorial: Weiting vertex and fragment shadersは良い概要となっており、speine-unityシェーダーの各部分が何をしているかをより簡単に理解することができます。
既存のspine-unityシェーダーから始める
まずは既存のspine-unityシェーダーをコピーすることから始めることを強くお勧めします。その後、すでに動作しているシェーダーを徐々に修正して、求めていた効果を得るように調整することができます。例えば、最終的な色を返す前に追加の色処理を加えることができます。例えば次のコードは、グレースケール機能で拡張された SkeletonGraphic
シェーダーの調整バージョンを作成する方法の簡単な例を示しています:
{
_GrayIntensity("Intensity", Range(0, 1)) = 1 // この行はMaterialプロパティを提供するために追加しました
[..]
}
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シェーダーの以下のような違いに注意してください:
- Spineスケルトンをレンダリングする場合には、
Cull Off
を設定して必ずバックフェースカリングを無効にするようにしてください。 - Spineシェーダーは通常、法線を必要としないため、Litシェーダーを使用する場合はコンポーネントで
Advanced - Add Normals
を有効にする必要があります。 - Spineシェーダーは通常、接線を必要としないため、ノーマルマップ(法線マップ)を使用する場合はコンポーネントで
Advanced - Solve Tangents
を有効にする必要があります。 - Spineシェーダーはデフォルトで乗算済みアルファテクスチャを使用します。そのため、以下のいずれかを行ってください a) アトラステクスチャをストレートアルファとしてエクスポートする b) シェーダーのブレンドモードをPMAブレンドモードである
Blend One OneMinusSrcAlpha
に変更する - Spineの頂点の色は、通常、PMA頂点の色です。透明または
Additive(加算)
スロットを使用する場合、次のいずれかを行うことができます
a) シェーダーのブレンドモードをPMAブレンドモードであるBlend One OneMinusSrcAlpha
に変更し、PMAアトラステクスチャを使用する、または b) コンポーネントでAdvanced - PMA Vertex Colors
を無効にする(Additive(加算)
スロットをレンダリングしない場合)
通常通り、UI用および非UI用シェーダーにおける一般的なルールが適用されます:
SkeletonAnimation
またはSkeletonMecanim
に対してUI用シェーダーを使用しないでください。SkeletonGraphic
に対して非UI用シェーダーを使用しないでください。
Spine/Skeleton
シェーダーの解析
次のセクションでは、Spine/Skeleton
シェーダーの解析を行います。このシェーダーは、Spineテクスチャアトラスのインポート時にMaterialが生成されると、デフォルトで適用されます。 Spine/Skeleton
シェーダーはかなり短くて典型的なもので、次のような特徴があります:
- 乗算済みアルファ(PMA)ブレンディング
- 深度バッファの書き込み無し
- ライティング無し
- バックフェースカリング無し
- Fog(フォグ)無し
- 頂点カラーを使って乗算でテクスチャを染める
- オプションでPMAテクスチャの代わりにストレートアルファを使用する
"ShadowCaster"
パスを持ち、リアルタイムに影を落とすことができる- Materialプロパティ:
- _MainTex "メインテクスチャ"
- _StraightAlphaInput "ストレートアルファテクスチャ"
- _Cutoff "シャドウアルファのカットオフ"
- 高度なパラメーター:
- _StencilRef "ステンシルの参照"
- _StencilComp "ステンシルの比較"
- アウトラインパラメーター (_OutlineWidth "アウトラインの線幅"、その他。)
詳細:
-
乗算済みアルファ(PMA)ブレンディング
hlslBlend One OneMinusSrcAlphaブレンディングは、
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
が有効になっている場合、Normal(通常)
およびAdditive(加算)
スロットブレンドモードは、頂点カラーとしてシェーダーに暗黙的に渡されます:hlslstruct VertexInput {
float4 vertexColor : COLOR
}PMAの頂点カラーとサンプリングされたPMAのテクスチャカラーを掛け合わせる際、スロットの
Normal(通常)
またはAdditive(加算)
ブレンドモードが自動的に適用されます:hlslreturn (texColor * i.vertexColor);そのため、シェーダーで適切な
Normal(通常)
とAdditive(加算)
PMAブレンドモードをサポートする必要があります:Blend One OneMinusSrcAlpha
としてブレンド関数を定義する。- テクスチャの色と頂点の色を掛け合わせる。
- コンポーネントでAdvanced -
PMA Vertex Colors
を有効にする。
標準的なブレンドモード
Blend SrcAlpha OneMinusSrcAlpha
を使用したシェーダーを使用し、Additive(加算)
スロットを必要としない場合、使用したアトラステクスチャをSpineからストレートアルファとしてエクスポートする必要があります。 -
深度バッファの書き込み無し
hlslZWrite Off深度バッファへの書き込みが無いのは、アルファブレンディングされた2Dスプライトシェーダーの典型です。透明なオブジェクトは、深度バッファでの深度ソートに頼らず、
Camera.transparencySortMode
に従って、前後の順序で描画されます。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、標準パイプラインシェーダーは、それぞれ異なるライティング評価設定を使用しているので、それに合わせてリファレンスシェーダーを選択することに注意してください。 -
バックフェースカリング無し
hlslCull OffSpineスケルトンをレンダリングするための唯一の厳格な条件は、2Dシェーダーによく見られるバックフェースカリングを無効にすることです。
ほとんどの3Dシェーダーでは、バックフェースカリングが有効になっています。Spineメッシュでは、パーツがマイナスにスケールされたり、スケルトンの方向を反転させたりすると、この処理によって一部の三角形が見えなくなってしまいます。
-
Fog無し
Spine/Skeleton
シェーダーはFog(フォグ)の影響を受けません。シェーダーでFogを有効にするには、シェーダーコードに追加の頂点パラメーターと関数呼び出しが必要です。以下
UnityCG.cginc
より:hlslmulti_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_foghlslUNITY_FOG_COORDS(1) // to declare it at the free attribute TEXCOORD1hlslUNITY_TRANSFER_FOG(output,output.pos); -
頂点カラーを使って乗算でテクスチャを着色する
前述の「乗算済みアルファ(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" }
を持つセカンドパスはLightMode
によって自動的にShadowCasterパスとして識別されます。ShadowCaster
パスは、RGB カラーを一切書き込まず、代わりに深度情報をシャドウバッファに書き込みます。そのため、必ずZWrite On
を使用します。 半透明の深度を書き込むことはできないので、フラグメントは深度バッファに書き込まれるか、影を落とさないように破棄されます。これは、しきい値関数コールで行います:hlslclip(texcol.a * i.uvAndAlpha.a - _Cutoff);ここでは、
_Cutoff
Materialパラメーターがアルファのしきい値を定義しており、x < 0の場合、clip(x)
によってフラグメントが破棄されます。 -
Materialプロパティ:
- _MainTex "メインテクスチャ"
メインのテクスチャ。 - _StraightAlphaInput "ストレートアルファテクスチャ"
前述の「オプションでPMAテクスチャの代わりにストレートアルファを使用する」を参照してください。 - _Cutoff "シャドウアルファのカットオフ"
前述の「"ShadowCaster"
パスを持ち、リアルタイムに影を落とすことができる」を参照してください。 - 高度なパラメーター:
- _StencilRef "ステンシルの参照"
マスク・インタラクションに使用します。 - _StencilComp "ステンシルの比較"
マスクインタラクションに使用され、SkeletonRenderer
またはSkeletonGraphic
コンポーネントがMask Interaction
プロパティに従って設定されます。 - アウトラインパラメーター(_OutlineWidth "アウトラインの線幅"、その他。)
アウトラインシェーダーバリアントSpine/Outline/Skeleton
に切り替えたときに使用されます。通常の非アウトラインシェーダーバリアントSpine/Skeleton
では使用されません。
- _StencilRef "ステンシルの参照"
- _MainTex "メインテクスチャ"