我正在为我的 Unity 程序编写
C#
代码。
我正在通过
IEnumerator searchInDatabase(string sql)
函数获取数据。
我会按
getDatabaseValue()
来呼叫 A
。
代码如下。
void Update()
{
if (Input.GetKeyDown(KeyCode.A)) getDatabaseValue("select * from table;", 0, 0);
}
IEnumerator searchInDatabase(string sql)
{
queryCompleted = false;
WWWForm database = new WWWForm();
database.AddField("sqlpost", sql);
using (UnityWebRequest www = UnityWebRequest.Post("myDatabase", database))
{
yield return www.SendWebRequest();
string[] entries = www.downloadHandler.text.Split(",|");
result = new string[entries.Length, entries[0].Split(',').Length];
for (int i = 0; i < entries.Length; i++)
{
string[] parts = entries[i].Split(',');
for (int j = 0; j < parts.Length; j++)
{
result[i, j] = parts[j];
}
}
queryCompleted = true;
yield return result;
}
Debug.Log("Query Completed");
}
public string getDatabaseValue(string sql, int x, int y)
{
try
{
Debug.Log("Waiting 00");
StartCoroutine(searchInDatabase(sql));
Debug.Log("getting result data");
return result[x, y];
}
finally { }
//catch (Exception ex) { Debug.LogWarning(ex.StackTrace); }
// return result[0, 0];
}
然而,我得到的结果是
Waiting 00
getting result data
Result = 1 // (<-- result from previous query statement)
Query Completed
我期望结果应该是先完成查询,然后再从
result
获取数据。
我的预期输出如下:
Waiting 00
Query Completed
getting result data
Result = 2 //(<--result from this query statement)
您使用
StartCoroutine
来启动协程。 Unity中协程的描述是这样的:
可以使用yield 语句随时暂停协程的执行。当使用yield语句时,协程会暂停执行并在下一帧自动恢复。有关更多详细信息,请参阅协程文档。
因此,当
getDatabaseValue
调用 searchInDatabase
时,searchInDatabase
方法将在该行暂停:
yield return www.SendWebRequest();
然后程序会返回到
getDatabaseValue
,继续执行下一行:
Debug.Log("getting result data");
作为一个可能的解决方案,您可以像这样生成
StartCoroutine
的返回值:
yield return StartCoroutine(searchInDatabase(sql));
如果您执行此修复,您应该检查调用
getDatabaseValue
的代码是否有相同的问题。
还有更多相关信息: MonoBehaviour.StartCoroutine
本页中的第一个示例与您的代码类似,第二个示例是您所期望的。