SpriteStudio / SS5PlayerForUnity

OPTPiX SpriteStudio 5 Player for Unity
http://www.webtech.co.jp/spritestudio/
MIT License
39 stars 15 forks source link

v1.3.9 SS5描画と通常GameObject描画の表示順制御につきまして #177

Open chilca opened 8 years ago

chilca commented 8 years ago

SS5オブジェクトと自前のGameObjectを任意の表示順で重ね合わせることを目的として、 複数のSS5カメラ->ビュー->オブジェクト(***_Control)と、自前カメラ->自前GameObjectをシーンに配置し 各カメラのDepthにより表示順を制御しようと試みましたが、想像する結果になっておりません。 具体的には、

(1) SS5オブジェクト同士の優先順位に各カメラのDepthが反映されません。 (オブジェクトZ位置による表示順制御はできております。) (2) SS5オブジェクト群と自前GameObjectの表示順については、 ・すべてのSS5カメラのDepthより自前カメラのDepthが大きいまたは等しい場合は すべてのSS5オブジェクトの上に自前Objectが表示されます。 ・それ以外の場合、すべてのSS5オブジェクトの下に自前Objectが表示されます。

「バージョン1.3.x概要」にありますRenderQueue廃止に関する項目には、

RenderQueue機能を使用せず、カメラのレイヤー及びDepthや描画マネージャのTransformのZ値などで管理する形に変更になりました

との記載がありますが、v1.3.x系におけるカメラのDepthの影響範囲についてお教え頂けますでしょうか。 非推奨であることは承知致しておりますが、複数のSS5オブジェクト表示の間に 通常のGameObject表示をはさみこむ方法がありましたらご教示頂けるとありがたいです。

お忙しいところ恐縮ですがよろしくお願いいたします。

MasamiYitsuse commented 8 years ago

chilca 様

お世話になっております。 お返事が遅れ、申し訳ございません。

まず、Ver.1.3でSS5アニメーションの間に他の描画オブジェクトを挟み込む方法の前に、SS5PUの機能概要の説明をさせていただきます。

SS5PUはVer.1.1以降、「View」と呼ばれる、描画マネージャを持ったGameObjectが存在します。 このViewの役割は、「このViewに所属する各アニメーションオブジェクトを、描画時にメッシュバッチングして表示する」ことになります。 逆に言い換えると、「各アニメーションオブジェクトは、自身が所属するViewによって、描画がまとめられてしまう」となります。 過去、このViewでメッシュをバッチングする際の補佐機能として、スプライトオブジェクトで使用しているマテリアルの描画優先順位を強制的に変更する……というものがありました。これが「RenderQueue」機能となります。 この「RenderQueue」の機能は、Ver.1.2までの用法では便利な側面もあったのですが、Ver.1.3で様々な面で改良を行う上で、かえって設定ミスなどが見えづらくなってしまい、バグを誘発してしまうことから、廃止機能となった経緯がございます。

それを踏まえた上で、SS5PU Ver.1.3で描画オブジェクトを他の描画オブジェクトとプライオリティの共存をする方法ですが…… 1)複数のViewを用意し、そのTransformのZ座標で、他のオブジェクトとの表示順序を制御する。 2)複数のViewとCameraを用意し、CameraのDepthで、他のオブジェクトとの表示順序を制御する。

という2種類の方法があります。 どちらにも共通する必要な認識は、「View」の単位でメッシュがバッチングされ・表示される……ということです(このViewのGameObjectがMeshFilterとMeshRendererを持っています)。

1については、各スプライトオブジェクトが持っている(インスペクタ上の)「View」(ないしは、スクリプトからScript_SpriteStudio_Rootの「InstanceManagerDraw」メンバ)に、バッチング対象となるViewを設定します。 実際にUnityが描画する際には、このViewのGameObjectのTransformを参考にUnityがソートを行います。

このViewをどの程度の数用意するか……という話については、原則的な考え方として2つあります。 i)Photoshopなどのレイヤーフォルダのように、画面全体のプライオリティを設計して最低限の数を設置する。 ii)各スプライトオブジェクトのGameObjectの親として、全てのスプライトオブジェクトに個々にViewを付ける。

iは、画面全体の描画プライオリティが区分ごとに分かれている時に有効な方法です。 iiは、各オブジェクト毎のプライオリティがZ値などで動的に変わる時に有効な方法です。

2については、1の派生形となります。 特にNGUIなどの「別のカメラを使用して描画する」ような描画アセットとの併用する際の方法になります。 原則1を踏まえた上で、Viewに設定する(こちらはUnityでの)レイヤーを設定します(描画順序によっては、レイヤーを追加する必要がある場合もあります)。 その上で、追加したCameraに対して適したDepthを設定した上で、レンダリング対象となる(描画対象のViewに設定した)レイヤーを設定します。

恐らくお手元で起こっている現象としては、複数のカメラを設置してDepthを設定したものの、その複数のカメラが各々全てのViewをレンダリングしてしまっていることから起こっているのではないかと想定しています。 注意点としては、 ・バッチングを担当している各Viewに対して処理レイヤーを設定(各スプライトオブジェクトではなくViewです) ・それぞれのレンダリング順序(Depth)を持ったカメラで、レイヤー別にレンダリングする という点です。

以上が、原則的(これらから派生する方法はあるかと思います……との意味での「原則的」です)には、上記の形で他の描画物とのプライオリティを制御を行うことが可能です。

お忙しい中お手数ですが、何卒ご検討いただけますと幸いです。

chilca commented 8 years ago

お世話になっております。早々のご回答誠にありがとうございます。

ご教示頂きました通り、各カメラとそれに対応するViewに適切なレイヤーを設定することで SS5アニメーションオブジェクトとその他描画オブジェクトを混在させた状況での カメラDepthベースでの自由な表示順を実現できました。

お忙しいところ懇切なご説明を賜り感謝しております。 今後ともどうぞよろしくお願い致します。