我有一个IEnumerator函数,可以从服务器上下载图像,在未附加到预制件的脚本上可以使用,但是可以,但是在附加到预制件的脚本上,可以使用。
由于无法正常工作,我想说www.SendWebRequest()永远不会返回,我已经等待了将近10分钟,并且它没有返回,图像大约有200kb,所以问题不在于图像大小。 / p>
我已经检查了url是否正确,试图更改图像,试图重新编写函数,但是没有任何效果,这是我的函数:
public void Set(string NomeIcone, string NomeAnalise, string idzinho, string descricaozinha, string NomeCapa)
{
Name.text = NomeAnalise;
ID = idzinho;
Descricao = descricaozinha;
Capa = NomeCapa;
StartCoroutine(LoadLogo(NomeIcone));
}
public IEnumerator LoadLogo(string nomeArquivo)
{
string url = PathIcone + nomeArquivo;
print(url);
using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(url))
{
yield return www.SendWebRequest();
if (www.error == null)
{
Texture2D tex = new Texture2D(1, 1);
tex = DownloadHandlerTexture.GetContent(www);
Icon.texture = tex;
RawImage Foto = Icon.GetComponentInChildren<RawImage>();
Foto.SetNativeSize();
float altura = 100 * Foto.rectTransform.rect.height / Foto.rectTransform.rect.width;
Foto.rectTransform.sizeDelta = new Vector2(100, altura);
}
}
}
My prefab setup in the inspector
如您所见,我的“ IconeSimbolo”是预制脚本中附加了该脚本的RawImage
我希望将“ IconeSimbolo”纹理更改为服务器上的图像,但是它永远不会更改。
我在检查器上具有相同设置的另一个脚本中具有相同的代码,在另一个预制件上,一切正常,但在此脚本中却没有
答案 0 :(得分:1)
这很简单:Update
方法不会在资产上执行,而只会在{strong>处于活动状态并已在场景层次结构中启用的GameObject
/ MonoBehaviour
上执行 >
→预制电话无法接到Update
个电话。
在Unity中启动的Coroutines与MoveNext
调用一起执行(Update
)(或者最好在之后说-请参见Order of Execution for Event Functions )
→因此,您的IEnumerator
开始了,实际上应该发送并返回请求... 但是您从不对其调用MoveNext
,因此它永远不会意识到请求已经完成
您正在某个地方调用方法Set
。因此,作为一种解决方法,您可以让一些GameObject
/ MonoBehaviour
为您执行IEnumerator
,例如
public void Set(string NomeIcone, string NomeAnalise, string idzinho, string descricaozinha, string NomeCapa, MonoBehaviour responsibleBehaviour)
{
Name.text = NomeAnalise;
ID = idzinho;
Descricao = descricaozinha;
Capa = NomeCapa;
// This now starts the coroutine instead on the passed
// responsibleBehaviour and uses that ones Update calls in order to
// move on with the IEnumerator
responsibleBehaviour.StartCoroutine(LoadLogo(NomeIcone));
}
,然后在调用脚本中只需在参数的末尾添加this
(当然,假设调用脚本为MonoBehaviour
)
prefab.Set(someNomeIcone, someNomeAnalise, someIdzinho, someDescricaozinha, someNomeCapa, this);
或者,因为您已经制作了LoadLogo
public
,所以您也可以直接使用另一个IEnumerator
来执行它,例如:
public IEnumerator LoadLogo(string NomeIcone, string NomeAnalise, string idzinho, string descricaozinha, string NomeCapa)
{
Name.text = NomeAnalise;
ID = idzinho;
Descricao = descricaozinha;
Capa = NomeCapa;
string url = PathIcone + NomeIcone;
print(url);
using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(url))
{
yield return www.SendWebRequest();
if (www.error == null)
{
Texture2D tex = new Texture2D(1, 1);
tex = DownloadHandlerTexture.GetContent(www);
Icon.texture = tex;
RawImage Foto = Icon.GetComponentInChildren<RawImage>();
Foto.SetNativeSize();
float altura = 100 * Foto.rectTransform.rect.height / Foto.rectTransform.rect.width;
Foto.rectTransform.sizeDelta = new Vector2(100, altura);
}
}
}
,然后在场景中的GameObject
上运行它,例如喜欢
public class SomeBehaviourInScene : MonoBehaviour
{
// reference the Prefab here
public YourPrefabScript prefab;
// wherever you want to call this
public void LoadPrefabLogo()
{
StartCoroutine(LoadPrefabLogoRoutine());
}
// If you want this to be called automatically
// on app start this could also be a
//private IEnumerator Start()
private IEnumerator LoadPrefabLogoRoutine()
{
// this also executes the LoadLogo and at
// the same time waits until it is finished
yield return prefab.LoadLogo(/* Your parameters here */);
Debug.Log("Finished");
}
}
或者如果这是关于EditorScript的,则可以注册EditorApplication.update
以便在MoveNext
上调用IEnumerator
。
一般性旁注:为方便起见和合作的原因(例如,参见此处),您应该习惯于在所有方法,变量以及注释中使用英文名称。