久しぶりのブログ更新。というのも、UnityのAsset Storeに出しているアセットについてユーザーから問い合わせがあったから。
問い合わせの内容は、シーンを保存したときに
1 |
Cleaning up leaked objects in scene since no game object, component or manager is referencing them Mesh has been leaked 1 times. |
というメッセージが出るのを止める方法はあるか? というもの。
いやあ、このメッセージが出るのは知ってたんだけど、いろいろ頑張っても消えなかったので無視してたんだよね〜。
でも問い合わせがあったからには、もうちょっと努力してみてまともな回答をしなくては、と思ってやってみたらあっさり解決してしまったので、その方法について書きます。
方法は実にシンプルでリークしていると言われているオブジェクトのhideFlagsにHideFlags.HideAndDontSave
をつけるだけ。
僕の場合はMeshをダブルバッファして使っていたので、こんな感じになる。
1 2 3 4 |
for (int i = 0; i < BUFFER_COUNT; ++i) { m_meshes[i] = new Mesh(); m_meshes[i].hideFlags = HideFlags.HideAndDontSave; } |
ただし注意が必要なのはHideFlags.HideAndDontSave
をつけたオブジェクトはシーンが破棄されても自動で破棄されないので、自分で破棄するようにする。Awakeでオブジェクトを作成しているならOnDestroy, OnEnableで作成しているならOnDisableで破棄するのが良いでしょう。
僕の場合は元々破棄するコードは書いてあったので、破棄するコードを書いたからと言って上のメッセージが出なくなるわけではなく、hideFlagsがミソ。