SpriteStudio / SS5PlayerForUnity

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

v1.2.8 View3DをDestroyする前にScript_SpriteStudio_PartsRootをDestroyした場合について #127

Open ghost opened 9 years ago

ghost commented 9 years ago

お世話になっております。 View3Dオブジェクト(Script_SpriteStudio_DrawManagerView がアタッチされたオブジェクト)よりも先に Script_SpriteStudio_PartsRoot(がアタッチされた)オブジェクトをDestroyしますと 下記のメッセージがコンソールに出力されております。

Combine mesh instance 22 is null. UnityEngine.Mesh:CombineMeshes(CombineInstance[]) ArrayListMeshDraw:MeshSetCombine(MeshFilter, MeshRenderer, Camera, Transform) (at Assets/SpriteStudio/ScriptLibrary/Library_SpriteStudio.cs:1067) Script_SpriteStudio_DrawManagerView:LateUpdate() (at Assets/SpriteStudio/Script/Script_SpriteStudio_DrawManagerView.cs:220)

こちらの回避方法を教えて頂けますでしょうか。

SS5Player のバージョン:1.2.8 Unityのバージョン:5.1.0f3

よろしくお願い致します。

MasamiYitsuse commented 9 years ago

お世話になっております。 ご返答が遅れ申し訳ございません。 Issue-121の件と併せ近日中に調査や改修・対処策などをご案内いたします。 お忙しい中大変申し訳ございませんが、何卒ご理解の程お願い申し上げます。

MasamiYitsuse commented 9 years ago

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

また、(同源ではないかもしれませんが)同種のものとして現状下記のような症状をもっていることは確かです。

https://github.com/SpriteStudio/SS5PlayerForUnity/wiki/%E3%81%94%E6%B3%A8%E6%84%8F 上記ページ中の「シーンセーブ時などに出るWarningについて」に記載してある内容となります。

もし、アプリケーションの実行中に同警告が出力される状態であれば当方が未把握の状態の症状です。

また、当方でUnity5+SS5PU Ver.1.2.14(現状のGitHub:Develop上の最新)で下記のような簡単なスクリプトを数種作成し、LateUpdateなどでも処理をおこなってみました。

using UnityEngine;
using System.Collections;

public class DestroyTest : MonoBehaviour
{
    private Script_SpriteStudio_PartsRoot PartsRoot = null;
    private int Counter = 0;

    // Use this for initialization
    void Start()
    {
        Counter = (int)(Random.value * 200.0f);
    }

    // Update is called once per frame
    void Update()
    {
        if(null == PartsRoot)
        {
            PartsRoot = Library_SpriteStudio.UtilityParts.InstanceGetRoot(gameObject);
        }
        if(null != PartsRoot)
        {
            Counter--;
            if(0 >= Counter)
            {
                Counter = 0;
//              Destroy(gameObject);
                DestroyImmediate(gameObject);
            }
        }
    }

    void LateUpdate()
    {
    }
}

極簡単な内容のため、再現にはもっと複雑な処理状態・条件が必要かもしれません旨について考慮できていない点、大変申し訳ございません。

その上で、上記スクリプトがScript_SpriteStudio_DrawManagerView.csの直前位の優先度ですと、上記のエラーがDestroyの有無に関係なく、出ることが確認できました。

現状の回避策としては、スクリプトの実行順序を上げて(理想的には、Script_SpriteStudio_PartsRootよりも上の優先度にして)頂くことで回避が可能かと思われます。 設定の詳細としては、 https://github.com/SpriteStudio/SS5PlayerForUnity/wiki/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9:-Unity%E3%82%84MonoDevelop%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E8%A8%AD%E5%AE%9A こちらに記載されております。 ※その上で加えて安全をとるのであれば、アプリケーションの動作状態を見ながら「Script_SpriteStudio_LinkPrefab.cs」の値を「-2」「Script_SpriteStudio_AnimationReferenced.cs」の値を「-1」(他のスクリプトよりも実行優先度を高くする)に設定してみて下さい。

もし、実行順序を調整しても、同症状が起こる場合、他の付帯情報がお分かりになりましたら、情報をいただけますと非常に助かります。

お忙しい中お手数ですが、何卒よろしくお願いいたします。

ghost commented 9 years ago

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

返事が遅くなり申し訳ございません。 ご提示頂きました手法にてスクリプトの実行順番を調整してみましたが、 症状は発生しております。

他に発生条件等分かりましたら追ってご連絡させて頂きます。

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

MasamiYitsuse commented 9 years ago

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

状況が改善しない旨、了解致しました。 当方でもバージョンアップ作業などの合間に検証を続け、何か判明要素が発見できた場合にはこちらにてレポートさせて頂きます。

お忙しい中お手間をおかけいたしますが、なにとぞよろしくお願いいたします。