2013-04-29 5 views
1

У меня есть следующий код в объекте игрока:waitforseconds выход() не работает

function Start() 
{ 
    GUI = GameObject.FindWithTag("GUI").GetComponent(InGameGUI); 
} 

function OnCollisionEnter(hitInfo : Collision) 
{ 
    if(hitInfo.relativeVelocity.magnitude >= 2) //if we hit it too hard, explode! 
    { 
     Explode(); 
    } 
} 

function Explode() //Drop in a random explosion effect, and destroy ship 
{ 
    var randomNumber : int = Random.Range(0,shipExplosions.length); 
    Instantiate(shipExplosions[randomNumber], transform.position, transform.rotation); 
    Destroy(gameObject); 

    GUI.Lose(); 
} 

И моя функция GUI.Lose() выглядит следующим образом:

function Lose() 
{ 
    print("before yield"); 
    yield WaitForSeconds(3); 
    print("after yield"); 
    Time.timeScale = 0; 
    guiMode = "Lose"; 
} 

Когда взрываются функция вызывается функция «свободные», и я вижу сообщение «до выхода». Я жду три секунды, но я никогда не вижу сообщение «после выхода».

Если я получаю выход, функция работает так, как я ожидал бы, минус ожидая 3 секунды.

Это на Unity 4. Этот код непосредственно из учебника, который, как мне кажется, был создан на Unity 3.5. Я предполагаю, что код работал в Unity 3.5, потому что на сайтах нет комментариев с вопросом, почему доходность не работает.

Какая глупость я делаю неправильно?

ответ

4

Вы должны использовать StartCoroutine, например, так:

function Explode() //Drop in a random explosion effect, and destroy ship 
{ 
    var randomNumber : int = Random.Range(0,shipExplosions.length); 
    Instantiate(shipExplosions[randomNumber], transform.position, transform.rotation); 
    Destroy(gameObject); 

    // Change here. 
    yield StartCoroutine(GUI.Lose()); 

    // Or use w/out a 'yield' to return immediately. 
    //StartCoroutine(GUI.Lose()); 
} 
+0

Спасибо, это достало меня достаточно близко, чтобы закончить его. Я помещал выход StartCoroutine (GUI.Lose()) перед Destroy. До этого я устанавливаю renderer.enabled = false; поэтому мой игровой объект скроется. Функция Lose() завершается, и мой объект gameObject уничтожается. –

+0

Пояснение: поскольку выполнение сопрограммы может быть приостановлено в любой момент с помощью инструкции yield. – Joetjah

0

Вы могли бы также рассмотреть возможность использования простой Invoke на вашей Lose функции.

function Start() 
{ 
    GUI = GameObject.FindWithTag("GUI").GetComponent(InGameGUI); 
} 

function OnCollisionEnter(hitInfo : Collision) 
{ 
    if(hitInfo.relativeVelocity.magnitude >= 2) //if we hit it too hard, explode! 
    { 
     Explode(); 
    } 
} 

function Explode() //Drop in a random explosion effect, and destroy ship 
{ 
    var randomNumber : int = Random.Range(0,shipExplosions.length); 
    Instantiate(shipExplosions[randomNumber], transform.position, transform.rotation); 
    Destroy(gameObject); 
    Invoke("YouLose", 3.0f); 
} 

function YouLose() 
{ 
    GUI.Lose(); 
} 
Смежные вопросы