【发布时间】:2019-02-01 02:50:44
【问题描述】:
好的,我会尽力解释这一点。我整天都在寻找解决这个问题的方法,但似乎找不到。我遇到的问题是我有一个可编写脚本的对象列表,我基本上将其用于自定义属性来创建游戏对象。我需要获得的其中一个属性是我变成精灵的 Texture2D。因此,我在协程中使用 UnityWebRequest 并且必须产生响应。得到响应后,我正在尝试设置变量。然而,即使使用 Lambda 在我看来,如果我在结果之前返回响应,它不会设置变量。因此,每次我在协程之后检查变量时,它都会返回 null。如果有人能告诉我我在这里缺少的东西,那就太好了!
这是我正在使用的 Scriptable Object Class。
[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;
}
这是对协程的调用
foreach (var item in nodes)
{
templates.Add(GetMovieData(item));
}
foreach (MovieTemplate movie in templates)
{
StartCoroutine(GetMovieImage(movie.ImgURL, result =>
{
movie.thumbnail = result;
}));
}
这是协程本身
IEnumerator GetMovieImage(string url, System.Action<Sprite> result)
{
using (UnityWebRequest web = UnityWebRequestTexture.GetTexture(url))
{
yield return web.SendWebRequest();
var img = DownloadHandlerTexture.GetContent(web);
result(Sprite.Create(img, new Rect(0, 0, img.width, img.height), Vector2.zero));
}
}
【问题讨论】:
-
你在没有
using的情况下尝试过吗.. 我可能完全错了,但它也可能处理本地创建的变量img和创建的精灵 -
@derHugo 是的,我没有使用 using 语句尝试过,但没有成功。我确实在没有 webrequest 的情况下进行了另一项测试,其中产量低于我设置变量的位置,并且在使用 lambdas 时效果很好。但我认为收益回报 webrequest 是让我感兴趣的。
-
所以只要协程在运行,你就有正确的精灵?好吧,webrequest 是必不可少的,我猜想获取图像;)而产量是你使用它的方式,所以我不会为了调试而改变它;)我仍然认为
Texture本身可能以某种方式被处置,因此你的精灵没有纹理了吗? -
您是否尝试过返回纹理并在回调中创建本地 Sprite?
-
@derHugo 是的,我尝试只返回 Texture2D,然后在本地创建精灵,但是一旦离开协程,它就会变为 null。
标签: variables unity3d coroutine yield-return