SpriteStudio / SS5PlayerForUnity

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

v1.2.16 Script_SpriteStudio_DrawManagerViewが違う親オブジェクトに移動したときの描画優先順位について #133

Open sygeyacc opened 9 years ago

sygeyacc commented 9 years ago

お世話になっております 親のノードにScript_SpriteStudio_DrawManagerViewが設定されているスプライトを 別のScript_SpriteStudio_DrawManagerViewが設定されている親に移動させた時に 描画の優先順位が変更されないので意図した位置関係にならないのですが どのようにすればレンダーキューが変更されますでしょうか

よろしくお願い致します

MasamiYitsuse commented 9 years ago

sygeyacc様

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

恐らくSS5PU Ver.1.2.x系をご使用と仮定して返信させて頂きます。

Script_SpriteStudio_DrawManagerView(以下「View」と呼称します)内の描画優先度は、インスタンスパーツでない限り、View内でのZ座標で決定(ソート)されます。 そのため、単一のView内においては描画優先度はTransformのPositionのZで指定する形になります。 (インスタンスパーツに限っては、その呼出元である親オブジェクト内の「優先度」アトリビュートの設定値を参考に、親オブジェクトを他オブジェクトをZソートの後に、優先度を考慮してソートの対象とします)

また、複数のView間のレンダキューについては、それぞれのScript_SpriteStudio_DrawManagerViewのインスペクタ上の「Render-Queue Base」「Render-Queue Offset」の値が(それぞれのViewの下についているスプライトオブジェクト群の)開始値となりますので、それぞれのViewを作成中のシーンで適切な値に(各Viewの設定値を)調整して頂けますようお願いいたします。 ※SS5PU Ver.1.2.16以降ですと、本RenderQueue Base/Offsetをスクリプトから直接指定するための「Script_SpriteStudio_DrawManagerView.RenderQueueSet」関数が追加されております(この関数の詳細については、近日中にWiki内のスクリプトリファレンスに追記予定です)。

お忙しい中お手数ですが、何卒ご検証の程お願い申し上げます。

sygeyacc commented 9 years ago

ご返答ありがとうございます

情報が少なくて申し訳ありません

親Aノードに親Bに移動したいキャラクタ達 親Bノードに最初から存在しているキャラクタ達

親Aと親BはそれぞれScript_SpriteStudio_DrawManagerViewを持っておりレンダーキューも別にしています それぞれの親にキャラクタのスプライトを存在させております

親Aにいるキャラクタを親Bに変更したところ positionのz値は問題ないのですが描画順が思ったところに表示されませんでした 以前の親AのRenderQueueOffsetになっており値を変更したところ 親Bにいるキャラクタにもかかわらず描画順が変更されてしまいました

親のScript_SpriteStudio_DrawManagerViewを現在の物に認識させる手段はありますでしょうか

どうぞよろしくお願い致します

MasamiYitsuse commented 9 years ago

お世話になっております。 追加情報有難う御座います。状況、把握いたしました。

本修正は、SS5PU Ver.1.2.16より後(2015年7月末位を予定)のVer.1.2.17で正式実装される予定ですが、当該部分の修正内容を事前紹介させて頂きます。

・Assets/SpriteStudio/Script_SpriteStudio_PartsRoot.csのScript_SpriteStudio_PartsRootクラス内に下記関数を追加

public void ViewSet(Script_SpriteStudio_DrawManagerView DrawManagerView=null)
{
    if(null == DrawManagerView)
    {
        DrawManagerView = Library_SpriteStudio.Utility.DrawManagerViewGetParent(gameObject);
    }
    InstanceDrawManagerView = DrawManagerView;
}

スクリプトからView間を移動させている場合、本関数を、スプライトオブジェクトを異なるViewに移動した際に(移動後に)呼び出して下さい。 引数を指定できるようになっておりますが、省略記載で問題ありません(引数省略時は自動で親のViewを再度走査して発見します)。

ただし、描画処理とのタイミングの問題が出る可能性がありますので、できるだけ本関数の呼出はUpdate関数の中で行ってくださいますよう、お願いいたします。

エディタ上の場合には、さらに

・Assets/Editor/SpriteStudio/Inspector_SpriteStudio_PartsRoot.csに下記を追加

修正前:

    Data.FlagHideForce = EditorGUILayout.Toggle("Force-Hide", Data.FlagHideForce);
    if(true == GUILayout.Button("Apply \"Force-Hide\" to Children"))
    {
        LibraryEditor_SpriteStudio.Utility.HideSetForce(Data.gameObject, Data.FlagHideForce, true, false);
    }
    EditorGUILayout.Space();

    if(true == GUI.changed)
    {
        EditorUtility.SetDirty(target);
    }

修正後:

    Data.FlagHideForce = EditorGUILayout.Toggle("Force-Hide", Data.FlagHideForce);
    if(true == GUILayout.Button("Apply \"Force-Hide\" to Children"))
    {
        LibraryEditor_SpriteStudio.Utility.HideSetForce(Data.gameObject, Data.FlagHideForce, true, false);
    }
    EditorGUILayout.Space();
/* ここから */
    EditorGUILayout.Space();
    if(true == GUILayout.Button("Reset Parent-\"View\""))
    {
        Data.ViewSet();
    }
/* ここまでを追加 */

    if(true == GUI.changed)
    {
        EditorUtility.SetDirty(target);
    }

の修正で、インスペクタ上に「Reset Parent-"View"」のボタンが出てきますので、移動後にこのボタンを押下していただけますと、その場で親のViewの認識が変更されます。 (エディタ上では恐らく、プレイモードにした時点で一度Viewを再認識するので、あまり本ボタンの使い道はないかとは思われますが……)

以上となります。 お忙しい中お手数ですが、何卒ご検証の程お願い致します。


追伸: 本修正は本来「InstanceDrawManagerView」メンバをpublicにすることだけで、もっと平易に・汎用性が高い形の対応が可能ではありますが、SS5PUの(1.2.x系がFIX予定であることから)1.2.15以前との各種データ互換性の問題から、(publicにしてしまうとシリアライズ・デシリアライズ等との関係もあり)privateメンバのままの対応になっております旨、注記させて頂きます。

恐らくInstanceDrawManagerViewメンバ変数(もしくは同機能異名メンバ)については、1.3.x系ではpublic宣言に変更になると思われます。

sygeyacc commented 9 years ago

ご返答ありがとうございます 無事に対応できました

またわからないことがありましたらよろしくお願い致します