最近参考了各位大神的资源,初步学习了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:

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一并删除!
#elseDestroyImmediate(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】使用Resources类管理资源相关推荐

  1. 噩梦射手 安装包资源包提供下载 Unity官方教程 Survival Shooter 资源已经失效了!? Unity3D休闲射击类游戏《Survival Shooter》完整源码

    Unity官方教程 (Survival Shooter)  资源已经失效了! 可能是版本太老了 中文名叫噩梦射手? 找了半天找了这个版本 的 放到这里吧 [这个游戏主角是必死的,就看能坚持多久啦] 网 ...

  2. [翻译]理解Unity的自动内存管理

    当创建对象.字符串或数组时,存储它所需的内存将从称为堆的中央池中分配.当项目不再使用时,它曾经占用的内存可以被回收并用于别的东西.在过去,通常由程序员通过适当的函数调用明确地分配和释放这些堆内存块.如 ...

  3. Unity程序开发框架——UI管理模块

    UI基类BasePanel负责帮助我门通过代码快速的找到所有的子控件,方便我们在子类中处理逻辑,节约找控件的工作量. public class BasePanel : MonoBehaviour {/ ...

  4. 内存是手游的硬伤——Unity游戏Mono内存管理与泄漏

    测试开发者的共同关注! WeTest导读 内存是游戏的硬伤,如果没有做好内存的管理问题,游戏极有可能会出现卡顿,闪退等影响用户体验的现象.本文介绍了在腾讯游戏在Unity游戏开发过程中常见的Mono内 ...

  5. 使用ASP.NET 2.0提供的WebResource管理资源

    在 ASP.net 2.0 构建的Web页面中,查看源文件,我们经常会看到下面的Html文本 <script src="/WebResource.axd?d=QfRKDnWw93T08 ...

  6. 用RAII技术管理资源及其泛型实现

    前言 RAII的含义是"资源获取即初始化". 一段看似安全的代码 首先看一段代码: try{ int *p = new int[100]; // ... do something ...

  7. java se好用吗_利用 Java SE 7 更好地管理资源

    2011 年 5 月发布 作者:Julien Ponge 本文介绍 Java 7 针对自动资源管理问题给出的解决办法,即 Coin 项目中提出的新语言结构 try-with-resources 语句. ...

  8. Android应用开发提高系列(5)——Android动态加载(下)——加载已安装APK中的类和资源...

    前言  Android动态加载(下)--加载已安装APK中的类和资源. 声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://ov ...

  9. Effective C++ 条款13 以对象管理资源

    // // main.cpp // 条款13:以对象管理资源 // // Created by 于磊 on 2018/7/8. // Copyright © 2018 于磊. All rights r ...

最新文章

  1. 什么是Fabric网络
  2. python os.path.exists()(用于判断文件夹路径是否存在)
  3. 新汉诺塔(洛谷P1242)含第11个数据的解决办法
  4. reveal end of document
  5. kafka spark java_spark streaming中维护kafka偏移量到外部介质
  6. [转载] 老版本ubuntu 更新源
  7. angular 个人零点学习
  8. [原]Linux 命令行浏览器
  9. 计算所与北大往事回顾
  10. 置换矩阵、转置矩阵以及向量空间、子空间
  11. 拼音加加符号编码列表
  12. 正宗eMule官方网站导航
  13. android 计时器函数,如何在Android中设置计时器
  14. 笔记本window7安装虚拟机centos7后通过笔记本无线网卡上网
  15. kettle使用 - 开启Carte服务
  16. FastDFS清空数据及文件步骤
  17. 数据结构 | 第十一章:二叉树和其他树 | 【前序遍历】【中序遍历】【后序遍历】【层次遍历】 | 并查集
  18. 2017年蓝桥杯模拟赛
  19. 黑白照片如何变彩色?看完这篇你就会了
  20. excel2007快捷键

热门文章

  1. linux隐藏文件的方法,Linux下隐藏文件的操作方法
  2. linux账号管理命令,linux账号管理及相关命令和操作
  3. 安卓开发 高德地图 marker 点击移动位置_高德手机AR导航再升级,有惊喜
  4. 虚拟机访问svn服务器超时_SVN卡顿原因及简单修复方法
  5. 微型计算机系统外文,微型计算机控系统(单片机控制系统) 毕业论文外文翻译.doc...
  6. insert 语句的选择列表包含的项多于插入列表中的项_如何定义和使用Python列表(Lists)
  7. 华为js面试题_四面腾讯与华为,大厂前端面试真BT!
  8. vue更新data无效,页面data没刷新 vue.set
  9. 洛谷P4705 玩游戏(生成函数+多项式运算)
  10. 爬虫原理与数据抓取----- urllib2:URLError与HTTPError