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

扫一扫,访问微社区

问答求助

关注:531

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

_____________________________________________________________________________________________________________
问答求助版块规则:

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

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

[复制链接]  [移动端链接]
5熟悉之中
537/1000
排名
5220
昨日变化
7

6

主题

67

帖子

537

积分

Rank: 5Rank: 5

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

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

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





回复

使用道具 举报

3偶尔光临
197/300
排名
14635
昨日变化
286

0

主题

92

帖子

197

积分

Rank: 3Rank: 3Rank: 3

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

回复

使用道具 举报

4四处流浪
352/500
排名
10883
昨日变化
142

3

主题

136

帖子

352

积分

Rank: 4

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

回复

使用道具 举报

排名
1025
昨日变化
2

14

主题

1067

帖子

2864

积分

Rank: 9Rank: 9Rank: 9

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

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

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

回复

使用道具 举报

5熟悉之中
537/1000
排名
5220
昨日变化
7

6

主题

67

帖子

537

积分

Rank: 5Rank: 5

UID
23911
好友
0
蛮牛币
510
威望
0
注册时间
2014-5-5
在线时间
222 小时
最后登录
2018-6-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熟悉之中
537/1000
排名
5220
昨日变化
7

6

主题

67

帖子

537

积分

Rank: 5Rank: 5

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

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

回复

使用道具 举报

4四处流浪
400/500
排名
5692
昨日变化
34

0

主题

54

帖子

400

积分

Rank: 4

UID
229891
好友
0
蛮牛币
549
威望
0
注册时间
2017-7-2
在线时间
130 小时
最后登录
2018-6-21
发表于 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 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

排名
1025
昨日变化
2

14

主题

1067

帖子

2864

积分

Rank: 9Rank: 9Rank: 9

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

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

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

回复

使用道具 举报

5熟悉之中
537/1000
排名
5220
昨日变化
7

6

主题

67

帖子

537

积分

Rank: 5Rank: 5

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

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

回复

使用道具 举报

5熟悉之中
537/1000
排名
5220
昨日变化
7

6

主题

67

帖子

537

积分

Rank: 5Rank: 5

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

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

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

回复

使用道具 举报

4四处流浪
400/500
排名
5692
昨日变化
34

0

主题

54

帖子

400

积分

Rank: 4

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

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

回复

使用道具 举报

4四处流浪
400/500
排名
5692
昨日变化
34

0

主题

54

帖子

400

积分

Rank: 4

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

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

回复

使用道具 举报

排名
1025
昨日变化
2

14

主题

1067

帖子

2864

积分

Rank: 9Rank: 9Rank: 9

UID
68430
好友
10
蛮牛币
10198
威望
0
注册时间
2015-1-14
在线时间
771 小时
最后登录
2018-6-21
发表于 7 天前 | 显示全部楼层
帮你测试了一下你看看,我这里能正常停止~~~没问题得,你作一下比较我只是没写实例化哦,我得建议是另外的逻辑去实例化以下我是保存在一个 集合 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 这是测试结果,正常切换路径,正常停止~



回复

使用道具 举报

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

本版积分规则

关闭

站长推荐 上一条 /1 下一条

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