Существует несколько способов передачи данных между сценами. Наиболее распространенная рекомендация - использовать шаблон Singleton , который используется другими сценариями в каждой сцене. Однако это может быть слишком сложно.
Интересно, что более новые ScriptableObjects Unity можно использовать для аналогичной стратегии. Поскольку объекты ScriptableObject сохраняются в большем объеме, чем сцены, вы можете использовать их для хранения данных между сценами без использования статики и синглетонов. Unity даже позиционирует их как нечто большее, чем просто контейнеры данных! Я предпочитаю передавать данные между объектами и сценами, создавая общий объект сценариев и ссылаясь на этот ресурс в каждом сценарии, который должен обмениваться данными (независимо от сцены).
Вот пример использования вашего требования:
GameData.cs
[CreateAssetMenu(fileName = "GameData", menuName = "Game Data")]
public class GameData: ScriptableObject
{
float gameDuration; //This is where you will store and read your selected game duration
}
GameSelection.cs Этот сценарий существует в сцене 1
public class GameSelection : Monobehaviour
{
public GameData gameData;
public void SetDuration(float time) //Call this method from each button with a different parameter
{
gameData.gameDuration = time;
}
}
Countdown.cs Этот сценарий существует в Scene 2
public class Countdown: Monobehaviour
{
public GameData gameData;
float countdownTimer;
public void Start()
{
countdownTimer = gameData.gameDuration;
}
//... rest of your countdown script
}
Теперь вы можете создать актив GameData в папке вашего проекта и перетащить его в инспектор в Scene1,и инспектор в сцене 2. Если Scene1 изменит значение таймера, Scene2 узнает об этом. Кроме того, вы можете установить значение по умолчанию для gameDuration в активе GameData и запускать / тестировать Scene2 без необходимости сначала запускать Scene1!