Добавьте дополнительные методы и булевскую переменную. Булева переменная будет установлена после завершения выполнения команды 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();
}