SpriteStudio / SS5PlayerForUnity

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

v1.3.x 表示プライオリティについて #183

Open f3b49 opened 8 years ago

f3b49 commented 8 years ago

お世話になっております。表示プライオリティについて質問させてください。

SSで使用しているZソート機能をuGUI,Meshオブジェクトでも 機能させたいのですが、どのように対応すればよろしいのでしょうか? Viewを改造して対応することは可能でしょうか?

こちらでやりたいことはSpriteStudioで作成した複数のキャラクタの上に HPバーと名前を表示したいだけなのですが、プライオリティが 制御できなくて困っています。

もしViewで対応できない場合はSpriteStudioデータで対応したいのですが HPバーや名前とかをSpriteStudioで表現することは可能でしょうか?

MasamiYitsuse commented 8 years ago

f3b49様

お世話になっております。

まず、NGUIやuGUIのオブジェクト等を、SS5PUのZソート内に含むことは、現状(そして過去のバージョンでも)行うことはできません(Script_SpriteStudio_ManagerDraw.csの機能がSS5PUのアニメーションオブジェクト群をメッシュバッチングする専用の機能であるためです)。

そのため、NGUIやuGUIのオブジェクトと同居させるような場合については、「画面全体でPhotoshopのレイヤーフォルダのように、描画アセット毎で描画順を管理する」か、または「NGUIやuGUIの描画空間に対してSS5PUの描画物を入れてやる」という形で考える方がストレートになります。

例えば、NGUIを例にとりますと、 NGUIは原則、UIRootの下にあるCameraで「UIのレイヤー指定がされているオブジェクト群」を描画しています。また、このCameraは、Depthが「1(など0よりも大きい値)」になっていると思います。 つまり、通常のCamera(大抵の場合、「Default」のレイヤー設定となっており・Depthは0になっているかと思われます)の後に、NGUIのカメラで描画を行っている形になっています。 ※つまり、ゲーム中の他のオブジェクトよりも、必ずNGUIが上に描画される初期設定になっています。

それらとの混在方法などについては、

177

179

などでも触れておりますが……原則「NGUIの下にくるCamera」と「NGUIの上にくるCamera」を設置して、分けてレンダリングをする方法があります。 ※それぞれのIssueの詳細は、上記の先のIssueをご参照下さい。

次に、上記177でも軽く触れている、少々厄介な場合についてです。 例えば ▼ウィンドウ1 ・UISprite (ウィンドウを表示) ・SS5PU (ウィンドウの上の装飾を表示) ・UIText (テキストを表示) ▼ウィンドウ2(ウィンドウ1に重なっている) ・UISprite (ウィンドウを表示) ・SS5PU (ウィンドウの上にアイコンを表示) ・UIText (テキストを表示)

……などを行おうとすると、このCameraとViewとレイヤーをいちいちプライオリティごとに作っていると、大変なことになってしまいます。 ※正直、上記のようなケースは、SetPath(主に描画のマテリアルを切り替える回数で、Unity4.xまでは「DrawCall」と表示されていました)が増えまくってしまい、実行が重くなったりなどの色々な弊害が出るので、こういう重ね方を多用した画面実装などは推奨しかねる面がございます。

その場合、ViewをSS5PUのスプライトアニメデータ毎に持たせてしまい、そのViewの処理レイヤーを「UI」などに設定して、NGUIのカメラで描画し・その上で(各SS5PUのアニメーションオブジェクトにつけたViewの)TransformのZの設定値でNGUIのオブジェクトと描画順制御を行う……というような形をとることもできます。 ※ただし、NGUIとSS5PUのCameraの使用方法の違いなどで、SS5のアニメーションがNGUIなどと大きさがあわない場合がありますので、その場合Scaleなどで大きさを適切になるように調整してやる必要があります。


現在SS5PUではテキスト表示には対応しておりません。

また、もしゲージ等をSS5PUのデータ等で行いたい場合、現在、そのような機能(明らかにゲージを作成するための機能など)を実装はしていませんが……実装案を挙げるとすれば、 SS5上のゲージのデータを ・rootパーツ  ・通常パーツ: ゲージのスプライト(例えば赤帯)  ・通常パーツ: ゲージの飾り

※1「ゲージのスプライト」のパーツの原点はゲージが0になったときの位置(例えば左端)にある必要があります。また、このパーツは「Xスケール・Yスケールのキーデータを設置しないで」ください(設置すると、外部から値を設定できなくなってしまいます)。もし、セルの大きさの関係でスプライトを変倍しなくてはならない場合、この方法を用いる場合簡便なのはセルを指定した上で(スケールX・Yではなく)Xサイズ・Yサイズのアトリビュートで、スプライトの大きさを強制的に設定してしまうのが良いかと思われます。

※2上のパーツ名は、解説のため日本語で記載していますが、実際のパーツ名は半角英数字で名前を付けてください。

……のような形にしておきます。 その上で、Unity上でゲージのスプライトのパーツのGameObjectを参照しておくか、Script_SpriteStudio_RootのIDGetParts関数を使用してパーツ名でパーツのIDを取得してから、そのパーツのGameObjectを取得して、そのtransform.localScale.xで、ゲージの長さなどをスクリプトから設定してやる……などの方法がとれるかと思います。

非常に乱暴ですが……(そのままコピー&ペーストしてしまったりした場合にコンパイルエラーやバグなどが発生するかと思います旨、申し訳ございません)

C#のソースを作成し、名前をつけます(この例ではScript_Gauge.csとしておきます)。

[System.Serializable]
public class Script_Gauge: MonoBehaviour
{
    public Transform InstanceTransform; /* SS5PUのデータで「ゲージのスプライト」のGameObjectへの参照 */
    public float RateGauge; /* 最小:0.0~最大:1.0でゲージの長さの割合 */

    /* この関数はUpdateではなくLateUpdateでも構いません(処理タイミングによります) */
    void Update()
    {
        if(null != InstanceTransform)
        {
            InstanceTransform.localScale.x = RateGauge;
        }
    }
}

などと行っておくと、例えばこの場合、 このスクリプトをGameObjectに設置して、インスペクタ上のInstanceTransformの欄に、シーン上に存在するSS5PUのゲージのデータの「ゲージのスプライト」のGameObjectをドラッグ&ドロップすると、RateGaugeの設定比率でゲージを伸び縮みさせることができると思います。

これは非常に簡単な例なので、実用するためにはもう何段階か工夫や「既に存在しているキャラクタなどの制御スクリプトに、機能として入れる」などが必要かと思いますが、簡単な概念的なサンプルとして……。

……といった感じになるかと思われます。


以上、実践的なスクリプトなどのご提供ではなく、概念的な説明に終止しており、大変申し訳ございませんが、何かしらの参考になれば幸いです。 また、何卒今後とも宜しくお願い致します。

MasamiYitsuse commented 8 years ago

ちなみに、もっと恐ろしく強行的な方法はあるのですが……正直Unityの使い方としても推奨できないことを先に明言させて頂いた上で、具体的な方法の言及を避けて・ヒント的な概略のみにて失礼致します。

描画に使用しているマテリアルの、とある値を強制的にスクリプト(プログラム)から設定してしまい、(SS5PUのZソートはおろか)UnityのZソート機能などを半分飛び越える形で、描画順をほぼ強制的に指定することができたりします。

ただし、これについては、使いすぎると画面管理が無茶苦茶になったり、バグなどの発生に収集がつかなくなったりしますので、ご注意下さい(マテリアルの通常時のインスペクタ等にもその値の設定項目などが「存在しない」ことから、危険度を類推してくださいますようお願い致します)。

MasamiYitsuse commented 8 years ago

表題を変更いたしました。 v1.3.13 → v1.3.x

※本件は、Ver.1.3系のリリース(末尾の3つ目のバージョンコード)に関わらず関係するご質問の内容のため、リリースコードを規定しない形に記載を変更させて頂きました。

f3b49 commented 8 years ago

迅速なご返答ありがとうございます。

ViewをSS5PUのスプライトアニメデータ毎に持たせる方法と マテリアルの、とある値を強制的にスクリプトから設定する方法を試してみます。 またご相談させてください。

将来的にPlayerのアップデートでこういった処理が簡単になると大変助かります。 今後とも宜しくお願い致します。