Unity3d 通过协程来实现文件的全部加载后执行

相信大家会经常遇到在游戏中需要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);
        }
    }        

是不是很简单啊 双协程中只有第二个协程结束后 第一个协程才会继续向下(个人理解 如果那里有错,请前辈们指正哦!)

 

posted @ 2016-01-21 23:01  1A7487  阅读(1394)  评论(0编辑  收藏  举报