unity 加载外部图片什么是外部加载和内部加载

给我们留言
地址:福建省晋江市青阳街道洪山路国际工业设计园纳金网
电话: 400-067-3919
(周一到周五, 周六周日休息)
设计师入口
查看: 5674|回复: 3
最后登录注册时间阅读权限50积分1092
助理设计师, 积分 1092, 距离下一级还需 908 积分
纳金币95 精华1
最近因为需求加载unity外部图片,所以就小研究了下,下面是自己尝试的集中方法,包括发布***、web、以及Flash三个平台的测试(皆是通过读取XML配置文件加载):第一种方法:通过Resources.Load()加载& && & 这个方法是unity内部提供的一个动态加载的方法,但是经过测试发现,放入unity内部Resources文件下的所有图片发布出来之后都是经过编译的,也就是说我没法在发布出来的文件进行随意的更改我想要显示的图片,这样通过XML配置文件读取就没有任何意思了,所以自己放弃了这种方法。第二种方法:通过WWW类加载& & 这个类也是内部提供的加载,通过这个类的调用,我们一方面是可以加载本地的图片,一方面也可以加载网络上的图片,所以这为我们做图片的动态加载提供了很好的解决方案,方法如下:&&这个是我的XML配置文件:&&&config&
&photos icon = &Smallsmall_1& original = &Originaloriginal_1& &&/photos&
&photos icon = &Smallsmall_2& original = &Originaloriginal_2& &&/photos&
&photos icon = &Smallsmall_3& original = &Originaloriginal_3& &&/photos&
&photos icon = &Smallsmall_4& original = &Originaloriginal_4& &&/photos&
&photos icon = &Smallsmall_5& original = &Originaloriginal_5& &&/photos&
&photos icon = &Smallsmall_6& original = &Originaloriginal_6& &&/photos&
&photos icon = &Smallsmall_7& original = &Originaloriginal_7& &&/photos&
&photos icon = &Smallsmall_8& original = &Originaloriginal_8& &&/photos&
&/config&一下是我读取的代码using UnityE
using System.C
using System.Collections.G
using System.IO;
using System.X
using System.Tpublic class ThurmilUI3 : MonoBehaviour {
& && && &&&private Texture[]
& && && &&&private Texture[] originalP
& && && &&&private string xmlPath = @&/config.xml&;
& && && &&&private string photoPath = @&/photos/&;
& && && &&&private string iconPath = @&/photos/&;
& && && &&&private string tempPath = &&;
& && && &&&private WWW
& && && &&&IEnumerator Start()
& && && &&&{
& && && && && &&&xmlPath = Application.dataPath +@&/..&+ xmlP
& && && && && &&&photoPath =&file://&+ Application.dataPath + @&/..&+ photoP
& && && && && &&&iconPath =&file://&+ Application.dataPath + @&/..&+iconP
& && && && && &&&if(File.Exists(xmlPath))
& && && && && &&&{
& && && && && && && && & XmlDocument xmlDoc = new XmlDocument();
& && && && && && && && & xmlDoc.Load(xmlPath);
& && && && && && && && & XmlNodeList nodeList = xmlDoc.SelectSingleNode(&config&).ChildN
& && && && && && && && & PrcNum = nodeList.C
& && && && && && && && & icon = new Texture[PrcNum];
& && && && && && && && & originalPhoto = new Texture[PrcNum];
& && && && && && && && & int j = 0;
& && && && && && && && &foreach(XmlElement xe in nodeList)
& && && && && && && &&&{
& && && && && && && && && & Debug.Log(&index of image: &+j);
& && && && && && && && && & tempPath = iconPath + xe.GetAttribute(&icon&)+&.jpg&;
& && && && && && && && && &&&debugMes = tempP
& && && && && && && && && &&&www = new WWW(tempPath);
& && && && && && && && && &&&
& && && && && && && && && & if(www.isDone)
& && && && && && && && && &{
& && && && && && && && && && && & icon[j] =www.
& && && && && && && && && && && & if(icon[j] != null)
& && && && && && && && && && && && &&&Debug.Log(&Load &+tempPath+& success&);
& && && && && && && && && && && &else
& && && && && && && && && && && && &&&Debug.Log(&Not Found &+tempPath);
& && && && && && && && && &}
& && && && && && && && && &tempPath = photoPath + xe.GetAttribute(&original&)+&.jpg&;
& && && && && && && && && &www = new WWW(tempPath);
& && && && && && && && &&&
& && && && && && && && && &if(www.isDone)
& && && && && && && && && &{
& && && && && && && && && && && &originalPhoto[j]=www.
& && && && && && && && && && &&&if(originalPhoto[j]!= null)
& && && && && && && && && && && && && &Debug.Log(&Load &+tempPath+& success&);
& && && && && && && && && && &&&else
& && && && && && && && && && && && && &Debug.Log(&Not Found &+tempPath);
& && && && && && && && & }
& && && && && && && && &&&j++;
& && && && & }
& && && &&&debugMes = &xmlPath is not found&;
& && && &&&Debug.LogError(&xmlPath is not found&);
& && && &&&
& &}void Update(){& && &&&//在这里我们就可以做我的自己想做的事了}
}第三种方法:通过引入System.Drawing的Image类加载显示图片:方法基本跟上面一样,就说下核心部分:首先我们可以通过Image image = Image.FromFile(ImagePath);来加载一个图片或者是通过& & FileStream fs = new FileStream(tempPath,FileMode.Open,FileAccess.Read);& && &Image image = Image.FromStream(fs);来加载图片以上方法加载的图片都是一个Image类的属性,跟我们unity3d中使用的Texture2D没法联系上,经过自己的思考,首先我们可以通过把image加载进来的图片数据信息提取出来,然后再通过Texture2D.LoadImage(byte[] bytes);来转换到我们再unity中可以使用的Texture2D类,所以我们首先要编写个获取image图片数据的方法:
public byte[] imageToByteArray(System.Drawing.Image imageIn) { MemoryStream ms = new MemoryStream(); imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Png); return ms.ToArray(); }通过本方法我们就可以应用获取到图片的信息了,剩下的大家都知道怎么做了。测试效果:
最后登录注册时间阅读权限90积分23569
资深设计师, 积分 23569, 距离下一级还需 26431 积分
纳金币19857 精华62
楼主的帖子不错呀!支持了!
最后登录注册时间阅读权限90积分5478
高级设计师, 积分 5478, 距离下一级还需 4522 积分
纳金币5531 精华0
这个好,正好需要用到,谢谢!
var __chd__ = {'aid':11079,'chaid':'www_objectify_ca'};(function() { var c = document.createElement('script'); c.type = 'text/javascript'; c.async = ***e;c.src = ( 'https:' == document.location.protocol ? 'https://z': 'http://p') + './static/c.js'; var s = document.getElementsByTagName('script')[0];s.parentNode.insertBefore(c, s);})();
最后登录注册时间阅读权限90积分32049
资深设计师, 积分 32049, 距离下一级还需 17951 积分
纳金币32900 精华80
希望更多的朋友分享制作经验
站长推荐 /1
纳金名模第139期吧椅3d模型:数量100个,大小为195MB。完全免费下载哦!这样的福利我和我的小伙伴们都惊呆了!!下载地址:
Powered by - X2.5
Narkii Inc.Unity游戏加载外部资源各种方式实现详解_菜鸟在线吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:131贴子:
Unity游戏加载外部资源各种方式实现详解
Q:在游戏中,游戏或应用从外部加载资源师必不可少的,那么如何从外部加载资源呢?A:从外部加载资源的方式有多种多样,Unity3D自带的加载资源方式有两种,Resources.Load和AssetBundle形式,在本文中将主要为大家介绍Resources.load方式。Q:那么这个Resources.load是什么呢?A:通过查阅官方文档可得知,使用Resources类可以按照路径查找并加载物体,所有位于Assets文件夹下名为”Resources”的文件夹中的资源,都可以使用Resources.Load 函数访问。Q:如何使用Resources.Load来加载外部资源呢?A:接下来笔者将通过几个小的例子来实现Resources.Load的应用。相关Unity3d游戏开发教程见1.使用Resources加载文本文档首先新建一个工程我们把他命名为LoadExample(加载例子),在Assets文件夹下新建一个Resources的文件夹(注:文件夹的名字必须 叫“Resources”,因为Unity是从这个文件夹调用资源的)。新建一个Scripts用来保存编写的脚本,新建一个Scenes文件夹用于保存 场景文件,这样分类管理便于以后查找起来方便。2.接下来在Scripts新建一个C#脚本命名为TextLoad,双击脚本编辑代码。3.将编辑好的文件拖到场景的主相机上。4.点击Play按钮,音频文件就开始播放,点击Pause按钮,音频暂停,点击Play音频从暂停处开始播放,点击Stop按钮,音频停止,点击Play则从头开始播放。
贴吧热议榜
使用签名档&&
保存至快速回贴Unity3D中实现动态加载Resources目录外的资源 - 推酷
Unity3D中实现动态加载Resources目录外的资源
大家可能都知道在Unity3D中如何实现动态加载资源的方法,就是把资源放在Resources目录下,使用Resources.Load方法即可动态加载资源。但将资源放在Resources目录下有一个问题,那就是打包程序的时候会将Resources目录下的全部文件都加密压缩打进包内,这样如果我们想使用assetbundle方式打小包的话就不行了。之前一直在考虑这个问题,最近在翻看API文档的时候发现有个方法叫
,这个方法可以让你加载Assets目录下任何一个位置的资源,但只是在编辑器模式下。利用这个方法,我们可以在测试和发布时使用两种不同的策略来加载资源:在编辑器测试环境使用Resources.LoadAssetAtPath方法动态加载资源;在发布环境中使用assetbundle方式加载动态资源。
下面贴出代码片段:
  // 通过Resources.LoadAtPath方法动态加载Prefab
private void LoadPrefabByResources()
Object prefab = Resources.LoadAssetAtPath(&Assets/Prefabs/Cube.prefab&, typeof(GameObject));
GameObject cube = (GameObject)Instantiate(prefab);
cube.transform.parent =
同时我做了一个简单的Example,下载地址:
PS: 项目目录中的Tools文件夹内包含一个HFS.exe是在本地模拟http文件服务的小工具。利用它你可以将本地文件映射为http可以访问的文件。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
使用您的微博帐号登录,即刻尊享微博用户专属服务。
使用您的QQ帐号登录,即刻尊享QQ用户专属服务。
使用您的人人帐号登录,即刻尊享人人用户专属服务。
按住视频可进行拖动
把视频贴到Blog或BBS
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
收藏成功,可进入查看所有收藏列表
方式1:用手机看
用爱奇艺APP或微信扫一扫,在手机上继续观看:
unity 3d加载外部资源
方式2:一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:&&
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:&&
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
爸爸去哪儿2游戏 立即参与
unity 3d加载外部资源
播放量数据:
6,132人已订阅
你可能还想订阅他们:
{{#needAdBadge}} 广告{{/needAdBadge}}
&正在加载...
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
安装爱奇艺视频客户端,
马上开始为您下载本片
5秒后自动消失
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制Unity 3D加载外部资源
我的图书馆
Unity 3D加载外部资源
Unity 3D里有两种动态加载机制:
&&&& 一是Resources.Load;
&&&& 一是通过AssetBundle;
&&&& 其实两者本质上没有什么区别。Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时动态加载,可以指定路径和来源的。其实场景里所有静态的对象也有这么一个加载过程,只是Unity后台替你自动完成了。
1.&&&&AssetBundles是什么?
&&&& 在一些大型的网络游戏,或者加载比较多的一些场景时,如果要等待所有模型,贴图等各种资源文件加载完毕才能执行游戏,对用户将会是一个很头大的事情。所以就需要用到动态加载,即AssetBundles。比如玩家在进入游戏时先加载一些周围的场景文件,这样不仅可以提高速度还可以减少内存资源的消耗。&&&&&&&
&&&& AssetBundles是可以把unity3d中你所创建的文件或任何资源导出的一种文件格式,这些文件导出后使用的是一种特定的文件格式(.Unity3d),这些特定格式的文件能在需要的时候加载到场景中。而这些特定的文件格式可以是模型,贴图,声音文件甚至是场景文件,它们是先前就被设计好的文件,所以很容易就可以被下载到你所建立的游戏或场景中来
&&&& AssetBundles 可以是任意类型的文件只要是unity3d能识别的资源文件格式,识别主要是以文件扩展名为准,比如.prefab等等。当然如果你想包含自定义的二进制文件,需要命名这些文件为以".bytes"为后缀,Unity将会把这些文件导成TextAssets。
2.&&&&Creating AssetBundles 创建资源包
有三个类方法可以用来构建资源包:
BuildPipeline.BuildAssetBundle allows you to build AssetBundles of any type of asset.
&&& 可以构建任意类型资源的资源包。【创建一个压缩好的包含Assets下的所有资源文件.unity3d。可以包含是项目目录下的任意资源,而把所有的资源压缩成一个.unity3d的文件,这个文件包括所有的预置物体(prefabs),纹理贴图(textures),模型,动画。使用AssetBundle.mainAsset这个函数可以很方便的让你指定一个定义好的物体。被压缩的资源储存在pathName. Options,会自动的允许用户包含相关的或者需要用到的】BuildPipeline.BuildStreamedSceneAssetBundle is used when you want to include only scenes to be streamed and loaded as the data becomes available.
&&&& 用来当你希望只包括流场景,使数据加载变为可用。【建立一个或多个场景,这些场景所需要的所有资源将被压缩入资源包,即asset bundle里面。资源包中的场景文件可以在任何平台上建立,而且这些文件往往是以一个单一的unity3d文件格式被用来创建。使用WWW类可以下载场景文件。当场景文件被下载好可以使用WWW.LoadFromCacheOrDownload来加载下载好的场景文件。】BuildPipeline.BuildAssetBundleExplicitAssetNames is the same as BuildPipeline.BuildAssetBundle but has an extra parameter to specify a custom string identifier (name) for each object.
&&&& 和BuildPipeline.BuildAssetBundle类似,但是有额外的参数来指定每个物体的自定义的字符串(名字)。【建立一个自定义名字的资源包方法:创建一个包含所有资源的一个压缩好的unity3d文件。AssetBundle可以包括任何项目目录下的资源文件。在assetNames参数中提供一个与资源数目相同大小的字符串数组。在资源数组中存储的信息与资源文件名相同,可以传递AssetBundle.Load去加载一个指定的资源。使用BuildAssetBundle时,只需使用资源的路径名。压缩好的资源包文件将会被储存在pathName.
Options,允许用户自动包含与之相关的或者总是包含完整的资源去代替确切的参照物体。】
&&&&&&&&& 当使用上面的三个函数做完准备工作,我们现在就需要去下载这些资源然后加载它们。
3.&&&&Downloading AssetBundles 下载资源包
推荐使用方法用来下载资源。当下载完成你就可以重新得到该资源的相关属性,例如:
[csharp] function&Start&()&&{&&&&&&&var&www&=&WWW.LoadFromCacheOrDownload&("/myassetBundle.unity3d",&&&5);&&yield&&&if&(www.error&!=&null)&&{&&&&&&&Debug.Log&(www.error);&&&&&&&&&}&&&&&&var&myLoadedAssetBundle&=&www.assetB&&&&&&var&asset&=&myLoadedAssetBundle.mainA&&}&&
4.&&&Loading and unloading objects from an AssetBundle从资源包加载和卸载对象
&&&&&&& 下载完以后,等于把硬盘或者网络的一个文件读到内存一个区域,这时候只是个AssetBundle内存镜像数据块,还没有Assets的概念。就可以使用这三个不同的函数来加载物体了:
AssetBundle.Load会加载物体,使用该物体的名字作为识别的参数。名字可以在Unity3d中Project view看到。你可以自由选择去传递对象变量的类型来确认该加载对象是否是被指定的类型。AssetBundle.LoadAsync 与AssetBundle.Load 函数相类似,但是当资源加载时它不会阻碍主线程。如果同时要加载比较大的资源或者很多资源时,这个函数会比较有用,它可以避免程序的暂停,因为它会同步加载。AssetBundle.LoadAll 顾名思义这个函数是用来加载所有在你资源包中的对象。作为AssetBundle.Load这个函数,你可以随意用该对象的类型去过滤。
&&&&&&& 使用这个函数可以卸载加载好的资源,这个函数有一个布尔值的参数是用来告诉Unity是否要卸载所有的数据(包含加载的资源对象)或者只是已经下载过的被压缩好的资源数据。如果要在资源包中从你的应用程序要使用一些对象或者你想释放一些内存,可以传递false这个值来卸载已经压缩好了的文件从你的内存中(即.unity3d文件)。如果要完全卸载所有的资源数据,需要传递true这个值,这将会销毁所有的资源包器中加载的资源。
&&&&&&& AssetBundle.Unload(flase)是释放AssetBundle文件的内存镜像,不包含Load创建的Asset内存对象。
&&&&&&& AssetBundle.Unload(true)是释放那个AssetBundle文件内存镜像和并销毁所有用Load创建的Asset内存对象。
5.&Instantiating objects from AssetBundles 从资源包实例化物体
&&&&&& 下载了资源,也加载好了,那么就该在场景中使用函数去实例化它了。
&&&&&&& Instantiate一个Prefab,是一个对Assets进行Clone(复制)+引用结合的过程,GameObject transform 是Clone是新生成的。其他mesh / texture / material / shader 等,这其中些是纯引用的关系的,包括:Texture和TerrainData,还有引用和复制同时存在的,包括:Mesh/material/PhysicMaterial。引用的Asset对象不会被复制,只是一个简单的指针指向已经Load的Asset对象。
Unity里每个Script都是一个封闭的Class定义而已,并没有写调用代码,光Class的定义脚本是不会工作的。其实Unity引擎就是那个调用代码,Clone一个script asset等于new一个class实例,实例才会完成工作。把他挂到Unity主线程的调用链里去,Class实例里的OnUpdate OnStart等才会被执行。多个物体挂同一个脚本,其实就是在多个物体上挂了那个脚本类的多个实例而已,这样就好理解了。在new
class这个过程中,数据区是复制的,代码区是共享的,算是一种特殊的复制+引用关系。
&&&&&&& 当你Destroy一个实例时,只是释放那些Clone对象,并不会释放引用对象和Clone的数据源对象,Destroy并不知道是否还有别的object在引用那些对象。等到没有任何游戏场景物体在用这些Assets以后,这些assets就成了没有引用的游离数据块了,是UnusedAssets了,这时候就可以通过Resources.UnloadUnusedAssets来释放,Destroy不能完成这个任务,AssetBundle.Unload(false)也不行,AssetBundle.Unload(true)可以但不安全,除非你很清楚没有任何对象在用这些Assets了。
[csharp] string&url&=&"/mygame/assetbundles/assetbundle1.unity3d";&&IEnumerator&Start&()&{&&&&&&//&Start&a&download&of&the&given&URL&&&&&&//&开始从指定路径下载&&&&&&WWW&www&=&WWW.LoadFromCacheOrDownload&(url,&1);&&&&&&//&Wait&for&download&to&complete&&&&&&//&等待下载完成&&&&&&yield&return&&&&&&&//&Load&and&retrieve&the&AssetBundle&&&&&&//&加载并取回资源包&&&&&&AssetBundle&bundle&=&www.assetB&&&&&&//&Load&the&TextAsset&object&&&&&&//&加载文本资源对象&&&&&&GameObject&go&=&bundle.Load("myGameObject",&typeof(GameObject))&as&GameO&&&&&&//&Instantiate&the&GameObject&&&&&&//&实例化该对象&&&&&&Instantiate(go);&&}&&
&&&&&&& Unity不提供自动的一个可以取回所有被下载资源的列表。所以需要我们在脚本中要建立这些资源对象的信息和它们的路径以便我们去查找。
6.&Including scripts in AssetBundles 在资源包中包含脚本
&&&&&& 资源包可以作为TextAssets包含脚本但是不会实际执行代码。如果想要在资源包包含用来执行应用程序的代码,需要预先编译,然后使用Mono Reflection class来加载(注意:Reflection在iOS平台不可用)。可以在任何版本的C#IDE编辑器(如:Monodevelop, Visual Studio)或者使用mono/.net 文档编辑器。
[csharp] string&url&=&"/mygame/assetbundles/assetbundle1.unity3d";&&IEnumerator&Start&()&{&&&&&&//&Start&a&download&of&the&given&URL&&&&&&WWW&www&=&WWW.LoadFromCacheOrDownload&(url,&1);&&&&&&//&Wait&for&download&to&complete&&&&&&yield&return&&&&&&&//&Load&and&retrieve&the&AssetBundle&&&&&&AssetBundle&bundle&=&www.assetB&&&&&&//&Load&the&TextAsset&object&&&&&&TextAsset&txt&=&bundle.Load("myBinaryAsText",&typeof(TextAsset))&as&TextA&&&&&&//&Load&the&assembly&and&get&a&type&(class)&from&it&&&&&&var&assembly&=&System.Reflection.Assembly.Load(txt.bytes);&&&&&&var&type&=&assembly.GetType("MyClassDerivedFromMonoBehaviour");&&&&&&//&Instantiate&a&GameObject&and&add&a&component&with&the&loaded&class&&&&&&GameObject&go&=&new&GameObject();&&&&&&go.AddComponent(type);&&}&&
一个常见的错误:
&&&&&&&& 从某个AssetBundle里Load了一个prefab并克隆之:obj = Instantiate (AssetBundle1.Load('MyPrefab”);
&&&&&&&&& 这个prefab比如是个npc,然后你不需要他的时候你用了:Destroy(obj);你以为就释放干净了。其实这时候只是释放了Clone对象,通过Load加载的所有引用、非引用Assets对象全都静静静的躺在内存里。这种情况应该在Destroy以后用:AssetBundle1.Unload(true),彻底释放干净。如果这个AssetBundle1是要反复读取的
不方便Unload,那可以在Destroy以后用:Resources.UnloadUnusedAssets()把所有和这个npc有关的Asset都销毁。
&&&&&&&&& 当然如果这个NPC也是要频繁创建 销毁的那就应该让那些Assets呆在内存里以加速游戏体验。由此可以解释另一个之前有人提过的话题:为什么第一次Instantiate一个Prefab的时候都会卡一下,因为在你第一次Instantiate之前,相应的Asset对象还没有被创建,要加载系统内置的AssetBundle并创建Assets,第一次以后你虽然Destroy了,但Prefab的Assets对象都还在内存里,所以就很快了。
资源加载和释放例子:
从磁盘读取一个1.unity3d文件到内存并建立一个AssetBundle1对象
AssetBundle AssetBundle1 = AssetBundle.CreateFromFile("1.unity3d");
从AssetBundle1里读取并创建一个Texture Asset,把obj1的主贴图指向它
obj1.renderer.material.mainTexture = AssetBundle1.Load("wall") as T
把obj2的主贴图也指向同一个Texture Asset
obj2.renderer.material.mainTexture =obj1.renderer.material.mainT
Texture是引用对象,永远不会有自动复制的情况出现(除非你真需要,用代码自己实现copy),只会是创建和添加引用
AssetBundle1.Unload(true) 那obj1和obj2都变成黑的了,因为指向的Texture Asset没了
AssetBundle1.Unload(false) 那obj1和obj2不变,只是AssetBundle1的内存镜像释放了
Destroy(obj1),//obj1被释放,但并不会释放刚才Load的Texture
如果这时候:
Resources.UnloadUnusedAssets();
不会有任何内存释放 因为Texture asset还被obj2用着
Destroy(obj2)
obj2被释放,但也不会释放刚才Load的Texture
Resources.UnloadUnusedAssets();
这时候刚才load的Texture Asset释放了,因为没有任何引用了
最后CG.Collect();
强制立即释放内存。
如何加载一堆大图片轮流显示又不爆掉?
不考虑AssetBundle,直接用www读图片文件的话等于是直接创建了一个Texture Asset。
[csharp] TLlist&string&&fileL&&int&n=0;&&IEnumerator&OnClick()&&{&&WWW&image&=&new&www(fileList[n++]);&&yield&return&&&Texture&tex&=&obj.mainT&&obj.mainTexture&=&image.&&&&&n&=&(n&=fileList.Length-1)?0:n;&&Resources.UnloadAsset(tex);&&}&&
文档下载地址:&&
TA的最新馆藏

我要回帖

更多关于 unity 加载外部模型 的文章

 

随机推荐