Используйте WWW и UnityWebRequest в плагине окна редактора. - PullRequest
0 голосов
/ 13 ноября 2018

В Unity у меня есть собственное окно, и я пытаюсь загрузить изображение из Amazon S3 и отобразить его в этом окне. Тем не менее, моя функция, кажется, не выполняется. Если я добавлю Debug.Log в функцию, она никогда не будет зарегистрирована, однако, Debug.Log до вызова функции (LoadAvatarTexture) будет регистрироваться. Из того, что я понимаю, IEnumerator не работает в EditorWindow классе, но работает для MonoBehaviour класса. Что я могу сделать, чтобы окно редактора загрузило изображение?

public class MyEditorWindow : EditorWindow {

  Texture2D avatarTexture;

  [MenuItem("GameSmart/Player Manager", false, 0)]
  public static void ShowManager() {
    var window = EditorWindow.GetWindow(typeof(MyEditorWindow));
    window.titleContent = new GUIContent("Player Manager");
    window.minSize = new Vector2(400, 300);
  }

  void OnGUI() {
    var loadPlayer = GUILayout.Button("Load Player");
    if (loadPlayer) {
      Debug.Log("I log to the console just fine");
      LoadAvatarTexture("http://dev-avatars.gamesmart.com/default.png");
    }
    if (avatarTexture != null) {
      float aspect = (float)avatarTexture.width / (float)avatarTexture.height;
      Rect previewRect = GUILayoutUtility.GetAspectRect(aspect, GUILayout.Width(100), GUILayout.ExpandWidth(true));
      GUI.DrawTexture(previewRect, avatarTexture, ScaleMode.ScaleToFit, true, aspect);
    }
  }

  IEnumerator LoadAvatarTexture(string url) {
    Debug.Log("I do not log to the console");
    var www = new WWW(url);
    yield return www;
    avatarTexture = www.texture;
  }

}

1 Ответ

0 голосов
/ 13 ноября 2018

Однако моя функция, похоже, не выполняется.

Это потому, что LoadAvatarTexture является функцией сопрограммы. Вы не вызываете функцию сопрограммы как нормальную функцию. Вы запускаете его с помощью функции StartCoroutine. Например, StartCoroutine(LoadAvatarTexture()).

Даже запуск с StartCoroutine не будет работать в вашем конкретном случае, потому что это плагин редактора, а StartCoroutine требует для работы экземпляр MonoBehaviour. Вы получаете доступ к StartCoroutine только тогда, когда ваш скрипт происходит от MonoBehaviour, но это не так.

У вас есть два варианта:

1 . Продолжайте иметь функцию LoadAvatarTexture в качестве функции сопрограммы, которой она является в настоящее время, но получите экземпляр MonoBehaviour с камеры или любого объекта в сцене. Я предпочитаю основную камеру, так как она вряд ли будет отключена.

Заменить

LoadAvatarTexture("http://dev-avatars.gamesmart.com/default.png");

с

//Get camera's MonoBehaviour
MonoBehaviour camMono = Camera.main.GetComponent<MonoBehaviour>();
//Use it to start your coroutine function
camMono.StartCoroutine(LoadAvatarTexture("http://dev-avatars.gamesmart.com/default.png"));

Обратите внимание, что вы должны проверить на наличие ошибок перед использованием запроса. Ниже ваша новая функция LoadAvatarTexture изменена для проверки на наличие ошибок:

IEnumerator LoadAvatarTexture(string url)
{
    Debug.Log("I do not log to the console");
    var www = new WWW(url);
    yield return www;
    if (string.IsNullOrEmpty(www.error))
        avatarTexture = www.texture;
    else
        Debug.Log(www.error);
}

2 . Другой вариант - сделать функцию LoadAvatarTexture обычной (void) функцией вместо функции сопрограммы, а затем использовать WWW.isDone, чтобы определить, когда запрос будет выполнен.

void OnGUI()
{
    var loadPlayer = GUILayout.Button("Load Player");
    if (loadPlayer)
    {
        Debug.Log("I log to the console just fine");
        LoadAvatarTexture("http://dev-avatars.gamesmart.com/default.png");
    }

    //Check if request is done then get the texture
    if (www != null && www.isDone)
    {
        if (string.IsNullOrEmpty(www.error))
            avatarTexture = www.texture;
        else
            Debug.Log(www.error);

        //Reset
        www = null;
    }

    if (avatarTexture != null)
    {
        float aspect = (float)avatarTexture.width / (float)avatarTexture.height;
        Rect previewRect = GUILayoutUtility.GetAspectRect(aspect, GUILayout.Width(100), GUILayout.ExpandWidth(true));
        GUI.DrawTexture(previewRect, avatarTexture, ScaleMode.ScaleToFit, true, aspect);
    }
}

WWW www;
void LoadAvatarTexture(string url)
{
    Debug.Log("I do not log to the console");
    www = new WWW(url);
    if (string.IsNullOrEmpty(www.error))
        avatarTexture = www.texture;
    else
        Debug.Log(www.error);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...