ライセンスについて

Spineランタイムをアプリケーションに組み込むにはSpineライセンスが必要です。

spine-unityランタイム ドキュメント

FAQ

インポート関連

スケルトンをUnityにインポートする際に何か問題が発生した場合、Spineのエクスポート設定が正しくない、Unityの設定が正しくないなど、様々な原因が考えられます。以下のビデオは、インポート時によくある問題に対する正しい対処法を理解するのに参考になるでしょう。

"Could not automatically set the AtlasAsset for .." というウィンドウが表示されインポートに失敗するのはなぜですか?

アトラスファイルの拡張子が .atlas ではなく .atlas.txt になっていることを確認してください。詳しくは「初心者のためのSpineからUnityへのエクスポート」をご覧ください。

git UPMパッケージからシーンを開こうとすると "Opening scene in read-only package!" というエラーになるのはなぜですか?

Opening scene in readonly package

残念ながらUnityのバグにより、git URL経由でダウンロードしたパッケージから直接シーンを開こうとすると "Opening scene in read-only package!" というエラーが発生してしまいます。パッケージに含まれているサンプルシーンを開くには、お使いのシステムのファイルマネージャー(エクスプローラーまたはFinder)を使用してシーンファイルをpackageディレクトリから Assets ディレクトリにコピーしてください。

ビジュアル関連

アタッチメントの透明な部分の周りが黒く縁取られてしまうのはなぜですか?

ほとんどの場合、テクスチャを Premultiply alpha (乗算済みアルファ) (PMA)としてエクスポートしているのに、Unityでインポートしたマテリアルやテクスチャの設定が合っていないことが原因です。詳しくは「乗算済み vs ストレートアルファインポート」をご覧ください。また、Linear 色空間を使用している場合、PMAテクスチャはサポートされていないことに注意してください。

もう1つの考えうる原因は、テクスチャのインポート設定で Generate Mip Maps が有効になっている状態でストレートアルファワークフローが一緒に使用されているにもかかわらず、カラーブリードがすべての透明ピクセルに適用されていない場合です。これは、Spineから Bleed オプションを有効にしてエクスポートした場合でも、エクスポートしたテクスチャを画像エディターで修正したりすると発生する可能性があります。アルファが0である透明な領域でカラーブリードが適切に再適用されず、代わりにピクセルのRGB部分が黒または白のままになるものもあります。修正されていないエクスポートされたテクスチャが正しく表示され、修正されたテクスチャが正しく表示されない場合は、カラーブリードが欠落していることが原因の可能性があります。

アタッチメントの透明な部分にカラフルなストライプが入ってしまうのはなぜですか?

ほとんどの場合、テクスチャをストレートアルファ(Bleed (ブリード))としてエクスポートしているのに、Unityでインポートしたマテリアルやテクスチャの設定が合っていないことが原因です。詳しくは「乗算済み vs ストレートアルファインポート」をご覧ください。

Generate Mip Mapsを有効にするとアタッチメントの周りに白い縁取りができるのですが、なぜですか?

ほとんどの場合、Premultiply alpha (PMA)としてテクスチャをエクスポートしているのに、UnityのインポートTexture設定でsRGB (Color Texture)が誤って有効になっていることが原因です。詳しくは「乗算済み vs ストレートアルファインポート」をご覧ください。

マテリアル設定の中のTint Blackオプションを有効にするとスケルトンの色がおかしくなるのはなぜですか?

SkeletonRenderer(またはSkeletonAnimation)コンポーネントで Advanced - Tint Black が有効になっていることを確認してください。

MeshRendererでマテリアルを割り当てることができません。なぜでしょうか?

マテリアルはSkeletonRendererによって毎フレーム制御されています。詳しくはマテリアルセクションをご覧ください。 各インスタンスごと、またはスロットごとにマテリアルを置換したい場合は、「インスタンスごとにマテリアルを変更する」をご覧ください。

同梱されているSpineシェーダーの一部が、私のURPプロジェクトで正しく表示されません。なぜですか?

spine-unityランタイムパッケージはBuilt-In Render Pipeline用のシェーダーのみを提供し、Universal Render Pipelineを使用しているプロジェクトとは互換性がありません。代わりにSpine URP Shaders拡張UPMパッケージで提供されているURP用のシェーダーを使用してください。

URPプロジェクトでアウトラインシェーダーがアウトラインしか表示しません。なぜですか?

以下の2つの原因が考えられます:

  1. Spine/SkeletonまたはSpine/Outline/Skeletonなど、Built-In Render Pipeline用のシェーダーをUniversal Render Pipelineプロジェクトで使用している可能性があります。Built-In Render Pipeline用のシェーダーはURPプロジェクトと互換性がありません。代わりにSpine URP Shaders拡張UPMパッケージで提供されているURP用シェーダーを使用してください。

  2. URP用シェーダー、Universal Render Pipeline/Spine/Outline/Skeleton-OutlineOnlyを使用している場合、これはシングルパスシェーダーであるため、アウトラインのみをレンダリングするのは正しい結果です。スケルトン本体のイメージと一緒に描画したい場合は、例えばRenderExistingMeshコンポーネントを使用して、このアウトラインのみのシェーダーでスケルトンメッシュを再レンダリングし、スケルトンの後ろにアウトラインを追加する必要があります。

動作するセットアップ例については、Spine URP Shaders UPMパッケージに含まれているサンプルシーン、com.esotericsoftware.spine.URP-shaders/Examples/Outline Shaders URPを参照してください。

アウトラインシェーダーが、スケルトンの各パーツの周囲に対してアウトラインを表示してしまいます。なぜですか?

スケルトンに複数のマテリアルが必要な場合、付属のアウトラインシェーダーは、スケルトン全体ではなく、各サブメッシュのアウトラインを描画してしまいます。最良の解決策は、単一のマテリアルのみが使用されるようにすることです。これは、アトラスを適宜パッキングするか、ランタイムでの再パッキングによって実現できます。これが不可能な場合は、例えばRenderCombinedMeshコンポーネントを使用して、スケルトンの後ろにアウトラインのみを追加するアウトラインシェーダーで、結合されたスケルトンメッシュを再レンダリングすると良いでしょう。アウトラインのみを描画するシェーダーは、ビルトインレンダーパイプライン用には Spine/Outline/OutlineOnly-ZWrite、URP用には Universal Render Pipeline/Spine/Outline/Skeleton-OutlineOnly が用意されています。

各スロットごとにマテリアルを置換するにはどうすればよいですか?

インスタンスごとにマテリアルを変更する」をご覧ください。

スケルトンにノーマルマップ(法線マップ)を使用してみましたが、見た目がおかしくなってしまいました。なぜですか?

SkeletonRenderer(またはSkeletonAnimation)コンポーネントで Advanced - Solve Tangents が有効になっていることを確認してください。

UIパネルのフェードアウト時に、CanvasGroupのアルファによってSkeletonGraphicが明るく光ってしまうのはなぜですか?

SkeletonGraphicコンポーネント - CanvasGroupアルファ」セクションをご覧ください。

アルファでフェードアウトを行った時にスケルトンの個々のパーツの重なりが透けて見えてしまうのはなぜですか?

これは三角形が重なって描画される時に透明度が適用されてしまうという、レンダリングの一般的な問題です。詳しくは「スケルトンのフェードイン、フェードアウト」セクションをご覧ください。

再パックしたスキンが、エディターでは表示されるのにビルドした実行ファイルでは白いポリゴンで表示されてしまうのはなぜですか?

ランタイムでの再パッキング」セクションの「重要な注意事項」にて、この問題のよくある原因をリストアップしています。

別のマシンで挙動が異なる

git URL経由でUPMパッケージを使用していますが、なぜ2つのマシン間でプロジェクトの動作が異なるのでしょうか?

git URL の末尾が #4.2 などの場合、Unity Package Manager はブランチ 4.2 から最新版をダウンロードすることになります。つまり、プロジェクトに必要なパッケージの初回インストール時にその最新版がダウンロードされるため、先にそのパッケージをダウンロードしたマシンは、他のマシンよりもパッケージの状態が古くなってしまいます。Package Managerで対象のパッケージを選択し、Update ボタンを押して再ダウンロードすれば最新版に更新することができますが、あらかじめこの問題を回避したい場合は、git URLの #4.2 の部分を #5e8e4c21f11603ba1b72c220369d367582783744 のように特定のgitコミットのハッシュに置き換えることで、プロジェクト内の全員が同じ状態のパッケージを一貫して使用できるようにしてください。コミットハッシュを取得する方法は以下をご覧ください。なお、残念ながら #5e8e4c21 のような短いコミットハッシュは Unity Package Manager では機能しないようですのでご注意ください。

Package Manager の git URL に使用する gitコミットハッシュを取得するにはどうすればよいですか?

githubのCommitsページにアクセスし、目的のブランチを選択して、コミットの右側にあるコピーボタン(ツールTipsに「Copy the full SHA」とあるボタン)をクリックすると、コミットハッシュをクリップボードにコピーすることができます。

パフォーマンス関連

スケルトンをインスタンス化すると、fpsが低下したり、GCメモリが割り当てられたりしてしまいます。ローディングを改善するにはどうしたらいいですか?

  1. スケルトンを .json でエクスポートしている場合は、.skel.bytes としてバイナリエクスポートに切り替えることを検討してください。 詳しくはUnity向けのバイナリエクスポートをご覧ください。
  2. ゲームプレイ中にスケルトンprefabをインスタンス化する場合、レベルロード時にスケルトンをロードすることを検討したり、またprefabのインスタンス化と破棄の代わりにオブジェクトのプールを用いることを検討してください。例えば、クリティカルでないレベルロードの時点で10個のインスタンスをロードすることで、プールを事前準備してください。そして新しいオブジェクトをインスタンス化する代わりに有効化して再配置し、破棄の代わりに無効化(および AnimationStateClearTracks ) してください。

1つのスケルトンにたくさんのドローコール/バッチ/マテリアルが表示されるのですが、なぜですか?

複数のアトラスページを使用していたり、スロットのブレンドモードを交互に描画している可能性があります。 詳しくは「マテリアル」セクションおよび「マテリアルの切り替えとドローコール」セクションをご覧ください。 複数のアトラステクスチャからスキンやアタッチメントを組み合わせる場合、アタッチメントを単一のアトラステクスチャに再パックするランタイムでの再パッキングを検討してください(1回の再パック操作にコストがかかります)。

スケルトンのパフォーマンスを向上させるにはどうしたらいいですか?

  1. クリッピングポリゴンの使用はできるだけ避け、代わりにUnityのマスキング機能を使用することを検討してください。どうしてもクリッピングアタッチメントを使用したい場合は、クリッピングポリゴンの頂点をできるだけ少なくしてください。ポリゴンの面積は重要ではなく、頂点数だけが重要なので、例えば長方形の領域をカバーするためには、2つの三角形ではなく1つの大きな三角形を作成することを検討してください。
  2. メッシュ変形キーはなるべく少なくしてください。
  3. 頂点数はなるべく少なくしてください。
  4. 不要なキーを削除してください。
  5. Spineエディターの測定基準ビューに表示されているその他の指標を最適化してください。
  6. アトラステクスチャのページ数はなるべく少なくしてください。
  7. スケルトンごとに複数のマテリアルが必要な場合は、Spineでの表示順序を最適化してマテリアルの切り替え回数を最小限にするか、アトラステクスチャエクスポートを最適化して、表示順序リストで隣り合ったアタッチメントが同じアトラスページテクスチャにグループ化されるようにしてください。 詳しくは「マテリアル」セクションおよび「マテリアルの切り替えとドローコール」セクションをご覧ください。
  8. 可能であれば、1つの大きなアトラステクスチャを複数のスケルトンで共有するようにしてください。異なるスケルトンのSkeletonDataAssetのアトラスアセットの配列で、単一のアトラスアセットを割り当てることができます。 詳しくは、「パッキング」をご覧ください。また、 フォルダ構造を用いたパッキングコマンドラインインターフェースを使用したパッキングも検討すると良いでしょう。

前: Timeline 拡張UPMパッケージ