游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

问答求助

关注:547

当前位置:游戏蛮牛 技术专区 问答求助

_____________________________________________________________________________________________________________
问答求助版块规则:

  1、问题尽量描述清楚
      2、代码要放在代码块里
      3、附件最好放到云盘,然后把链接放到TXT文档里,上传TXT文档。【最好没有附件,你懂得】
      4、本版块回复不得无意义,如:顶、呵呵、不错......以及擦边!【真的会扣分的哦】严重者,封IP!
      5、问题得到解决,请选择最佳答案。
      6、若问题是你自己解决了,可以联系管理员,返还蛮牛币,写下你的答案,另有蛮牛币奖赏。
_____________________________________________________________________________________________________________
查看: 225|回复: 12

[脚本] 协成里面用循环下载图片,停不下来了

[复制链接]  [移动端链接]
5熟悉之中
545/1000
排名
5318
昨日变化
1

6

主题

67

帖子

545

积分

Rank: 5Rank: 5

UID
23911
好友
0
蛮牛币
499
威望
0
注册时间
2014-5-5
在线时间
228 小时
最后登录
2018-8-14
QQ
发表于 2018-6-13 19:31:14 | 显示全部楼层 |阅读模式
30蛮牛币
本帖最后由 小蓝兔 于 2018-6-14 15:47 编辑

点击一个按钮,运行下面的方法,下载图片

2.png 1.png
因为图片数量很多,所以展示完需要很长时间,中途更换另一组图片时
之前的加载没办法停下来 QQ截图20180614120933.png
会扰乱后面图片的展示,貌似是因为需要等待5秒造成的,不太会使用协成,很懵,有大神能提点下么





回复

使用道具 举报

排名
919
昨日变化
1

16

主题

1104

帖子

3031

积分

Rank: 9Rank: 9Rank: 9

UID
68430
好友
12
蛮牛币
10818
威望
0
注册时间
2015-1-14
在线时间
807 小时
最后登录
2018-8-17
发表于 2018-6-13 19:31:15 | 显示全部楼层
帮你测试了一下你看看,我这里能正常停止~~~没问题得,你作一下比较我只是没写实例化哦,我得建议是另外的逻辑去实例化以下我是保存在一个 集合 Dic  内了

另外 ShowImage 我觉得没必要 写成 携程形式,我这边测试图片少,没办法测中途替换停止路径,所以也按照你的代码,写成携程了,
我建议使用上面 void  ShowImage0() 这个来写


[C#] 纯文本查看 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;


public class TestScript : MonoBehaviour
{

    string url ;

    Dictionary<string, Texture2D> textureDic = new Dictionary<string, Texture2D>();

    int index = 0;

    void Start()
    {
    }

    void Update()
    {

    }

    private void OnGUI()
    {
        if(GUI.Button(  new Rect (0,0,100,50), "Img"))
        {
            textureDic.Clear();
            index = 0;
            url = Application.dataPath + "/Resources/Img/";
            StopAllCoroutines();
            //ShowImage();
            StartCoroutine("ShowImage");
        }

        if (GUI.Button(new Rect(0, 50, 100, 50), "Img2"))
        {
            textureDic.Clear();
            index = 0;

            url = Application.dataPath + "/Resources/Img2/";
            StopAllCoroutines();
            //ShowImage();
            StartCoroutine("ShowImage");
        }


        if (GUI.Button(new Rect(0, 100, 100, 50), "存了几个"))
        {
            Debug.LogError("几个?" + textureDic.Count);
        }

        if (GUI.Button(new Rect(0, 150, 100, 50), "停止"))
        {
            StopAllCoroutines();
        }

    }

    public void  ShowImage0()
    {
        DirectoryInfo folder = new DirectoryInfo(url);
        FileSystemInfo[] fileinfo = folder.GetFileSystemInfos();

        for (int i = 0; i < fileinfo.Length; i++)
        {
            string urlf = fileinfo[i].FullName;
            if (urlf.EndsWith(".meta"))
                continue;
            urlf = "file:///" + urlf;
            StartCoroutine("LoadImage", urlf);
        }
    }

    public IEnumerator ShowImage()
    {

        DirectoryInfo folder = new DirectoryInfo(url);
        FileSystemInfo[] fileinfo = folder.GetFileSystemInfos();

        for (int i = 0; i < fileinfo.Length; i++)
        {
            string urlf = fileinfo[i].FullName;
            if (urlf.EndsWith(".meta"))
                continue;
            urlf = "file:///" + urlf;
            StartCoroutine("LoadImage", urlf);
            yield return new WaitForSeconds(5f);
        }
    }

    public IEnumerator  LoadImage( string urlf)
    {
        Debug.Log("LoadImage-------urlf= " + urlf + "   index = " + index);
        WWW www = new WWW(urlf);
        yield return www;
        if (string.IsNullOrEmpty(www.error))
        {
            Texture2D texture2D = www.texture;

            if (!textureDic.ContainsKey(urlf))
                textureDic.Add(urlf, texture2D);

        }
        else
        {
            Debug.LogError("加载出错 :url =" + urlf + "  错误:" + www.error);
        }

        index++;
    }





}
jdfw.gif 这是测试结果,正常切换路径,正常停止~



回复

使用道具 举报

4四处流浪
374/500
排名
8455
昨日变化

1

主题

140

帖子

374

积分

Rank: 4

UID
231366
好友
4
蛮牛币
689
威望
0
注册时间
2017-7-10
在线时间
103 小时
最后登录
2018-8-17
发表于 2018-6-14 09:40:17 | 显示全部楼层
没办法停下来是因为携程没关闭吧,中途更换的方法你没贴出来啊?

回复

使用道具 举报

5熟悉之中
540/1000
排名
6721
昨日变化
43

4

主题

158

帖子

540

积分

Rank: 5Rank: 5

UID
193233
好友
4
蛮牛币
1604
威望
0
注册时间
2016-12-17
在线时间
196 小时
最后登录
2018-8-18
发表于 2018-6-14 10:10:51 | 显示全部楼层
有循环记得停止携程

回复

使用道具 举报

排名
919
昨日变化
1

16

主题

1104

帖子

3031

积分

Rank: 9Rank: 9Rank: 9

UID
68430
好友
12
蛮牛币
10818
威望
0
注册时间
2015-1-14
在线时间
807 小时
最后登录
2018-8-17
发表于 2018-6-14 11:54:04 | 显示全部楼层
你停的是哪个?~~

很明显,你必须 showImage ,跟 LoadImage  都得停了的~~~

然后给你以一个建议~加载跟,实例化 分开就是 sprite.creat 这个部分~~这样你突然停止,或者切换加载队列,对于实例化时的影响是最少的~~
也就是,内存里有这个图片,就能瞬间实例化出来,没有返回null ,大不了看不见,不会卡进程~~~

回复

使用道具 举报

5熟悉之中
545/1000
排名
5318
昨日变化
1

6

主题

67

帖子

545

积分

Rank: 5Rank: 5

UID
23911
好友
0
蛮牛币
499
威望
0
注册时间
2014-5-5
在线时间
228 小时
最后登录
2018-8-14
QQ
 楼主| 发表于 2018-6-14 12:11:46 | 显示全部楼层
本帖最后由 小蓝兔 于 2018-6-14 12:16 编辑
绝世love情缘 发表于 2018-6-14 11:54
你停的是哪个?~~

很明显,你必须 showImage ,跟 LoadImage  都得停了的~~~

两个都停也没有用啊,可以在Hierarchy里看到,图片还是在不断生成。只有将图片所在的gameobject设置成SetActive(false),进程才会在一两秒之后停止,但是只要在这之间点击开始,之前的图片就有显示出来了

回复

使用道具 举报

5熟悉之中
545/1000
排名
5318
昨日变化
1

6

主题

67

帖子

545

积分

Rank: 5Rank: 5

UID
23911
好友
0
蛮牛币
499
威望
0
注册时间
2014-5-5
在线时间
228 小时
最后登录
2018-8-14
QQ
 楼主| 发表于 2018-6-14 13:26:18 | 显示全部楼层
本帖最后由 小蓝兔 于 2018-6-14 13:44 编辑

QQ截图20180614134328.png 好像跟等待时间有点关系,改成这样的话,设置的时间短了就正常,但是等待时间长了的话,还是会乱

回复

使用道具 举报

5熟悉之中
542/1000
排名
4458
昨日变化
1

0

主题

63

帖子

542

积分

Rank: 5Rank: 5

UID
229891
好友
0
蛮牛币
715
威望
0
注册时间
2017-7-2
在线时间
179 小时
最后登录
2018-8-17
发表于 2018-6-14 13:58:56 | 显示全部楼层
本帖最后由 fsjidong 于 2018-6-14 14:03 编辑

StopCoroutine()参数是字符串的话是无效的。要先声明Coroutine类的变量存放你StartCoroutine()方法的返回值,然后再用StopCoroutine()参数是你声明的Coroutine变量。例如:
Private Coroutine testCor;
void Start()
{
    testCor=StartCoroutine(Test());
    StopCoroutine(testCor);
}

IEnumerator Test()
{
   while(ture)
   {
      Debug.Log(1);
      yield return null;
   }
}

[发帖际遇]: 一个袋子砸在了 fsjidong 头上,fsjidong 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

排名
919
昨日变化
1

16

主题

1104

帖子

3031

积分

Rank: 9Rank: 9Rank: 9

UID
68430
好友
12
蛮牛币
10818
威望
0
注册时间
2015-1-14
在线时间
807 小时
最后登录
2018-8-17
发表于 2018-6-14 14:38:30 | 显示全部楼层
小蓝兔 发表于 2018-6-14 12:11
两个都停也没有用啊,可以在Hierarchy里看到,图片还是在不断生成。只有将图片所在的gameobject设置成SetA ...

注意停止 携程  StopCoroutine  一定要用 字符串的形式 的,否则无效

另外 StopCoroutine  是这样解释的,停止协同程序的执行并返回到主循环直到下一帧~~~这就是你 为什么 设置时间短点就能正常的原因~~

回复

使用道具 举报

5熟悉之中
545/1000
排名
5318
昨日变化
1

6

主题

67

帖子

545

积分

Rank: 5Rank: 5

UID
23911
好友
0
蛮牛币
499
威望
0
注册时间
2014-5-5
在线时间
228 小时
最后登录
2018-8-14
QQ
 楼主| 发表于 2018-6-14 15:07:58 | 显示全部楼层
fsjidong 发表于 2018-6-14 13:58
StopCoroutine()参数是字符串的话是无效的。要先声明Coroutine类的变量存放你StartCoroutine()方法的返回值 ...

好像不行 我的方法里有WaitForSeconds,如果关闭后很快打开,不等等待时间过完,写成被再次打开,就会两个同时在运行,嗯,应该是这样的吧

回复

使用道具 举报

5熟悉之中
545/1000
排名
5318
昨日变化
1

6

主题

67

帖子

545

积分

Rank: 5Rank: 5

UID
23911
好友
0
蛮牛币
499
威望
0
注册时间
2014-5-5
在线时间
228 小时
最后登录
2018-8-14
QQ
 楼主| 发表于 2018-6-14 15:10:47 | 显示全部楼层
绝世love情缘 发表于 2018-6-14 14:38
注意停止 携程  StopCoroutine  一定要用 字符串的形式 的,否则无效

另外 StopCoroutine  是这样解释的 ...

哪有什么办法么,间隔时间是必要的
[发帖际遇]: 一个袋子砸在了 小蓝兔 头上,小蓝兔 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

5熟悉之中
542/1000
排名
4458
昨日变化
1

0

主题

63

帖子

542

积分

Rank: 5Rank: 5

UID
229891
好友
0
蛮牛币
715
威望
0
注册时间
2017-7-2
在线时间
179 小时
最后登录
2018-8-17
发表于 2018-6-15 09:06:59 | 显示全部楼层
小蓝兔 发表于 2018-6-14 15:10
哪有什么办法么,间隔时间是必要的

协程跑完也会自动停的呀。如果要手动停就按照我的方法来处理。

回复

使用道具 举报

5熟悉之中
542/1000
排名
4458
昨日变化
1

0

主题

63

帖子

542

积分

Rank: 5Rank: 5

UID
229891
好友
0
蛮牛币
715
威望
0
注册时间
2017-7-2
在线时间
179 小时
最后登录
2018-8-17
发表于 2018-6-15 09:08:25 | 显示全部楼层
小蓝兔 发表于 2018-6-14 15:07
好像不行 我的方法里有WaitForSeconds,如果关闭后很快打开,不等等待时间过完,写成被再次打开,就会两个 ...

按照我的方法手动停协程,WaitForSeconds也会停止的。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表