2016-11-30 3 views
0
public class ImageLoader : MonoBehaviour { 
private Texture2D _texInMemory; 
public Texture2D GetImage(string fileName) 
{ 
    StartCoroutine(LoadImage(fileName)); 
    return _texInMemory; 
} 

IEnumerator LoadImage(string fileName) 
{ 
    var path = somestring; 
    WWW uri = new WWW(path); 
    yield return uri; 

    _texInMemory = uri.texture;`enter code here` 
} 
} 

Мой вопрос: какую строку мне нужно добавить в методе GetImage/ImageLoader, чтобы другой скрипт мог получить _texInMemory из метода GetImage?Загрузить потоковое вещание из метода non coroutine?

ответ

1

Добавьте дополнительные методы и булевскую переменную. Булева переменная будет установлена ​​после завершения выполнения команды coroutine.

Затем вы проверяете, истинна ли логическая переменная перед ее загрузкой.

public class ImageLoader : MonoBehaviour 
{ 
    bool imageDone = false; 
    private Texture2D _texInMemory = null; 

    public Texture2D getImage() 
    { 
     return _texInMemory; 
    } 

    public bool imageReady() 
    { 
     return imageDone; 
    } 

    public void retrieveImage(string fileName) 
    { 
     if (!imageDone) 
     { 
      Debug.Log("Error: Image is still retrieving"); 
      return; 
     } 

     imageDone = false; 
     StartCoroutine(loadImage(fileName)); 
    } 

    private IEnumerator loadImage(string fileName) 
    { 
     var path = somestring; 
     WWW uri = new WWW(path); 
     yield return uri; 
     _texInMemory = uri.texture; 

     imageDone = true; 
    } 
} 

Использование:

От нормальной функции:

void Update() 
{ 
    GameObject obj = new GameObject("obj"); 
    ImageLoader imgLd = obj.AddComponent<ImageLoader>(); 

    //then 
    imgLd.retrieveImage("Your Image"); 

    //Check if image has finished loading 
    if (imgLd.imageReady()) 
    { 
     //Retrieve image 
     Texture2D loadedImg = imgLd.getImage(); 
    } 
} 

Обратите внимание, что

GameObject obj = new GameObject("obj"); 
ImageLoader imgLd = obj.AddComponent<ImageLoader>(); 
imgLd.loadImage("Your Image"); 

следует называть только только в функции «Обновить». Вы можете продолжать звонить остальную часть кода до тех пор, пока imgLd.imageReady() не вернет true.

Или из функции сопрограммное:

IEnumerator test() 
{ 
    GameObject obj = new GameObject("obj"); 
    ImageLoader imgLd = obj.AddComponent<ImageLoader>(); 

    //then 
    imgLd.retrieveImage("Your Image"); 

    //Wait unitl image is loaded 
    while (imgLd.imageReady()) 
    { 
     yield return null; 
    } 

    //Retrieve image 
    Texture2D loadedImg = imgLd.getImage(); 
} 
Смежные вопросы