UnityWebRequest永远不会返回附着在预制件上的脚本

时间:2019-07-04 17:41:39

标签: unity3d unitywebrequest

我有一个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”纹理更改为服务器上的图像,但是它永远不会更改。

我在检查器上具有相同设置的另一个脚本中具有相同的代码,在另一个预制件上,一切正常,但在此脚本中却没有

1 个答案:

答案 0 :(得分:1)

这很简单:Update方法不会在资产上执行,而只会在{strong>处于活动状态并已在场景层次结构中启用的GameObject / MonoBehaviour上执行 >

→预制电话无法接到Update个电话。

在Unity中启动的CoroutinesMoveNext调用一起执行(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


一般性旁注:为方便起见和合作的原因(例如,参见此处),您应该习惯于在所有方法,变量以及注释中使用英文名称。