Resources.UnloadAsset 卸载一张图片Asset
发表于2018-04-12
今天修改个资源管理脚本,发现一张图片卸载掉还能用。
所以,做个简单的例子试试看
将一个贴图Asset卸载掉,用 Resources.UnloadAsset(textureTex001);
完了,再创建一个物体,继续使用该贴图,该贴图还在(编辑器中Unity2017.0f3),这下有点尴尬。
代码如下:
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class ResourceTest : MonoBehaviour { private Texture2D textureTex001; void Start () { const string assetPath = "texApiTest/tex001"; textureTex001 = Resources.Load(assetPath) as Texture2D; CreateCube(textureTex001); CreateCube(textureTex001); PrintTextureNumber(); } void OnGUI() { if (GUILayout.Button("Resources.UnloadAsset(textureTex001)")) { Resources.UnloadAsset(textureTex001); PrintTextureNumber(); } if (GUILayout.Button("CreateCube")) { CreateCube(textureTex001); PrintTextureNumber(); } } private Vector3 _position = new Vector3(-3, 0, 0); public void CreateCube(Texture2D textureTex2d) { _position += new Vector3(1.5f, 0, 0); var plane = GameObject.CreatePrimitive(PrimitiveType.Cube); plane.transform.position = _position; var planeMaterial = new Material(Shader.Find(@"Legacy Shaders/Diffuse")); var planeRender = plane.GetComponent<MeshRenderer>(); planeRender.material = planeMaterial; planeMaterial.mainTexture = textureTex2d; } public void PrintTextureNumber() { var textures = Resources.FindObjectsOfTypeAll<Texture2D>(); var numberOfTextures = textures.Length; Debug.Log("load numberOfTextures : " + numberOfTextures); } }

问了别人,说是“一般来说释放不是同步的”让我推迟一帧再调用使用那张图。
是这样吗?

这个图就占一份内存,实例化的物体都是保存的该图的引用,如果释放掉这个图的Asset,那么所有用这个图的物体都会丢失这张图。这里描述的是显示的释放已加载的Asset对象。
已经释放了呀,但却还在。
打出版本来调试看看,发现打出版本来的是释放掉的,同一帧再调用也是释放掉的。
结论:(试验的结果,有可能不对)
- 不清楚同样的操作为啥编辑器和打出版本的不一样
- 肯定是执行UnloadAsset后,再使用那个图,肯定是没有了的
- 是不是执行UnloadAsset后,要把贴图textureTex001 = null,才能释放? 不存在的,没有赋值null,也照样释放
来自:https://blog.csdn.net/bigpaolee/article/details/79372797
如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引