using UnityEngine; using UnityEngine.UI; using System.Collections; using UnityEngine.SceneManagement; using TMPro; [System.Serializable] public class DataStageSiluet { public GameObject objekStage; public AudioClip kasetNarasiSelesai; } public class GameManagerSiluet : MonoBehaviour { [Header("--- PANEL NAVIGASI & POP UP ---")] public GameObject panelPilihLevel; public GameObject panelGameSiluet; public GameObject panelPopUpBenar; public static bool mauUlangSiluet = false; public static bool mauKembaliKePeta = false; public static bool sudahPernahSapaSiluet = false; [Header("--- KOLEKSI SUARA SILUET ---")] public AudioSource speakerGame; public AudioClip kasetNarator; public AudioClip kasetBenarUmum; public AudioClip kasetSalah; public AudioClip kasetPopUpHebat; public AudioClip kasetPanelHasil; public AudioClip kasetKlikTombol; public AudioClip kasetKalahWaktu; [Header("--- DAFTAR STAGE ---")] public DataStageSiluet[] daftarStageEdukasi; public int[] targetHewanPerStage; private int stageSekarang = 0; private int jumlahBenarDiStageIni = 0; private int totalBenarGlobal = 0; private int totalTargetSemuaStage = 0; private bool gameSelesai = false; [Header("--- SISTEM SKOR KIRI ---")] public Image barSkor; public TextMeshProUGUI teksSkorKiri; public Image[] bintangSkorProgress; [Header("--- PENGATURAN WAKTU ---")] public float durasiWaktuMain = 60f; private float waktuSisa; public Image barWaktu; private bool waktuBolehJalan = false; [Header("--- PANEL HASIL AKHIR & ANIMASI ---")] public GameObject panelHasil; public RectTransform kontenPanelHasil; public Image[] slotBintangPanel; public TextMeshProUGUI teksSkorAkhir; [Header("--- FITUR ANTI-KLIK ---")] public CanvasGroup groupKlikGame; void Start() { StopAllCoroutines(); if (speakerGame != null) speakerGame.Stop(); waktuSisa = durasiWaktuMain; gameSelesai = false; waktuBolehJalan = false; totalBenarGlobal = 0; stageSekarang = 0; jumlahBenarDiStageIni = 0; if (groupKlikGame != null) groupKlikGame.blocksRaycasts = true; totalTargetSemuaStage = 0; foreach (int t in targetHewanPerStage) totalTargetSemuaStage += t; if (panelHasil != null) panelHasil.SetActive(false); if (panelPopUpBenar != null) panelPopUpBenar.SetActive(false); if (barSkor != null) barSkor.fillAmount = 0; if (teksSkorKiri != null) teksSkorKiri.text = "0"; foreach (Image b in bintangSkorProgress) if(b != null) b.color = Color.gray; foreach (Image b in slotBintangPanel) if(b != null) b.color = Color.gray; if (barWaktu != null) { barWaktu.fillAmount = 1; barWaktu.color = Color.white; } UpdateTampilanStage(); if (mauUlangSiluet) { if (panelPilihLevel != null) panelPilihLevel.SetActive(false); if (panelGameSiluet != null) panelGameSiluet.SetActive(true); mauUlangSiluet = false; MulaiSuaraNaratorSatuPintu(); } else if (mauKembaliKePeta) { if (panelPilihLevel != null) panelPilihLevel.SetActive(true); if (panelGameSiluet != null) panelGameSiluet.SetActive(false); mauKembaliKePeta = false; } } public void MulaiSuaraNaratorSatuPintu() { StopAllCoroutines(); if (speakerGame != null) { speakerGame.Stop(); StartCoroutine(LogikaTungguNarator()); } } IEnumerator LogikaTungguNarator() { if (groupKlikGame != null) groupKlikGame.blocksRaycasts = false; waktuBolehJalan = false; yield return new WaitForSeconds(0.2f); if (!sudahPernahSapaSiluet) { if (kasetNarator != null) { speakerGame.PlayOneShot(kasetNarator); yield return new WaitForSeconds(kasetNarator.length); sudahPernahSapaSiluet = true; } } if (groupKlikGame != null) groupKlikGame.blocksRaycasts = true; waktuBolehJalan = true; } public void MasukGameDanNgomongSiluet() { // ========================================================= // JURUS MUTLAK ANTI-NABRAK: TEMBAK LANGSUNG DARI KODE! // ========================================================= ManagerSuaraBermain satpamMenu = FindObjectOfType(); if (satpamMenu != null) { satpamMenu.HentikanPaksaSuara(); // Paksa diam detik ini juga! } if (panelPilihLevel != null) panelPilihLevel.SetActive(false); if (panelGameSiluet != null) panelGameSiluet.SetActive(true); MulaiSuaraNaratorSatuPintu(); } void Update() { if (gameSelesai) return; if (!waktuBolehJalan) return; if (waktuSisa > 0) { waktuSisa -= Time.deltaTime; if (barWaktu != null) { barWaktu.fillAmount = waktuSisa / durasiWaktuMain; if (waktuSisa <= 10f) barWaktu.color = Color.red; } } else { waktuSisa = 0; AkhiriGame(true); } } public void JawabanSalah() { if (gameSelesai) return; if (speakerGame != null && kasetSalah != null) speakerGame.PlayOneShot(kasetSalah); } public void TambahSkor(AudioClip suaraHewan = null) { if (gameSelesai) return; if (speakerGame != null) { if (kasetBenarUmum != null) speakerGame.PlayOneShot(kasetBenarUmum); if (suaraHewan != null) StartCoroutine(JedaSuaraAsli(suaraHewan)); } jumlahBenarDiStageIni++; totalBenarGlobal++; UpdateUISkorKiri(); if (stageSekarang < targetHewanPerStage.Length) { if (jumlahBenarDiStageIni >= targetHewanPerStage[stageSekarang]) { StartCoroutine(PindahStageNext()); } } } IEnumerator JedaSuaraAsli(AudioClip clip) { yield return new WaitForSeconds(0.4f); speakerGame.PlayOneShot(clip); } IEnumerator PindahStageNext() { if (groupKlikGame != null) groupKlikGame.blocksRaycasts = false; waktuBolehJalan = false; if (panelPopUpBenar != null) panelPopUpBenar.SetActive(true); if (speakerGame != null && kasetPopUpHebat != null) speakerGame.PlayOneShot(kasetPopUpHebat); yield return new WaitForSeconds(1.5f); if (panelPopUpBenar != null) panelPopUpBenar.SetActive(false); if (speakerGame != null && stageSekarang < daftarStageEdukasi.Length) { AudioClip narasi = daftarStageEdukasi[stageSekarang].kasetNarasiSelesai; if (narasi != null) { speakerGame.PlayOneShot(narasi); yield return new WaitForSeconds(narasi.length + 0.5f); } } if (stageSekarang < daftarStageEdukasi.Length - 1) { if (daftarStageEdukasi[stageSekarang].objekStage != null) daftarStageEdukasi[stageSekarang].objekStage.SetActive(false); stageSekarang++; jumlahBenarDiStageIni = 0; UpdateTampilanStage(); if (groupKlikGame != null) groupKlikGame.blocksRaycasts = true; waktuBolehJalan = true; } else { AkhiriGame(false); } } void UpdateTampilanStage() { for (int i = 0; i < daftarStageEdukasi.Length; i++) { if (daftarStageEdukasi[i].objekStage != null) daftarStageEdukasi[i].objekStage.SetActive(i == stageSekarang); } } void UpdateUISkorKiri() { if (totalTargetSemuaStage == 0) return; float persentase = (float)totalBenarGlobal / totalTargetSemuaStage; if (barSkor != null) barSkor.fillAmount = persentase; if (teksSkorKiri != null) teksSkorKiri.text = Mathf.RoundToInt(persentase * 100f).ToString(); if (bintangSkorProgress.Length >= 3) { if (persentase >= 0.33f && bintangSkorProgress[0] != null) bintangSkorProgress[0].color = Color.white; if (persentase >= 0.66f && bintangSkorProgress[1] != null) bintangSkorProgress[1].color = Color.white; if (persentase >= 1.00f && bintangSkorProgress[2] != null) bintangSkorProgress[2].color = Color.white; } } void AkhiriGame(bool waktuHabis) { if (gameSelesai) return; gameSelesai = true; waktuBolehJalan = false; if (groupKlikGame != null) groupKlikGame.blocksRaycasts = true; float persentase = (float)totalBenarGlobal / totalTargetSemuaStage; if (teksSkorAkhir != null) teksSkorAkhir.text = Mathf.RoundToInt(persentase * 100f).ToString(); int bintangDapat = 0; if (persentase >= 1.00f) bintangDapat = 3; else if (persentase >= 0.66f) bintangDapat = 2; else if (persentase >= 0.33f) bintangDapat = 1; StartCoroutine(AnimasiPanelDanBintang(bintangDapat, waktuHabis)); } IEnumerator AnimasiPanelDanBintang(int jumlahBintang, bool waktuHabis) { if (groupKlikGame != null) groupKlikGame.blocksRaycasts = true; if (kontenPanelHasil != null) { kontenPanelHasil.localScale = Vector3.zero; panelHasil.SetActive(true); panelHasil.transform.SetAsLastSibling(); float t = 0; while (t < 1f) { t += Time.deltaTime * 4f; float curve = Mathf.Sin(t * Mathf.PI * 0.7f) * 1.15f; kontenPanelHasil.localScale = new Vector3(curve, curve, curve); yield return null; } kontenPanelHasil.localScale = Vector3.one; } else { panelHasil.SetActive(true); } if (waktuHabis) { if (speakerGame != null && kasetKalahWaktu != null) speakerGame.PlayOneShot(kasetKalahWaktu); } else { if (speakerGame != null && kasetPanelHasil != null) speakerGame.PlayOneShot(kasetPanelHasil); } yield return new WaitForSeconds(0.3f); for (int i = 0; i < jumlahBintang; i++) { if (i < slotBintangPanel.Length && slotBintangPanel[i] != null) { if (speakerGame != null && kasetBenarUmum != null) speakerGame.PlayOneShot(kasetBenarUmum); slotBintangPanel[i].color = Color.white; float bT = 0; Vector3 startScale = Vector3.one * 2f; while(bT < 1f){ bT += Time.deltaTime * 5f; slotBintangPanel[i].rectTransform.localScale = Vector3.Lerp(startScale, Vector3.one, bT); yield return null; } yield return new WaitForSeconds(0.4f); } } } public void TombolUlangi() { if (speakerGame != null && kasetKlikTombol != null) speakerGame.PlayOneShot(kasetKlikTombol); mauUlangSiluet = true; sudahPernahSapaSiluet = false; SceneManager.LoadScene(SceneManager.GetActiveScene().name); } public void TombolKeluar() { if (speakerGame != null && kasetKlikTombol != null) speakerGame.PlayOneShot(kasetKlikTombol); mauKembaliKePeta = true; sudahPernahSapaSiluet = false; StopAllCoroutines(); if (speakerGame != null) speakerGame.Stop(); SceneManager.LoadScene(SceneManager.GetActiveScene().name); } }