Unity で再生した際に、パーツがチラチラ明滅するのに対処したい

複数のアニメーションをUnity上で再生した際に、優先度の高いパーツが低いパーツの下に潜り込んでチラチラ表示される Zファイティング(Z-fighting)と呼ばれる現象が発生することがあります。

これは動的メッシュバッチングの影響により、複数のアニメーションオブジェクト同士でマテリアル描画順序が不安定になることで発生しており、SS6Player for Unity で解消する2つの方法を解説します。

Order In Layer を設定する

SS6Player for Unity v1.1.0 以降で使用可能な方法になります。
機能は、アニメーションオブジェクトに対して Renderer.sortingOrder(描画順序の強制指定)の設定を行います。 設定方法は2種類ありますので、対応が行いやすい方法でお試しください。

インスペクタより設定

Hierarchy上のアニメーションオブジェクトの Script_SpriteStudio6_Root のインスペクタ内の
[Initial/Preview Play Setting] > Order In Layer
で設定を行ってください。

スクリプトで設定

設定アニメーションオブジェクトのScript_SpriteStudio6_RootのインスタンスをscriptRootとした際に
scriptRoot.OrderInLayer = (任意の整数);
で設定が可能です。

備考

  • 動作中での設定変更も可能です。
  • スクリプト上から指定する際に、アニメーションオブジェクトをシーン上にinstantiateした直後であっても、scriptRootがnullでなければ、任意のタイミングで設定可能です。
  • アニメーションオブジェクトに付いているMeshRendererコンポーネントが実体化しているかどうかのチェックは行う必要はありません(Script_SpriteStudio6_Root.csの内部処理で、MeshRendererが使用可能な時に本値を設定するようになっています)。

Z値を変える

Z値を0.0001f 程度の変化を付けてカメラ深度を変えることで症状を抑制できます。 マテリアル描画順序が不安定になる症状は「カメラからの深度が同じ」でないと発生しませんので、カメラからの深度に変化を設けることで対応する方法になります。 SS6Player for Unity v1.1.0 以前のバージョンでも使用できます。

使用上の注意点

  • Renderer.SortingOrderでの描画順序指定は、カメラからの深度(Zソート)での描画順序制御よりも優先度が高くなります。「Order In Layer 設定」、「Z値を変える」を併用する際はご注意ください。
  • 2つの方法(「Render.SortingOrder」と「カメラ深度を変える」)の差を理解して使い分けることで、よりアプリケーションの仕様に有利な描画順序を指定することが可能になります。

関連ページ

SS6Player For Unity
 最新版、質問・要望は GitHubへ