今回のUnityバージョン
Unity 2018.3.5f1
https://unity3d.com/jp/learn/tutorials/topics/best-practices/resources-folder
Unity公式のチュートリアルより要約
・最善の方法は使わないこと
・メモリ管理が困難になる
・アセットの管理が非常に難しくなる
・配信機能の低下
・プロトタイプを迅速に制作するには優れているが、製品版では排除する必要がある
・リソースフォルダ以下のAssetはシリアライズされる
次の場合は便利に使える
・プロジェクトの存続期間を通して一般的に必要
・メモリ集約型ではない
・パッチを適用する傾向がない、またはプラットフォームやデバイス間で差がない
・最小限のブートストラップに使用
とあるがなにより
・最善の方法は使わないこと
とはどういうことなのか?
簡単に下記ソースコードを書いて検証してみた
using System.Collections;
using UnityEngine;
public class ResourcesLoader : MonoBehaviour
{
protected System.Type LoadObjectType;
[SerializeField, Header("ResourcesLoadのPathを指定")]
private string ResourcesLoadPath;
private UnityEngine.Object Asset;
private void Awake()
{
SetLoadObjectType();
}
private IEnumerator Start()
{
var request = Resources.LoadAsync(ResourcesLoadPath, LoadObjectType);
yield return request;
Asset = request.asset;
OnLoadComplete(Asset);
}
private void OnDestroy()
{
if (Asset != null)
{
Resources.UnloadAsset(Asset);
Asset = null;
}
}
protected virtual void SetLoadObjectType()
{
LoadObjectType = typeof(Object);
}
protected virtual void OnLoadComplete(Object _object)
{
;
}
}
ざっくりどんな挙動をするかというと
1.GameObjectが生成されたらResourcesLoadPathに設定されているPathでリソースの非同期読み込みを行う
2.ロードが完了したらOnLoadCompleteが呼ばれる
3.GameObjectが削除されたらResources.UnloadAssetを呼ぶ
で検証の前にカメラだけがあるSceneにおいてAssetがどうなってるか
ProfilerでMemoryの項目をDetailed表示でAssetのSampleを取っておく
適当にGameObjectを作ってAddComponentし、test.pngを読み込んだのが
PrefabやらTransformやらMonoBehaviourなど増えているがLoadに関係するもののみ開いておく
そしてGameObjectを削除したら
画像データのロードにおいてはSprite情報は解放されず
Texture本体のみ解放されてしまったように見える。
ソースコードではリソースのAssetを読んで消したから関連するものは
消したつもりだったが完全に消し去ることはできなかったようだ。