Из того, что вы описываете, все равно кажется, что текстура как-то удаляется, как только процедура заканчивается.Я предполагаю, что это происходит из-за блока using
.
Я бы сохранил исходную ссылку на текстуру
[CreateAssetMenu(fileName = "new movie",menuName = "movie")]
public class MovieTemplate : ScriptableObject
{
public string Title;
public string Description;
public string ImgURL;
public string mainURL;
public string secondaryURL;
public Sprite thumbnail;
public Texture texture;
public void SetSprite(Sprite newSprite, Texture newTexture)
{
if(texture) Destroy(texture);
texture = newTexture;
var tex = (Texture2D) texture;
thumbnail = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), Vector2.zero);
}
}
Так что вы также можете отслеживать саму текстуру,он не должен собираться ГК, но также уничтожать его, когда он больше не нужен.Обычно Texture2D
удаляется GC, как только на него больше нет ссылок, но Texture2D
, созданный UnityWebRequest
, может вести себя по-другому.
Чем в веб-запросе вернуть текстуру и не использоватьusing
IEnumerator GetMovieImage(string url, System.Action<Texture> result)
{
UnityWebRequest web = UnityWebRequestTexture.GetTexture(url));
yield return web.SendWebRequest();
if(!web.error)
{
result?.Invoke(DownloadHandlerTexture.GetContent(web));
}
else
{
Debug.LogErrorFormat(this, "Download error: {0} - {1}", web.responseCode, web.error);
}
}
и, наконец, используйте его как
for (int i = 0; i < templates.Count; i++)
{
int index = i;//If u use i, it will be overriden too so we make a copy of it
StartCoroutine(
GetMovieImage(
templates[index].ImgURL,
result =>
{
templates[index].SetSprite(result);
})
);
}