2017-02-22 15 views
0

Я хотел бы перезапустить уровень, когда персонаж вводит триггер (который является окончанием гонки) через 5 или 10 секунд.Уровень перезапуска Ontrigger после продолжительности

У меня есть сценарий, который выглядит примерно так:

public class WinBox : MonoBehaviour 
{ 
    public Camera Camera1; 
    private void OnTriggerEnter(Collider other) 
    { 
     GameObject.Find("Camera (eye)").SendMessage("StopTimer"); 
    } 
} 

Что я должен добавить, чтобы сделать рестарт уровня после того времени, что я хочу, чтобы определить?

ответ

3

Чтобы сделать что-то после задержки вы могли бы сделать функцию полезности, как это:

static class Utils 
{ 
    public static IEnumerator DoAfterDelay(float delay, System.Action callback) 
    { 
     yield return new WaitForSeconds(delay); 
     callback(); 
    } 
} 

, а затем вызвать его с StartCoroutine Как это

private void RestartLevel() 
{ 
    SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); 
} 

private void OnTriggerEnter(Collider other) 
{ 
    GameObject.Find("Camera (eye)").SendMessage("StopTimer"); 
    float secondsUntilRestart = 10; 
    StartCoroutine(Utils.DoAfterDelay(secondsUntilRestart, RestartLevel)); 
} 

Из моего опыта, часто нужна эта функциональность DoAfterDelay, поэтому я поместил ее в отдельный класс, вместо того, чтобы сделать ее локальным частным методом

+0

Спасибо, что отлично работает! Мне пришлось добавить «using UnityEngine.SceneManagement;» в верхней части моего скрипта btw для работы Диспетчера сцен –

3

Вы можете использовать coroutines для задержки вызова SceneManager. LoadScene функция, наряду с функцией GetActiveScene, чтобы получить информацию о текущей сцене:

private IEnumerator RestartSceneAfterDelay(float delay = 10f) 
{ 
    yield return new WaitForSeconds(delay); 
    SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex) ; 
} 

И вызовите функцию следующим образом:

private void OnTriggerEnter(Collider other) 
{ 
    GameObject.Find("Camera (eye)").SendMessage("StopTimer"); 

    StartCoroutine(RestartSceneAfterDelay()) ; 
    // OR 
    StartCoroutine(RestartSceneAfterDelay(5f)) ;  
} 

An другое решение (но не так хорошо, как первый) - использовать функцию Invoke для задержки вызова диспетчеру сцены. Хотя, избегайте этого, потому что вызов функции производится из строки, которую впоследствии сложно отлаживать.

private void RestartScene() 
{ 
    SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex) ; 
} 

private void OnTriggerEnter(Collider other) 
{ 
    GameObject.Find("Camera (eye)").SendMessage("StopTimer"); 

    Invoke("RestartScene", 5f) ; 
} 
+0

Спасибо, что отлично работает! –