从coroutine返回精灵

时间:2017-12-14 03:21:30

标签: c# image unity3d ienumerator

我目前有2个功能。

我的第一个是LoadImage,我们称之为IEnumerator LoadImage() { WWW www = new WWW("https://s3-ap-northeast-1.amazonaws.com/myeyehouse/uimg/scimg/sc661120171130095837184/pano/thumb_Eyehouse.jpg"); while (!www.isDone) { Debug.Log("Download image on progress" + www.progress); yield return null; } if (!string.IsNullOrEmpty(www.error)) { Debug.Log("Download failed"); } else { Debug.Log("Download succes"); Texture2D texture = new Texture2D(1, 1); www.LoadImageIntoTexture(texture); Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero); return sprite; } } ,它处理从网址下载图片。

LoadImage()

我的第二个函数需要将GameObject的输出(这是一个精灵)分配给我的GameObject。我无法放入LoadImage()并将其加载到LoadImage()函数中。如果可能的话,我需要有关如何从command: - "sh" - "-c" - > nohup /bin/ecr-refresh-token & sleep 10 exit 0 函数分配精灵的建议。

1 个答案:

答案 0 :(得分:2)

您无法从协程返回值。所以你需要使用委托。 我会返回纹理并保留Sprite创建。

IEnumerator LoadImage(Action<Texture2D> callback)
{
    WWW www = new WWW("https://s3-ap-northeast-1.amazonaws.com/myeyehouse/uimg/scimg/sc661120171130095837184/pano/thumb_Eyehouse.jpg");
    while (!www.isDone)
    {
        Debug.Log("Download image on progress" + www.progress);
        yield return null;
    }

    if (!string.IsNullOrEmpty(www.error))
    {
        Debug.Log("Download failed");
        callback(null);
    }
    else
    {
        Debug.Log("Download succes");
        Texture2D texture = new Texture2D(1, 1);
        www.LoadImageIntoTexture(texture);
        callback(texture;)
    }
}

然后你打电话:

void Start()
{
    StartCoroutine(LoadImage(CreateSpriteFromTexture));
}
private CreateSpriteFromTexture(Texture2D texture)
{
        if(texture == null) { return;}
        Sprite sprite = Sprite.Create(texture,
            new Rect(0, 0, texture.width, texture.height), Vector2.zero);
        // Assign sprite to image
}

整个挑战是了解委托和行动的运作方式。