UnityのSpriteMaskおよびRectMask2Dに対応しました

February 22nd, 2019

Animated Sprite Mask Demo

ついに、spine-unityランタイムでUnityのスプライトマスクおよびUnity UIのRectMask2Dに対応しました!

スプライトマスクは、マスキング画像に基づいてスケルトンまたはスケルトンのグループの一部を隠したり、表示したりするために使用することができます。この機能は、SkeletonAnimationSkeletonMecanim 両方のコンポーネントに対して実装されています。また、spine-unityランタイムに同梱されているすべてのシェーダーをそのままサポートしています。

RectMask2Dは、スプライトマスクコントロールに似たマスキングコントロールで、Unity UI SkeletonGraphic オブジェクトを矩形領域に制限するために使用され、マスキング画像を使用するよりも優れたパフォーマンスを発揮します。

スプライトマスクとSpineスケルトン

SkeletonAnimation および SkeletonMecanim コンポーネントは、Unityのビルトインコンポーネント、SpriteRenderer で利用できるのと同じマスクインタラクションモードを反映して、Inspectorに Mask Interaction という追加フィールドを提供します:

Mask Interaction

以下のマスクインタラクションモードが提供されています:

  • None: このモードが設定されている時、スプライトはマスキングシステムと相互作用しません。(デフォルトの動作)
  • Visible Inside Mask: このモードが設定されている時、スプライトはマスクが存在する領域でのみ表示されるようになります。
  • Visible Outside Mask: このモードが設定されている時、スプライトはマスクが無い領域でのみ表示されるようになります。

自動生成されるマテリアル

Play モード外でInspector上でマスクインタラクションモードを切り替えると、各 Stencil Compare パラメータに対して追加のマテリアルアセットが生成されます。これらの追加マテリアルアセットは、ファイルの接尾辞に _InsideMask および _OutsideMask を使用し、元のマテリアルと同じフォルダに配置されます。

Mask Interaction Generated Materials

デフォルトでは、 Skeleton Animationは、生成されたすべてのマテリアルへの参照を保持します。これにより、多くのコンポーネントインスタンス間でマテリアルを共有でき、実行時にマテリアルをその場で生成することによるオーバーヘッドを削減できます。生成されたマテリアルは、SkeletonAnimation コンポーネントの Advanced セクションで以下のように管理・最適化することができます:

Mask Interaction Advanced Section

  • Clear ボタンを押すと、不要なマテリアルへの参照をクリアすることができます。
  • Delete ボタンを押すと、そのマテリアルへの参照をクリアし、アセットを削除することができます。しかし、他のゲームオブジェクト上の SkeletonAnimation コンポーネントが、まだそのマテリアルを参照している可能性があるため、注意して使用してください!
  • Set ボタンを押すと、それぞれのマテリアルへのリンクを再割り当てして、実行時に使用できるように準備することができます。そのマテリアルが存在しない、または削除されている場合は、デフォルトのマテリアルに基づいて再度生成されます。

実行時に Mask Interaction を変更する場合、コンポーネントは、利用可能であれば、事前に生成されたマテリアルを使用します。Advanced セクションで削除されたなどにより、これらの生成済みマテリアルが見つからなかった場合、デフォルトのマテリアルのコピーがその場で生成されます。しかしこれらのマテリアルは Skeleton Animation コンポーネント間で共有されないため、実行時に頻繁にその場で生成することになってしまうと、オーバーヘッドになる可能性があります。そのため、できる限り事前に生成されたマスキングマテリアルを使用することをお勧めします!

Stencil Compare シェーダーパラメーター

さらなるカスタマイズのために、spine-unityランタイムが提供している全てのシェーダーで Stencil Compare パラメーターを公開するようになりました。これにより、実行時にマテリアル管理をカスタマイズするための最大限の柔軟性が得られ、ランタイム自体がサポートする3つのバリエーションよりも多くのマテリアルバリエーションを作成することができます。

Shader Stencil Parameter

利用可能な Stencil Compare の値は以下の通りです:

  • Mask Interaction - None 用に CompareFunction.Disabled
  • Mask Interaction - Visible Inside Mask 用に CompareFunction.LessEqual
  • Mask Interaction - Visible Outside Mask 用に CompareFunction.Greater

Unity UI - 矩形マスクとSkeletonGraphic

SkeletonGraphic が使用するシェーダーが、Unityの RectMask2D コンポーネントをサポートするようになりました。矩形マスクは、SkeletonGraphicの SkeletonGraphic の子要素を親要素の矩形に制限するために使用することができます。

Mask Interaction

上の例では、3つの SkeletonGraphic オブジェクトがそれぞれ RectMask2D コンポーネントを持つ親を持ち、矩形領域に拘束しています。 RectMask2D は、標準のマスクコントロールよりも自由度の面では制限されますが、より良いパフォーマンスを発揮します。

今回spine-unityランタイムに追加されたこれらの機能が、より素晴らしいビジュアルのゲームやアプリを作成するための一助になることを願っています。ぜひSpine forumでご意見をお聞かせください。