Вызовите метод IEnumerator из другого скрипта в Unity и получите его возвращаемое значение - PullRequest
0 голосов
/ 09 октября 2018

Я работаю над проектом в Unity.У меня есть этот файл:

API.cs (не привязан ни к одному GameObject)

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using LitJson;

public class API : MonoBehaviour
{

    public IEnumerator Login(string email, string psw)
    {
        string URL = "https://####.azurewebsites.net/api/login";
        WWWForm form = new WWWForm();
        form.AddField("email", email);
        form.AddField("password", psw);

        var download = UnityWebRequest.Post(URL, form);

        // Wait until the download is done
        yield return download.SendWebRequest();

        if (download.isNetworkError || download.isHttpError)
        {
            print("Error downloading: " + download.error);
        }
        else
        {
            JsonData data = JsonMapper.ToObject(download.downloadHandler.text);
            string token = (string)data["success"]["token"];
            Debug.Log(token);
        }
    }
}

caller.cs (прикреплен к GameObjectв текущей сцене)

    private void Start ()
    {
        // Something like this
        var token = API.Login("foo@boo.com", "####");
    }

Мой вопрос: Как я могу вызвать функцию "Логин" в caller.cs и получить значение токена?


То, что я пробовал и не работало:

  • Создайте переменную для скрипта public API test;, а затем test.Login("foo@boo.com", "####")
  • Makeкласс API статический, инициализировать класс в caller.cs, а затем вызвать метод Login (...)

EDIT 1:

Был в состоянии решить проблему вызова метода из другого скрипта, проблема заключалась в том, что мне пришлось создать объект и присоединить к нему API.cs.Затем мне также пришлось перетащить этот объект в открытое поле caller.cs в инспекторе.Более того, мне нужно было добавить в caller.cs метод Login внутри StartCoroutine ().

Тем не менее, сейчас нужно выяснить , как извлечь значение токена из метода Login ().

1 Ответ

0 голосов
/ 09 октября 2018

Удалось решить проблему вызова метода из другого скрипта, проблема заключалась в том, что мне пришлось создать объект и присоединить к нему API.cs.Затем мне также пришлось перетащить этот объект в открытое поле caller.cs в инспекторе.

Звучит неправильно, перетаскивая скрипт вручную в редакторе, поскольку ваша цельделать из скрипта.Сценарий API является MonoBehaviour, потому что он происходит от него.Используйте AddComponent, чтобы добавить класс API, затем вызовите StartCoroutine для функции входа в систему.

API api = gameObject.AddComponent<API>();
StartCoroutine(api.Login("foo@boo.com", "####"));

Удалите MonoBehaviour, чтобы вам не приходилось присоединять скрипт API к GameObject.вместо этого создайте new объекты с новым ключевым словом.

public class API 
{

    public IEnumerator Login(string email, string psw)
    {
        ....
    }
}

Нет, вы можете просто сделать:

API api = new API();
StartCoroutine(api.Login("foo@boo.com", "####"));

Наконец, чтобы вернуть значение, добавьте Action в качестве третьего параметра.

public class API
{

    public IEnumerator Login(string email, string psw, Action<string> token)
    {
        string URL = "https://####.azurewebsites.net/api/login";
        WWWForm form = new WWWForm();
        form.AddField("email", email);
        form.AddField("password", psw);

        var download = UnityWebRequest.Post(URL, form);

        // Wait until the download is done
        yield return download.SendWebRequest();

        if (download.isNetworkError || download.isHttpError)
        {
            Debug.Log("Error downloading: " + download.error);
        }
        else
        {
            JsonData data = JsonMapper.ToObject(download.downloadHandler.text);
            string tokenResult = (string)data["success"]["token"];
            Debug.Log(tokenResult);
            if (token != null)
                token(tokenResult);
        }
    }
}

Чтобы вызвать его из функции без сопрограмм:

API api = new API();
StartCoroutine(api.Login("foo@boo.com", "####", (token) =>
{
    Debug.Log("Token: " + token);
}
));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...