Ekosistem_Game/Assets/Script/GameManagerSiluet.cs

346 lines
12 KiB
C#

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<ManagerSuaraBermain>();
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);
}
}