using System.Collections.Generic; using UnityEditor; using UnityEngine; using UnityEngine.SceneManagement; public class NextLevel : MonoBehaviour { public int ThisLevel; public int LevelComplete; int RightComplete; int CenterComplete; int LeftComplete; public int Num; public int Place; public string NextScene = "0"; private List HaveSkin = new(); public bool IsMiniGame; public int MinigameNumber; public int NPC0QP; public int QLID; public bool IsQL; public bool IsDL; public bool IsLastLevel; private string LoadedScene; [SerializeField] GameObject Tobj; public int GiveSkin; //public bool Finished = false; public static TextAsset csvFile; public string[] dataLines; float ttime; private void Start() { csvFile = Resources.Load("LevelsMeta"); dataLines = csvFile.text.Split('\n'); NPC0QP = PlayerPrefs.GetInt("NPC0QP"); //ThisLevel = SceneManager.GetActiveScene().buildIndex; LevelComplete = PlayerPrefs.GetInt("LevelComplete"); HaveSkin = Currencies.Load("HaveS"); LeftComplete = PlayerPrefs.GetInt("CompleteLeftL"); CenterComplete = PlayerPrefs.GetInt("CompleteCenterL"); RightComplete = PlayerPrefs.GetInt("RightCompleteL"); } void Update() { ttime += Time.deltaTime; } private void OnTriggerEnter2D(Collider2D collision) { /* if (collision.tag == "Player" && !GameObject.Find("player").GetComponent().Finished) { // ПРИНУДИТЕЛЬНАЯ ЗАЩИТА: отключаем флаги мини-игры, если это стандартный уровень IsMiniGame = false; IsDL = false; IsQL = false; }*/ {GameObject.Find("player").GetComponent().Finished = true; //GameObject.Find("Player").SetActive(false); int WinCount = PlayerPrefs.GetInt("CountWin"); int MinigamesComplete = PlayerPrefs.GetInt("MiniGamesComplete"); PlayerPrefs.SetInt("CountWin", WinCount + 1); switch (Place) { case 0: if (GiveSkin != 0) { HaveSkin = Currencies.Load("HaveS"); if (!HaveSkin.Contains(GiveSkin)) { HaveSkin.Add(GiveSkin); } Currencies.Save("HaveS", HaveSkin); } // Если это специфический режим, выполняем его логику if (IsDL) { SceneManager.LoadScene(1); break; } // ДОБАВЛЕНА ПРОВЕРКА: если уровень обычный, игнорируем QL и мини-игры if (IsQL) { switch (QLID) { case 0: if (NPC0QP < 2) { PlayerPrefs.SetInt("NPC0QP", 2); } break; } End(1); break; } if (IsMiniGame) { if (MinigamesComplete < MinigameNumber) { PlayerPrefs.SetInt("MiniGamesComplete", MinigameNumber); } End("MiniGames"); break; } if (ThisLevel == 9) { HaveSkin = Currencies.Load("HaveS"); HaveSkin.Add(11); Currencies.Save("HaveS", HaveSkin); } if (IsLastLevel) { End("Anim"); PlayerPrefs.SetInt("LevelComplete", ThisLevel); } else { // 1. Сначала обновляем прогресс в PlayerPrefs if (ThisLevel > LevelComplete && !IsMiniGame && !IsQL && !IsDL) { PlayerPrefs.SetInt("LevelComplete", ThisLevel); } // 2. УДАЛЯЕМ старый мусорный код загрузки и ВСТАВЛЯЕМ ЭТО: // Чистим старые объекты, чтобы не было дублей в DDOL GameObject oldTobj = GameObject.Find("Tobj"); if (oldTobj != null) Destroy(oldTobj); // Создаем новый контейнер данных GameObject newTobj = Instantiate(Tobj); newTobj.name = "Tobj"; newTobj.SetActive(true); TransferScript ts = newTobj.GetComponent(); // ВАЖНО: используем ThisLevel + 1 для формирования имени следующей сцены ts.string1 = "Level" + (ThisLevel + 1); ts.bool1 = false; DontDestroyOnLoad(newTobj); // 3. Запускаем переход через Buttons (он сам сделает Delay и загрузит ImportLeverl) Buttons.End("ImportLeverl"); // ОБЯЗАТЕЛЬНО: убедись, что после Buttons.End("ImportLeverl") // в коде НЕТ вызовов других методов типа End(...) или Invoke(...) }; break; // Конец case 0 case 1: if (Num > LeftComplete) { PlayerPrefs.SetInt("CompleteLeftL", Num); } if (NextScene == "0") { End(SceneManager.GetActiveScene().buildIndex + 1); } else { End(NextScene); } break; case 2: if (Num > CenterComplete) { PlayerPrefs.SetInt("CompleteCenterL", Num); } if (NextScene == "0") { End(SceneManager.GetActiveScene().buildIndex + 1); } else { End(NextScene); } break; case 3: if (Num > RightComplete) { PlayerPrefs.SetInt("CompleteRightL", Num); } if (NextScene == "0") { End(SceneManager.GetActiveScene().buildIndex + 1); } else { End(NextScene); } break; } } } public void BackLLast() { PlayerPrefs.SetInt("LevelCoplete", 10); } public void End(object S) { Debug.Log($"[End Called] Scene/Trigger requested: {S}, ThisLevel = {ThisLevel}, Time = {ttime}"); GameObject.FindGameObjectWithTag("Transition").GetComponent().SetTrigger("End"); LoadedScene = S.ToString(); Invoke("loadS", 0.75f); Debug.Log(S); } public void loadS() { Time.timeScale = 1f; try { int L = int.Parse(LoadedScene); SceneManager.LoadScene(L); } catch { SceneManager.LoadScene(LoadedScene); } } }