在Unity中单击一个对象之前,如何启动调用函数?

时间:2019-06-06 05:56:23

标签: c# unity3d invoke

在我的场景设计中,我有一个立方体,我想单击该立方体开始游戏。在Start()函数中,我有两个invoke函数,但是在单击多维数据集之前,我不知道如何调用它们。其实

当前,我的启动功能如下所示。我试图使用IEnumerator函数来解决此问题。也如下图所示。在多维数据集对象中的另一个脚本中,我想在static bool star时更改其他脚本中的OnMouseDown() t。

public class Progress : MonoBehaviour 
{
    public bool start = false;

    // Use this for initialization
    void Start()
    {
        StartCoroutine(Begin());
        Invoke("startCycle", 3);
        Invoke("startCycle", 15);
    }

    void Start()
    {
        //StartCoroutine(Begin());
        Invoke("startCycle", 3);
        Invoke("startCycle", 15);
    }


   IEnumerator Begin()
   {
        while(!start){
            yield return null;
        }
    }
}

public class CursorClick : MonoBehaviour 
{
    void OnMouseDown()
    {
        Progress.start = true;
    }
}

但是,它只是行不通,即使我没有单击多维数据集,调用仍然会发生。请帮助!

1 个答案:

答案 0 :(得分:1)

StartCoroutine(Begin());

启动Begin()协程,但不等待其完成。由于您的Start被定义为void,因此它可以简单地遍历所有代码,而无需等待任何事情。


将要等待的呼叫移到协程中,以提高可读性,请使用WaitUntil,例如

private void Start()
{
    StartCoroutine(Begin());
}

private IEnumertor Begin()
{
    return new WaitUntil(() => start);

    Invoke("startCycle", 3);
    Invoke("startCycle", 15);
}

或者-尽管没有真正记录,但您可以直接将Start本身直接转换为协程

private IEnumerator Start()
{
    return new WaitUntil(() => start);

    Invoke("startCycle", 3);
    Invoke("startCycle", 15);
}

如果Start被实现为IEnumertor,则Unity内部会自动将其称为协程。您实际上可以在Start

的示例中看到它