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);
        }
    }        

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

 

转载于:https://www.cnblogs.com/redUnity/p/5149884.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值