c#在执行代码之前等待co例程完成

时间:2018-01-05 22:20:30

标签: c# php mysql unity3d

您好我试图将sql数据库中的保存/加载实现到我的游戏中。 我把它全部工作除了我需要两次加载以加载数据这一事实。

在我有机会设置数据之前设置数据的代码。

public void loadData()
{
    GetComponent<SavingLoading>().Load(GameObject.Find("LoginSystem").GetComponent<LoginSystem>().Username);

    if (GetComponent<SavingLoading>().LoadedData != "")
    {
        string[] Data = GetComponent<SavingLoading>().LoadedData.Split(',');

        Level = Convert.ToInt32(Data[0]);
        CurrentXp = Convert.ToInt32(Data[1]);
        currentHealth = Convert.ToInt32(Data[2]);
        maxHealth = Convert.ToInt32(Data[3]);

        Vector3 LoadedPos = new Vector3(Convert.ToSingle(Data[4]), Convert.ToSingle(Data[5]), Convert.ToSingle(Data[6]));
        transform.position = LoadedPos;
    }
}

Theese的功能在另一个剧本中。

public void Load(string name)
{
    StartCoroutine(LoadCall(name));
}



IEnumerator LoadCall(string name)
{
    WWWForm form = new WWWForm();
    form.AddField("name", name);

    WWW www = new WWW(LoadPhP, form);
    yield return www;
    string _return = www.text;
    LoadedData = _return;
}

如果有数据,我怎么能只更新数据呢?无需按两次加载按钮。

2 个答案:

答案 0 :(得分:0)

根据docs,您应该将www变量包装在using语句中,以便正确处理。然后收益率,就像这样:

using (WWW www = new WWW(url))
{
    yield return www;
    string _return = www.text;
    LoadedData = _return;
}

我不确定您的意思是“只有在有数据时才更新数据”。您是否有更多代码可以帮助澄清您的意图?

答案 1 :(得分:-1)

loadData()中使用StartCoroutine创建新线程,您可以在其中等待某些内容而不会阻止主线程。然后在此例程中使用WaitUntil函数等待数据存在。

public void loadData()
{
    GetComponent<SavingLoading>().Load(GameObject.Find("LoginSystem").GetComponent<LoginSystem>().Username);
    StartCoroutine(() => {
        yield return new WaitUntil(() => GetComponent<SavingLoading>().LoadedData != "");
        string[] Data = GetComponent<SavingLoading>().LoadedData.Split(',');

        Level = Convert.ToInt32(Data[0]);
        CurrentXp = Convert.ToInt32(Data[1]);
        currentHealth = Convert.ToInt32(Data[2]);
        maxHealth = Convert.ToInt32(Data[3]);

        Vector3 LoadedPos = new Vector3(Convert.ToSingle(Data[4]), Convert.ToSingle(Data[5]), Convert.ToSingle(Data[6]));
        transform.position = LoadedPos;
    });
}

如果已经调用 loadData(),请记住添加某种检查。否则你可能最终会有一堆等待没有理由的线程。