Unity WWW网络动态加载和储存在本地
2015-01-06 12:14
211 查看
原文地址:http://www.unitymanual.com/thread-33321-1-1.html?_dsign=b3aeb908
游戏开发中需要从服务器上加载一下资源包,场景等,这时就需要使用unity的WWW加载类。最近研究WWW加载发现很多问题和报错,这里接写出来和大家共享一下。
关于加载:首先是检查本地文件里是否存在相同的资源包文件(检查和校验版本号),如果都是正确的就不需要从服务器端下载了直接从本地(手机就是SD卡里了)加载就可以了。
如果版本号不对那么就要下载最新版本的资源了,当然要把老版本的从本地删除,不然在手机里会很占储存空间的。
新建一个Resource类,作为加载工具类继承与MonoBehaviour。
新建方法,传入必要信息提供加载:
System.IO包里提供了一个File类,其Exists方法就是查询指定路径下是否有指定的文件存在。
[AppleScript] 纯文本查看 复制代码
?
在加载时需要启动一个协程,异步加载。如果加载成功则就写入本地和内存里方便调用,如果有新的版本则需要吧老版本的删除掉。
[AppleScript] 纯文本查看 复制代码
?
从本地加载就更简单了,直接把本地文件所在的路径传给WWW作为参数就可以了。
[AppleScript] 纯文本查看 复制代码
?
好了,Resource这个类就基本建立完成了。准备调用~
一般思路:
[AppleScript] 纯文本查看 复制代码
?
但是在运行时会报出异常:NullReferenceException UnityEngine.MonoBehaviour.StartCoroutine (IEnumerator routine)。
这是咋回事,原来我的Resource是继承与MonoBehaviour的。看看这个警告:
You are trying to create a MonoBehaviour using the 'new' keyword. This is not allowed. MonoBehaviours can only be added using AddComponent(). Alternatively,
your script can inherit from ScriptableObject or no base class at all
UnityEngine.MonoBehaviour:.ctor()
这就要注意了,这个Resource不能用new。是需要加在一个显示组件上通过AddComponent()方法来获取的。
so...正确做法如下:
在响应组件上添加Resource脚本,和UIResponse脚本。
在UIResponse上添加代码:
[AppleScript] 纯文本查看 复制代码
?
这样,随着游戏的初始化,加载工具类Resource就被初始化出来了,并且已经存放在Resource的instance变量里。以后就可以直接使用Resource.instance来调用加载了。
并且已有的加载都储存在cache里了,也可以先根据name到内存里去查找一遍再去加载。
最终加载出来的gameObject需要Instantiate实例化出来。
以后就可以直接使用Resource.instance来访问Resource里的个个加载方法了。
Resource的instance的get/set方法的写法如下:
[AppleScript] 纯文本查看 复制代码
?
看起来和单例的创建方法很类似,如果直接使用调用单例的方式来调用的话。执行到建立协程StartCoroutine时就会抛出空引用的异常,并出现不能创建新的MonoBehaviour实例的警告。
游戏开发中需要从服务器上加载一下资源包,场景等,这时就需要使用unity的WWW加载类。最近研究WWW加载发现很多问题和报错,这里接写出来和大家共享一下。
关于加载:首先是检查本地文件里是否存在相同的资源包文件(检查和校验版本号),如果都是正确的就不需要从服务器端下载了直接从本地(手机就是SD卡里了)加载就可以了。
如果版本号不对那么就要下载最新版本的资源了,当然要把老版本的从本地删除,不然在手机里会很占储存空间的。
新建一个Resource类,作为加载工具类继承与MonoBehaviour。
新建方法,传入必要信息提供加载:
System.IO包里提供了一个File类,其Exists方法就是查询指定路径下是否有指定的文件存在。
[AppleScript] 纯文本查看 复制代码
?
[AppleScript] 纯文本查看 复制代码
?
[AppleScript] 纯文本查看 复制代码
?
一般思路:
[AppleScript] 纯文本查看 复制代码
?
这是咋回事,原来我的Resource是继承与MonoBehaviour的。看看这个警告:
You are trying to create a MonoBehaviour using the 'new' keyword. This is not allowed. MonoBehaviours can only be added using AddComponent(). Alternatively,
your script can inherit from ScriptableObject or no base class at all
UnityEngine.MonoBehaviour:.ctor()
这就要注意了,这个Resource不能用new。是需要加在一个显示组件上通过AddComponent()方法来获取的。
so...正确做法如下:
在响应组件上添加Resource脚本,和UIResponse脚本。
在UIResponse上添加代码:
[AppleScript] 纯文本查看 复制代码
?
并且已有的加载都储存在cache里了,也可以先根据name到内存里去查找一遍再去加载。
最终加载出来的gameObject需要Instantiate实例化出来。
以后就可以直接使用Resource.instance来访问Resource里的个个加载方法了。
Resource的instance的get/set方法的写法如下:
[AppleScript] 纯文本查看 复制代码
?
相关文章推荐
- Unity的WWW网络动态加载和储存在本地
- Unity的WWW网络动态加载和储存在本地
- Unity的WWW网络动态加载和储存在本地
- Unity的WWW网络动态加载和储存在本地
- Unity--动态加载网络图片和本地图片文件
- Unity--动态加载网络图片和本地图片文件
- Unity实现 下载网络资源到本地 WWW加载
- Unity+NGUI打造网络图片异步加载与本地缓存工具类(一)
- Unity 截屏,WWW加载图片,保存到本地
- Unity+NGUI打造网络图片异步加载与本地缓存工具类(二)
- Unity+NGUI打造网络图片异步加载和本地缓存工具(一)
- Unity网络正常状态下优先加载网络图片,否则加载本地缓存图片
- unity中使用www加载本地资源
- unity动态加载资源并缓存到本地
- Unity+NGUI打造网络图片异步加载与本地缓存工具类
- unity基础开发--实现动态加载资源
- Android+Listview+分页+动态加载网络数据
- Android Listview异步动态加载网络图片
- 在Unity3D的网络游戏中实现资源动态加载
- Android中从本地未安装的APK动态加载类和资源