#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
}
}