简单总结Unity使用Resources类资源管理
2016-07-19 19:49
337 查看
最近参考了各位大神的资源,初步学习了Unity的资源管理模式,包括在编辑器管理(使用AssetDatabase)和在运行时管理(使用Resources和AssetBundle)。在此简单总结运行时用Resources类资源管理的方法,方便自己回顾。
官方文档对于Resources类的描述:
http://docs.unity3d.com/540/Documentation/ScriptReference/Resources.html
根据以上描述,需要注意的点:
Resources类只能读取名为“Resources”的文件夹里的资源,注意是复数形式。
Resources文件夹需要用户自己新建,可以放在Asset文件夹里任意层级的子目录中,若在不同目录下有多个“Resources”文件夹,加载某个指定资源时每一个“Resources”文件夹都会被检查。因此建议项目中只创建一个名为“Resources”的文件夹,且放在Asset文件夹的根目录下。
Unity打包发布时,只有Resources文件夹里的资源在会被打入包中。
Resources类加载资源时,使用”Resources”文件夹开始的相对路径,且不包含资源的扩展名。如要加载Asset/Resources/Images/1.jpg资源,加载路径应该写”Images/1”。
Demo:
总结一下:
Resources类的资源加载方式只有一种,但卸载方式却有三种,加载容易卸载难。选择有误会报错,甚至会连文件夹里的原始Asset一并删除!
Resources.UnloadAsset(obj):卸载非 GameObject类型的资源,会将内存中已加载资源及其克隆体卸载。
Destroy(obj):仅用于卸载GameObject类型的资源的克隆体。
DestroyImmediately(obj):卸载GameObject类型的资源,会将内存中已加载资源及其克隆体卸载,但该方法只能用在非编辑模式下,否则会报错提示改为DestroyImmediately(obj, true),然而编辑模式下使用该函数会连文件夹里的原始Asset一并删除。
官方推荐的卸载资源方法是:
从返回值可以看出这是个异步操作,即Unity需要花费一定时间去检索哪些资源没有被使用才会去卸载。使用方便,但不快捷,还要注意哪些资源是否一直被全局变量引用,导致一直无法释放。
官方文档对于Resources类的描述:
http://docs.unity3d.com/540/Documentation/ScriptReference/Resources.html
根据以上描述,需要注意的点:
Resources类只能读取名为“Resources”的文件夹里的资源,注意是复数形式。
Resources文件夹需要用户自己新建,可以放在Asset文件夹里任意层级的子目录中,若在不同目录下有多个“Resources”文件夹,加载某个指定资源时每一个“Resources”文件夹都会被检查。因此建议项目中只创建一个名为“Resources”的文件夹,且放在Asset文件夹的根目录下。
Unity打包发布时,只有Resources文件夹里的资源在会被打入包中。
Resources类加载资源时,使用”Resources”文件夹开始的相对路径,且不包含资源的扩展名。如要加载Asset/Resources/Images/1.jpg资源,加载路径应该写”Images/1”。
Demo:
using UnityEngine; using System.Collections; public class TestResources : MonoBehaviour { void Start () { /* 加载资源 */ // 预制体返回GameObject类型,路径不包含拓展名 GameObject go = Resources.Load<GameObject>("Prefabs/Cube"); // 资源在加载后要被实例化才能看到(等于克隆一个出来) GameObject go2 = Instantiate(go); // 加载其他非GameObject类型的资源 Texture2D image = Resources.Load<Texture2D>("Images/1"); // 测试是否加载成功 Debug.Log(image.name); /* 卸载资源 */ // 卸载非GameObject类型的资源,会将已加载资源及其克隆体剔除 Resources.UnloadAsset(image); // 卸载GameObject类型的资源的克隆体 Destroy(go2); #if UNITY_EDITOR // 在编辑器模式下无法卸载go物体,否则会报错让改用DestroyImmediate(obj, true),但这样做会连文件夹里的原始Asset一并删除! #else DestroyImmediate(go); // 所有该物体的克隆体也都一并被删除,即本例中的go2物体 #endif } }
总结一下:
Resources类的资源加载方式只有一种,但卸载方式却有三种,加载容易卸载难。选择有误会报错,甚至会连文件夹里的原始Asset一并删除!
Resources.UnloadAsset(obj):卸载非 GameObject类型的资源,会将内存中已加载资源及其克隆体卸载。
Destroy(obj):仅用于卸载GameObject类型的资源的克隆体。
DestroyImmediately(obj):卸载GameObject类型的资源,会将内存中已加载资源及其克隆体卸载,但该方法只能用在非编辑模式下,否则会报错提示改为DestroyImmediately(obj, true),然而编辑模式下使用该函数会连文件夹里的原始Asset一并删除。
官方推荐的卸载资源方法是:
public static AsyncOperation UnloadUnusedAssets()
从返回值可以看出这是个异步操作,即Unity需要花费一定时间去检索哪些资源没有被使用才会去卸载。使用方便,但不快捷,还要注意哪些资源是否一直被全局变量引用,导致一直无法释放。
相关文章推荐
- unity实现多点触控代码
- 在Unity中实现动画的正反播放代码
- Unity UGUI教程之实现滑页效果
- unity实现摄像头跟随
- Unity3D上路_01-2D太空射击游戏
- Unity3D上路_02-第一视角射击游戏
- Unity3D上路_03-塔防游戏
- Unity3D上路_04-基础资源介绍
- Unity3D上路_05-网络相关
- Unity3D-5.3.5发布VR项目到Android
- unity 新UI草稿
- [软件资讯]Unity已支持将3D游戏导出成Flash
- ShaderLab: Pass
- Unity 武器拖尾效果
- unity常见问题之20题
- Unity3D动画存储插件
- unity 赛车相机跟随物体移动
- uLua中遇到的问题
- Unity3d 协程、调用函数、委托
- Unity3d摄像机Camera参数详解