0 支持
1.7k 閲覧
(140 ポイント) Q&A

Unity version : 2017.4.5f1

SpriteStudio6 Player version : 1.0.35

UnityのProfilerにあるAssets->Materialの中に消去したはずのSpriteStudioのデータが残っていました。Referenced By: を見ると"Asset has been edited and not yet saved to disk()"のみ書いてあり消去する方法が分かりません。消えないのには何か理由があるのでしょうか?

このページをシェアする

回答 1

0 支持
(5.0k ポイント)

お世話になっております。SS6Player for Unity(以降SS6PU)開発担当です。

現在、SS6PUはランタイムでのマテリアルの解放はUnityに一任しています。

※SS6PUでは現在独自の解放や(SS6PUのプレーヤー内部処理での)複製・変更などは行っていないという意味です。


ただ、どうもプロジェクトの運用状態などによっては、ランタイムで解放されたオブジェクトが持っていたマテリアルがリークされるケースがあるようです。

お手元のUnityプロジェクトの状態・データの使用(運用)状態がわからないので確定的な理由については断定できませんが、例えば下記のような事例等もあります。

-------

【Unity】DestroyしたオブジェクトのMaterialがリークする問題への対応

https://qiita.com/ShajikuWorks/items/da5ee4bc55832218f39a

-------

[Unity] Rendererのmaterialプロパティはメモリリークの原因になりうる

https://qiita.com/IKD-Member/items/4cb4a3ab97b6006d2652


もしこの事例に当てはまるとした場合の例で、下記のような形でScript_SpriteStudio6_Rootクラスに追加実装を行うことで解消できる可能性もあります。

※Script_SpriteStudio6_Rootクラスはpartialにしてありますので、外部から関数や変数などを追加実装することが可能です。

------- ここから

public partial class Script_SpriteStudio6_Root

{

  void OnDestroy()

  {

    if(null != InstanceMeshRenderer)

    {

      foreach(UnityEngine.Material material in InstanceMeshRenderer.materials)

      {

          Destroy(material);

      }

    }

  }

}

------- ここまで

※下記リストは、1つめのURLの記事でサンプルされているOnDestroy関数の処理内容をそのまま移植(メッシュレンダラをどう取得しているかが違うだけ)したものです。元の通りにDestroyImmediateを使用するかDestroyを使用するかはお手元のプロジェクトの状況に合わせてください。


以上がご質問いただいた情報の範囲で類推した返信となります。

ご検証の材料としていただければ幸いです。

何卒今後ともよろしくお願いいたします。

...