相信大家会经常遇到在游戏中需要WWW从本地或者服务器上获取数据,而我们通常容易会犯下面这种个错误:当数据较少或者网速较好时程序运行正常。而当数据较大或者网速不好时程序会出错误。比如卡住。
所以我们要使数据完全读完后再进行数据操作。本宝宝曾经在网上找到了貌似可以的代码:
1 //检测文件是否存在 2 if (!File.Exists(appDBPath)) 3 { 4 //如果文件不存在 拷贝数据库 5 StartCoroutine(CopyDataBase()); 6 } 7 8 9 private bool boo = true; 10 /// <summary> 11 /// 拷贝数据库 12 /// </summary> 13 IEnumerator CopyDataBase() 14 { 15 #if UNITY_STANDALONE_WIN || UNITY_EDITOR 16 //WWW 可以从本地或者服务器上获取数据 17 WWW loadDB = new WWW(Application.streamingAssetsPath + "/ARPG.db"); 18 #elif UNITY_IPHONE 19 WWW loadDB = new WWW(Application.dataPath + "/Raw/" + "/ARPG.db"); 20 #elif UNITY_ANDROID 21 WWW loadDB = new WWW("jar:file://" + Application.dataPath + "!/assets" + "/ARPG.db"); 22 #endif 23 //返回loadDB 24 yield return loadDB; 25 //进行循环判断 假如boo为真 执行 26 while (boo) 27 { 28 //判断是否加载完毕 如果没完进入 29 if (loadDB.isDone) 30 { 31 //写入 32 File.WriteAllBytes(appDBPath, loadDB.bytes); 33 boo = false; 34 } 35 } 36 }
然而宝宝试过后发现并没有什么卵用 代码看起来很有逻辑 但是仔细想想,当在你开启协程后(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); } }
是不是很简单啊 双协程中只有第二个协程结束后 第一个协程才会继续向下(个人理解 如果那里有错,请前辈们指正哦!)