Unity3d 通过协程来实现文件的全部加载后执行
相信大家会经常遇到在游戏中需要WWW从本地或者服务器上获取数据,而我们通常容易会犯下面这种个错误:当数据较少或者网速较好时程序运行正常。而当数据较大或者网速不好时程序会出错误。比如卡住。
所以我们要使数据完全读完后再进行数据操作。本宝宝曾经在网上找到了貌似可以的代码:
//检测文件是否存在
if (!File.Exists(appDBPath))
{
//如果文件不存在 拷贝数据库
StartCoroutine(CopyDataBase());
} private bool boo = true;
/// <summary>
/// 拷贝数据库
/// </summary>
IEnumerator CopyDataBase()
{
#if UNITY_STANDALONE_WIN || UNITY_EDITOR
//WWW 可以从本地或者服务器上获取数据
WWW loadDB = new WWW(Application.streamingAssetsPath + "/ARPG.db");
#elif UNITY_IPHONE
WWW loadDB = new WWW(Application.dataPath + "/Raw/" + "/ARPG.db");
#elif UNITY_ANDROID
WWW loadDB = new WWW("jar:file://" + Application.dataPath + "!/assets" + "/ARPG.db");
#endif
//返回loadDB
yield return loadDB;
//进行循环判断 假如boo为真 执行
while (boo)
{
//判断是否加载完毕 如果没完进入
if (loadDB.isDone)
{
//写入
File.WriteAllBytes(appDBPath, loadDB.bytes);
boo = false;
}
}
}
然而宝宝试过后发现并没有什么卵用 代码看起来很有逻辑 但是仔细想想,当在你开启协程后(5),代码会继续向下做,不管你协程里写的天花乱坠,然而和后面的代码毫无关系。
其实不用这么麻烦,双协程可以很好的解决这个问题:
IEnumerator Start()
{
appDBPath = Application.streamingAssetsPath + "/ARPG.db";//地址
StartCoroutine(CopyDataBase());
yield return null;
} /// <summary>
/// 拷贝数据库
/// </summary>
public IEnumerator CopyDataBase()
{
#if UNITY_STANDALONE_WIN || UNITY_EDITOR
//WWW 可以从本地或者服务器上获取数据
WWW loadDB = new WWW(Application.streamingAssetsPath + "/ARPG.db");
#elif UNITY_IPHONE
WWW loadDB = new WWW(Application.dataPath + "/Raw/" + "/ARPG.db");
#elif UNITY_ANDROID
WWW loadDB = new WWW("jar:file://" + Application.dataPath + "!/assets" + "/ARPG.db");
#endif
//判断是否完成
while (loadDB.isDone)
{
yield return loadDB;
File.WriteAllBytes(appDBPath, loadDB.bytes);
}
}
是不是很简单啊 双协程中只有第二个协程结束后 第一个协程才会继续向下(个人理解 如果那里有错,请前辈们指正哦!)
Unity3d 通过协程来实现文件的全部加载后执行的更多相关文章
- UNITY所谓的异步加载几乎全部是协程,不是线程;MAP3加载时解压非常慢
实践证明,以下东西都是协程,并非线程(thread): 1,WWW 2,AssetBundle.LoadFromFileAsync 3,LoadSceneAsync 其它未经测试 此问题的提出是由于一 ...
- IDEA -01 -忽略指定文件夹 -防止加载Vue-cli执行"npm install"命令后的项目时卡死
问题描述 Vue的"npm install" 命令执行后,会生成一个很大的目录层次的"node_modules",文件十分繁多; idea加载这个项目下的文件夹 ...
- Unity3d之协程自实现测试
using UnityEngine; using System.Collections; public class TestStartCoroutine : MonoBehaviour { IEnum ...
- 使用getScript()方法异步加载并执行js文件
使用getScript()方法异步加载并执行js文件 使用getScript()方法异步请求并执行服务器中的JavaScript格式的文件,它的调用格式如下所示: jQuery.getScript(u ...
- 如何使用 require.js ,实现js文件的异步加载,避免网页失去响应,管理模块之间的依赖性,便于代码的编写和维护。
一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载.下面的网页代 ...
- Javascript 文件的同步加载与异步加载
HTML 4.01 的script属性 charset: 可选.指定src引入代码的字符集,大多数浏览器忽略该值.defer: boolean, 可选.延迟脚本执行,相当于将script标签放入页面b ...
- profile文件的错误加载与基本命令间的映射
一.绪论 [因为这篇心得是原创的,所以如果有哪处总结或者意见不足的地方,欢迎各位大神的批评和意见,共同学习,谢谢了!] 早些时候,需要在centos6.4系统中配置单机版和集群版单节点的hadoop ...
- vue第七单元(vue的单文件组件形式-单文件组件的加载原理-vue-cli构建的开发环境以及生命周期)
第七单元(vue的单文件组件形式-单文件组件的加载原理-vue-cli构建的开发环境以及生命周期) #课程目标 掌握安装 vue-cli 命令行工具的方法,掌握使用命令行在本地搭建开发环境,使用命令行 ...
- 本地修改配置hosts文件解决Github加载慢问题
本地修改配置hosts文件解决Github加载慢问题 手动方式 hosts 文件在每个系统的位置不一,详情如下: Windows 系统:C:\Windows\System32\drivers\etc\ ...
随机推荐
- 用Ultraiso刻录U盘装系统
一.准备工作: 1.一个U盘,也可以是手机或数码相机内存卡通过读卡器与电脑连接: 2.一个系统ISO镜像: 3.刻录软件UltraISO,用单文件绿色版就可以了. 二.开始刻录U盘: 1.启动Ultr ...
- (13)[Xamarin.Android] 不同分辨率下的图片使用概论
原文 [Xamarin.Android] 不同分辨率下的图片使用概论 设计Android App的时候,其尺寸众多也是一个挑战之一.要针对不同尺寸设计Android App时,就要先来了一下dpi(d ...
- 字符编码和python使用encode,decode转换utf-8, gbk, gb2312
ASCII码 标准ASCII码使用7位二进制数表示大写或小写字母,数字0到9标点符号以及在美式英语中使用的特殊控制字符. 在标准ASCII码中,最高位(b7)用作奇偶校验位,所谓奇偶校验,是指在代码传 ...
- OA项目之打印
打印 若此页有一个打印按钮: <input type="button" id="btnPrint" class="button_sm7" ...
- Python操作Access数据库
我们在这篇文章中公分了五个步骤详细分析了Python操作Access数据库的相关方法,希望可以给又需要的朋友们带来一些帮助. AD: Python编 程语言的出现,带给开发人员非常大的好处.我们可以利 ...
- android入门——UI(5)
最近时间实在匆忙,博客的代码基本没有解释. 介绍ExpandableListView <?xml version="1.0" encoding="utf-8&quo ...
- [非技术参考]C# Socket网络编程
我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: 1. TCP/IP层次模型 当然这里我们只讨论重要的四层 01,应用层(Application):应用层是个很广泛的概念,有一 ...
- 理解ROS的参数
记住每次操作之前都要在一个单独的终端中运行ros的核心. roscore rosparam命令允许你在ROS的参数服务器上操作和存储数据,参数服务器可以存储整数,浮点数,布尔类型,字典,列表.ROS使 ...
- C++学习之运算符重载的总结
C++学习之运算符重载的总结 运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生,C++为运算符重载提供了一种方法,即运算符重载函数 ...
- PHPEXCEL导入小技巧
在导入excel的时候,单元格格式和公式经常让导入不顺畅.注意phpexcel文档说明,基本上就可以很顺利的导入. 1.忽略单元格格格式,并导入xls.xlsx两种格式 $objReader = PH ...