Я пытаюсь создать объект из моей БД, который использует другой класс. Но, кажется, есть проблема из-за задержки ответа от IEnumerator (может быть?).
У нас есть очень простой вражеский класс для парсинга json:
[System.Serializable]
public class Enemy{
public string EnemyID;
public string Name;
}
BattleManager прикреплен к объекту в сцене
public class BattleManager : Monobehaviour{
public Enemy debugEnemy;
void start()
{
//get a reference to the DBAccess
DBA = GameObject.Find("ManagerDB").GetComponent<DBAccess>();
debugEnemy = DBA.GetEnemy(1);
//debugEnemy EnemyID=0 and Name=""
//This is where the Problem is! Why is this not set from my DB?
}
}
Теперь вот где я получаю информацию из базы данных. Кажется, все идет правильно, за исключением того, что GetEnemy возвращает объект Enemy по умолчанию вместо объекта с его переменными, загруженными из json в IEnumerator GetEnemyFromDB.
public class DBAccess: Monobehaviour{
private Enemy enemy;
public Enemy GetEnemy(int EnemyID)
{
enemy = new Enemy();
StartCoroutine(GetEnemyFromDB(EnemyID));
//HERE enemy.EnemyID is 0 and enemy.Name is ""
return enemy;
}
private IEnumerator GetEnemyFromDB(int EnemyID)
{
WWWForm postData = new WWWForm();
postData.AddField("EnemyID", EnemyID);
WWW dbProc = new WWW(GetEnemyURL, postData);
yield return dbProc;
if (string.IsNullOrEmpty(dbProc.error)) //error is null or empty so: SUCCESS!
{
string jsonstring = "{\"Items\":" + dbProc.text + "}";
Enemy[] EnemiesFromDB;
EnemiesFromDB = JsonHelper.FromJson<Enemy>(jsonstring);
if (EnemiesFromDB.Length > 0)
{
enemy = EnemiesFromDB[0];
//HERE enemy.EnemyID is 1 and enemy.Name is "Evil Enemy Monster Man!"
//So it is working here!
}
else throw new System.Exception("No Enemy Found When Reading Json: " + JsonUtility.FromJson<Enemy>(jsonstring));
}
else throw new System.Exception("DB ERROR: " + dbProc.error);
}
}
Я нашел этот вспомогательный класс здесь, в stackoverflow. Я забыл, где, или я бы отдал должное, но это работает отлично!
public static class JsonHelper
{
public static string RemoveBrackets(string s)
{
s = s.Replace("[", string.Empty);
s = s.Replace("]", string.Empty);
return s;
}
public static T[] FromJson<T>(string json)
{
Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(json);
return wrapper.Items;
}
public static string ToJson<T>(T[] array)
{
Wrapper<T> wrapper = new Wrapper<T>();
wrapper.Items = array;
return JsonUtility.ToJson(wrapper);
}
public static string ToJson<T>(T[] array, bool prettyPrint)
{
Wrapper<T> wrapper = new Wrapper<T>();
wrapper.Items = array;
return JsonUtility.ToJson(wrapper, prettyPrint);
}
[System.Serializable]
private class Wrapper<T>
{
public T[] Items;
}
}
Очень расстраивает, кажется, я прочитал миллион сообщений на IEnumerator. Я хотел бы, чтобы метод IEnumerator просто возвращал мой объект Enemy вместо того, чтобы использовать частный враг в качестве переменной, на которую воздействует IEnumerator и которая возвращается методом получения.
Большое спасибо за любую помощь!