Есть несколько способов справиться с этим. Я рекомендую хранить данные о ходе игры в файле или базе данных вне области видимости (хорошее решение для файловой базы данных - SQLite - здесь - пост вики, который я сделал о том, как я реализовал SQLite в одном из моих недавних проектов).
Однако, если вы сохраняете игровой прогресс только в течение жизненного цикла игры (он всегда начинается с уровня 1, когда вы его запускаете), то Singletons и DontDestroyOnLoad также хорошее решение, как упомянул @BugFinder.
public class LevelManager : MonoBehaviour
{
private static LevelManager instance;
public static LevelManager Instance { get => instance; }
int levelNum = 1;
public int LevelNum { get => levelNum; }
private void Awake()
{
//Check to see if an instance of the LevelManager already exists.
if(instance != null && instance != this)
{
Destroy(this.gameObject);
return;
}
instance = this;
DontDestroyOnLoad(this.gameobject);
}
public void LevelComplete()
{
levelNum++;
}
}
Пока вышеуказанный код прикреплен к игровому объекту в вашей сцене, вы можете вызывать следующее из сценария другого игрового объекта. Вы заметите, что я инкапсулирую levelNum и экземпляр. Это сделано для обеспечения хорошей практики в моем другом коде. Я знаю, что единственным сценарием, который может изменять levelNum или экземпляр, является LevelManager, поэтому я не буду случайно что-то нарушать, случайно меняя одно из этих значений в другом сценарии. игровой объект, который может сохраняться между сценами. Мне нравится создавать пустой игровой объект "Одиночки", который просто содержит мои синглеты.
Пример использования при победе над финальным боссом (если это способ побить ваши уровни):
void BossDefeated()
{
LevelManager.Instance.LevelComplete();
}
Пример использование при проверке возможности открытия портала:
int portalNum = 3;
bool CheckPortal()
{
if(LevelManager.Instance.LevelNum >= portalNum)
return true;
return false;
}