tago 様
お世話になっております。SS6Player for Unity(以降SS6PU)担当です。
レポートとご質問ありがとうございます。
まず、SS6PUのバグとは別の関係で、「優先度が狂う」に類する事象が起こることがありますため、確認させていただきたい内容がございます。
まず、先になのですが……
> その際の問い合わせにお答えいただいた内容が、Z座標ではなく優先度で指定するようにご指摘いただいておりました。
この件については、詳細でないものの記憶がございます。
SS5Player for Unity(以降SS5PU)は、SpriteStudio5での「Z座標」でのソートに対応していないため、パーツの表示優先度は「優先度」でのソートを行う必要がある……とお返事したかと思います。
もしその時に、Unity上での各「アニメーションオブジェクト(Script_SpriteStudio_Root)」の前後関係は(GameObjectでの)Z座標でソートされるというお話に触れていなかったとしたら、大変申し訳ありません。
その上で、SS6PUについては、SS5PUとは描画の処理がかなり変わっておりまして、SS5PUの時にあった「View」という「画面全体での表示スプライトの最適化」を行うための機構がなくなっております。
SS6PUでは、画面全体での表示スプライトの最適化については、Unityの「メッシュの動的バッチング」の機構に、そのまま任せております(ただし、SS6PUでは画面全部ではなく、アニメーションオブジェクト毎には旧来のViewと同様の最適化処理を入れております)。
※SS5PUの頃は、Unityが(Unityの)ライセンス形態によって、この動的メッシュバッチングの機構が使えない場合があり、ユーザーの皆様から(ライセンスの関係で動的メッシュバッチングが使えなくても)同様のことをできるようにしてほしい……という要望が少なくなかった関係から、Viewの機能が存在しておりました。
※SS6PUについては、対応しているUnityのバージョンが新しくなったことで、そのライセンス形態によっての動的メッシュバッチングの有無の差がなくなったことや、「GPUインスタンシング」などへの対応の関係や扱い勝手の向上の側面から、Viewを廃止してUnityの機能に任せる形に仕様が変更になりました。
上記の前提の上で……
1) Unityのシーン上でScript_SpriteStudio6_Rootのオブジェクトが配置されている、それぞれのオブジェクトのZ座標(ないしはカメラからの奥行き)は同じではないでしょうか?
頂いた
> 再現性は不明なのですが、「多くのScript_Sprite Studio 6_Rootのプレハブを生成している」ことが条件にあるような挙動が確認できております。
の内容からの類推なのですが……狂っている描画状態(前後が違っていたり・表示されていないように見える)が(SSAEでの)パーツの優先度の関係ではなく、
「複数のSSCE(セルマップテクスチャ)で構成されているアニメーション群を、数多く画面に置いた時に、画面全体で見た時に、特定のセルマップテクスチャのもので分かれて前後関係が入れ替わってしまっている」という状況が起こっていたりしませんでしょうか?
例えば、Aというアニメーションが複数のセルマップテクスチャ(ここではそれぞれを1・2・3……とします)で構成されていて、「1→2→1」という描画順序になっているとします。
このAのオブジェクトを大量に画面上に出現させた時に、オブジェクトのZ座標が「同じ値」である場合、画面全体での描画順序が、アニメーション毎の想定される表示順序(例えばシーン上でのGameObjectの並び順序など)とは異なった状態になり……
(Unityの機能で)画面全体で各セルマップテクスチャ毎にまとめられて(最適化されて)しまって「1→2」や「2→1」という順序で表示されてしまうために、プライオリティが狂ったり・アニメーションがちらついて見えたり……などと認識できる状態が起こります。
この症状は、Unityの「動的メッシュバッチング」の機能によって、「表示されているオブジェクト群が、マテリアル(セルマップテクスチャや合成方法)毎でまとめられてしまうために、複数のマテリアルを使用しているオブジェクトを同じZ深度で複数表示した場合に、メッシュがまとめられてしまい・描画順序が想定通りには行われない」ということから起こります。
※これは、SS6PUのオブジェクトのみに限らず、通常の3Dモデルオブジェクトなどでも起こります。
そのため、まず、以下の点をチェックいただきたくお願いいたします。
a. Unityのシーン上で、同じZ座標で複数のScript_SpriteStudio6_Rootオブジェクトを描画していないか?
b. SS6PUで使用しているマテリアル(インポートしたデータのAssets内のフォルダの「Material」サブフォルダ内にあります)の「Render Queue」が「Find Shader」か「Transparent」になっているか?(シェーダ内の設定から取得するか・半透明オブジェクトのレンダリング順序に指定する……ということです。原則「Find Shader」になっていないとおかしいです)。
もしaの場合、オブジェクトの表示の前後関係は、原則としてシーン上のZ座標(ないしはカメラからの奥行き)でUnityがソートしますので、前後関係に併せてZ座標を調整してみていただけませんでしょうか?
※ただし、「Unity Native」モードなどを使ってuGUI(SpriteRenderer)などで表示している場合には、Z座標は意味がないのですが……ご質問の内容から判断しますと、このケースではないような気がしますので、割愛します。
もし、上記が問題がない(前後関係に併せてUnityのシーン上でGameObjectのZ座標なども設定されていたりする)場合、SS6PU側の障害の可能性があると思われますので、その際にはご遠慮なくいただけますと助かります。
※一応、SS6PUのシェーダを書き換えることで、Unityの動的バッチングの処理をキャンセルすることはできるのですが……その場合、描画動作が著しく非効率になる場合があるため、一旦、今は説明を省略させていただきたく思います。
以上となります。
お忙しい中お手数とは存じますが、まずはご検証の程お願い申し上げます。
何卒今後ともよろしくお願いいたします。
追伸:
一応、GitHubのIssueに上記を記述したIssueがございます。
解消の一助となれば幸いです。
https://github.com/SpriteStudio/SS6PlayerForUnity/issues/10