Однако моя функция, похоже, не выполняется.
Это потому, что 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);
}