starOfWords/Assets/Scripts/LevelMapScene.cs
portakal ecb1c9edea Initial commit: Star of Words Unity project
Snapshot of the existing Unity 6 language-learning word game before any
refactoring. Adds Unity .gitignore and .gitattributes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 15:31:20 +03:00

215 lines
No EOL
6.4 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class LevelMapScene : MonoBehaviour
{
[Header("━━━ UI ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")]
public TMP_Text infoText;
public TMP_Text totalScoreText;
public Image infoBackground;
[Header("━━━ INFO HIDE ━━━━━━━━━━━━━━━━━━━━━━━━━")]
public float infoHideDelay = 5f;
[Header("━━━ AUDIO ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")]
public AudioSource bgMusic;
public AudioSource clickSound;
[Header("━━━ SCENES ━━━━━━━━━━━━━━━━━━━━━━━━━━━━")]
public Button backButton;
public string backSceneName = "modsec 1";
[Header("Her level ayrı sahneye gidiyorsa AÇIK bırak (GameScene_Level1, GameScene_Level2 ...)")]
public bool usePerLevelScene = true;
[Header("Ayrı sahne kullanılıyorsa bu ön ek + levelID kullanılır")]
public string levelScenePrefix = "GameScene_Level"; // -> GameScene_Level1
[Header("Tüm leveller TEK sahneye gidiyorsa burayı kullan (usePerLevelScene KAPALI iken)")]
public string singleGameSceneName = "GameScene";
[Header("━━━ PLANETS / LEVEL BUTTONS ━━━━━━━━━━")]
public Button[] levelButtons;
[Header("━━━ LEVEL LOCK SETTINGS ━━━━━━━━━━━━━━")]
public bool useScoreLock = true;
private int playerTotalScore;
private Coroutine hideInfoCoroutine;
private readonly int[] requiredScores = new int[20]
{
0, 1000, 2000, 3000, 4000,
5000, 6000, 7000, 8000, 9000,
10000, 11000, 12000, 13000, 14000,
15000, 16000, 17000, 18000, 19000
};
void Start()
{
playerTotalScore = PlayerPrefs.GetInt("TotalScore", 0);
if (totalScoreText != null)
totalScoreText.text = "Your Total Score: " + playerTotalScore;
if (infoText != null)
{
infoText.text = "";
infoText.alpha = 0f;
}
if (infoBackground != null)
{
infoBackground.gameObject.SetActive(false);
infoBackground.color = new Color(1f, 1f, 1f, 0.70f);
}
if (bgMusic != null)
{
bgMusic.loop = true;
bgMusic.Play();
}
SetupLevelButtons();
if (backButton != null)
{
backButton.onClick.RemoveAllListeners();
backButton.onClick.AddListener(GoBack);
}
}
void SetupLevelButtons()
{
if (levelButtons == null || levelButtons.Length == 0)
{
Debug.LogError("LevelMapScene: Level Buttons atanmadı.");
return;
}
int buttonCount = Mathf.Min(levelButtons.Length, requiredScores.Length);
for (int i = 0; i < buttonCount; i++)
{
int levelID = i + 1;
if (levelButtons[i] == null)
{
Debug.LogWarning("LevelMapScene: Level button boş index: " + i);
continue;
}
levelButtons[i].interactable = true;
levelButtons[i].onClick.RemoveAllListeners();
levelButtons[i].onClick.AddListener(() => OnLevelSelect(levelID));
}
}
void OnLevelSelect(int levelID)
{
if (clickSound != null)
clickSound.Play();
if (levelID < 1 || levelID > requiredScores.Length)
{
Debug.LogError("Geçersiz levelID: " + levelID);
return;
}
int neededScore = requiredScores[levelID - 1];
// ❌ KİLİTLİ
if (useScoreLock && playerTotalScore < neededScore)
{
ShowInfo(
"LEVEL LOCKED\n\n" +
"Level: " + levelID + "\n" +
"Your Total Score: " + playerTotalScore + "\n" +
"Required Score: " + neededScore,
new Color32(255, 70, 70, 255));
return;
}
// ✔ AÇIK → sahneyi belirle
string sceneToLoad = usePerLevelScene
? (levelScenePrefix + levelID) // GameScene_Level1
: singleGameSceneName; // GameScene
// Sahne Build Settings'te var mı? Kontrol et
if (!Application.CanStreamedLevelBeLoaded(sceneToLoad))
{
ShowInfo(
"SAHNE BULUNAMADI\n\n" +
"'" + sceneToLoad + "'\n" +
"Build Settings'e ekli değil!",
new Color32(255, 170, 50, 255));
Debug.LogError("Sahne yüklenemiyor: '" + sceneToLoad +
"'. File > Build Settings içine eklediğinden ve adının birebir aynı olduğundan emin ol.");
return;
}
ShowInfo(
"LEVEL OPENED\n\n" +
"Level: " + levelID + "\n" +
"Loading...",
new Color32(70, 255, 100, 255));
PlayerPrefs.SetInt("SelectedLevel", levelID);
PlayerPrefs.SetInt("SelectedStoryLevel", levelID);
PlayerPrefs.SetString("LastPlayedMod", "Mod1");
PlayerPrefs.Save();
StartCoroutine(LoadGameSceneDelay(sceneToLoad));
}
void ShowInfo(string message, Color color)
{
if (infoBackground != null)
infoBackground.gameObject.SetActive(true);
if (infoText != null)
{
infoText.alpha = 1f;
infoText.color = color;
infoText.text = message;
}
if (hideInfoCoroutine != null)
StopCoroutine(hideInfoCoroutine);
hideInfoCoroutine = StartCoroutine(HideInfoAfterDelay());
}
IEnumerator LoadGameSceneDelay(string sceneToLoad)
{
yield return new WaitForSeconds(0.35f);
SceneManager.LoadScene(sceneToLoad);
}
IEnumerator HideInfoAfterDelay()
{
yield return new WaitForSeconds(infoHideDelay);
if (infoText != null)
{
infoText.text = "";
infoText.alpha = 0f;
}
if (infoBackground != null)
infoBackground.gameObject.SetActive(false);
}
void GoBack()
{
if (clickSound != null)
clickSound.Play();
if (!string.IsNullOrWhiteSpace(backSceneName))
SceneManager.LoadScene(backSceneName);
}
}