Unity C #: уничтожить объект при загрузке новой сцены

#c# #unity3d #unity5

#c# #unity3d #unity5

Вопрос:

в настоящее время у меня есть таймер, который имеет DontDestroyOnLoad функцию, позволяющую ему циклически просматривать сцены, для которых требуется таймер, мой вопрос в том, как я могу уничтожить свой таймер, когда игра загружает сцену главного меню?

Комментарии:

1. Если какой-либо из приведенных ниже ответов ответил на ваш вопрос, вы можете принять его.

Ответ №1:

В функции запуска таймера найдите объекты, содержащие сценарий, и проверьте, есть ли более двух таких объектов :

 private void Start()
{
      Timer[] timers = FindObjectsOfType(typeof(Timer)) as Timer[];
      if( timers.Length > 1 )
         Destroy( gameObject ) ;
}
 

Таймер, уже находящийся в сцене из-за DontDestroyOnLoad, не будет вызывать функцию Start (поскольку она вызывается только один раз в жизненном цикле скрипта), поэтому он не будет уничтожен

Ответ №2:

У вас есть два варианта.

Вы можете вызвать Destroy(gameObject); или DestroyImmediate() в своем сценарии таймера. Это уничтожит этот сценарий таймера и GameObject.

Другой вариант — иметь функцию, которая остановит таймер, а затем сбросит переменные таймера до значения по умолчанию. Это хорошо с точки зрения управления памятью на мобильных устройствах.

 public class Timer: MonoBehaviour
{
    public void StopAndResetTimer()
    {
        //Stop Timer

        //Reset Timer variables
    }

    public void DestroyTimer()
    {
        Destroy(gameObject);
        // DestroyImmediate(gameObject);
    }
}
 

Затем в вашем сценарии главного меню

 public class MainMenu: MonoBehaviour
{

    Timer timerScript;
    void Start()
    {
        timerScript = GameObject.Find("GameObjectTimerIsAttachedTo").GetComponent<Timer>();
        timerScript.DestroyTimer();

        //Or option 2
        timerScript.StopAndResetTimer()
    }
}
 

Ответ №3:

Это может решить вашу проблему:

 private void Start()
{
    if (SceneManager.GetActiveScene().name == "main menu") // check if current scene in main menu, (be sure the name match with your scene)
    {
        var timer = GameObject.FindObjectOfType<Timer>(); // find your timer component

        if (timer) Destroy(timer.gameObject); // destroy that
    }
}