Как я могу запустить функцию вызова, пока я не нажму один объект в Unity? - PullRequest
0 голосов
/ 06 июня 2019

В моем дизайне сцены у меня есть куб, и я хочу нажать на куб, чтобы начать игру. В функции Start () у меня есть две функции вызова, но я не знаю, как их вызывать, пока не нажму на куб. На самом деле

В настоящее время моя функция запуска показана ниже. И я попытался использовать функцию IEnumerator, чтобы решить эту проблему. Также показано, как показано ниже. И в другом скрипте, который находится в объекте Cube, я хочу изменить static bool star t в другом скрипте, когда OnMouseDown().

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 Ответ

1 голос
/ 06 июня 2019
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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...