433 lines
14 KiB
C#
433 lines
14 KiB
C#
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using UnityEngine.SceneManagement;
|
|
|
|
public class GameManagerHewan : MonoBehaviour
|
|
{
|
|
public static GameManagerHewan instance;
|
|
|
|
[Header("PANEL LEVEL HEWAN")]
|
|
public GameObject Panel_TebakSuara;
|
|
public GameObject Panel_Puzzle;
|
|
public GameObject Panel_TebakHabitat;
|
|
public GameObject Panel_Kemenangan;
|
|
public GameObject Panel_PilihLevel;
|
|
public GameObject Panel_PilihLevel2;
|
|
|
|
[Header("UI & TOMBOL")]
|
|
public GameObject TombolNextGlobal;
|
|
public Text teksWaktu;
|
|
public GameObject wadahNyawa;
|
|
public GameObject[] iconHati;
|
|
|
|
[Header("POP UP")]
|
|
public GameObject popUpBenar;
|
|
public GameObject popUpSalah;
|
|
public GameObject popupLanjut;
|
|
|
|
[Header("AUDIO UTAMA")]
|
|
public AudioSource audioSource;
|
|
public AudioClip klipBenar;
|
|
public AudioClip klipSalah;
|
|
public AudioClip klipKalimatBenar;
|
|
public AudioClip klipNyawaBerkurang;
|
|
|
|
[Header("PENGATURAN VOLUME SUARA")]
|
|
[Range(0f, 1f)] public float volumeSuaraUtama = 1f;
|
|
[Range(0f, 1f)] public float volumeBenarSalah = 0.4f;
|
|
|
|
[Header("DAFTAR SEMUA LEVEL")]
|
|
public GameObject[] semuaLevelHewan;
|
|
private int indexLevelSaatIni = 0;
|
|
|
|
[Header("FITUR PAUSE")]
|
|
public GameObject panelPause;
|
|
public GameObject ikonTombolPause;
|
|
|
|
[Header("EFEK VISUAL")]
|
|
public UnityEngine.UI.Image layarMerah;
|
|
|
|
// --- VARIABEL PRIVATE ---
|
|
private int sisaNyawa;
|
|
private float timer;
|
|
private bool waktuBerjalan = false;
|
|
private int potonganTerkumpul = 0;
|
|
private int tahapSaatIni = 1;
|
|
private bool bisaKlikNext = true;
|
|
private bool bolehKlikJawaban = false;
|
|
|
|
// 🔥 VARIABEL BARU: Untuk melacak suara dari tombol dan mengeremnya!
|
|
private AudioSource audioTombolAktif;
|
|
|
|
private void Awake() { instance = this; }
|
|
|
|
private void Start()
|
|
{
|
|
sisaNyawa = iconHati.Length;
|
|
bisaKlikNext = true;
|
|
waktuBerjalan = false;
|
|
|
|
if (teksWaktu != null) teksWaktu.gameObject.SetActive(false);
|
|
if (wadahNyawa != null) wadahNyawa.SetActive(false);
|
|
for (int i = 0; i < iconHati.Length; i++) { if (iconHati[i] != null) iconHati[i].SetActive(false); }
|
|
|
|
if (popUpBenar != null) popUpBenar.SetActive(false);
|
|
if (popUpSalah != null) popUpSalah.SetActive(false);
|
|
if (popupLanjut != null) popupLanjut.SetActive(false);
|
|
if (TombolNextGlobal != null) TombolNextGlobal.SetActive(false);
|
|
|
|
if (Panel_PilihLevel != null) Panel_PilihLevel.SetActive(true);
|
|
if (ikonTombolPause != null) ikonTombolPause.SetActive(false);
|
|
if (audioSource != null) audioSource.volume = volumeSuaraUtama;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (waktuBerjalan)
|
|
{
|
|
if (timer > 0)
|
|
{
|
|
timer -= Time.deltaTime;
|
|
if (teksWaktu != null) teksWaktu.text = "Waktu : " + Mathf.CeilToInt(timer).ToString();
|
|
|
|
if (timer <= 0)
|
|
{
|
|
timer = 0;
|
|
if (teksWaktu != null) teksWaktu.text = "Waktu : 0";
|
|
waktuBerjalan = false;
|
|
NyawaBerkurang();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void NyawaBerkurang()
|
|
{
|
|
sisaNyawa--;
|
|
UpdateNyawa();
|
|
|
|
if (audioSource != null && klipNyawaBerkurang != null)
|
|
audioSource.PlayOneShot(klipNyawaBerkurang, volumeBenarSalah);
|
|
|
|
if (layarMerah != null) StartCoroutine(ProsesKedipMerah());
|
|
|
|
if (sisaNyawa <= 0)
|
|
{
|
|
sisaNyawa = 0;
|
|
waktuBerjalan = false;
|
|
StartCoroutine(JedaSebelumReset());
|
|
}
|
|
else
|
|
{
|
|
ResetWaktu();
|
|
}
|
|
}
|
|
|
|
private void ResetWaktu()
|
|
{
|
|
timer = 20f;
|
|
waktuBerjalan = true;
|
|
potonganTerkumpul = 0;
|
|
|
|
if (teksWaktu != null) teksWaktu.gameObject.SetActive(true);
|
|
if (wadahNyawa != null) wadahNyawa.SetActive(true);
|
|
if (TombolNextGlobal != null) TombolNextGlobal.SetActive(false);
|
|
|
|
bolehKlikJawaban = false;
|
|
UpdateNyawa();
|
|
StartCoroutine(TungguSuaraSoalSelesai());
|
|
}
|
|
|
|
public void UpdateNyawa()
|
|
{
|
|
for (int i = 0; i < iconHati.Length; i++)
|
|
{
|
|
if (iconHati[i] != null) iconHati[i].SetActive(i < sisaNyawa);
|
|
}
|
|
}
|
|
|
|
// ========================================================
|
|
// 🔥 FUNGSI JAWABAN BENAR DENGAN SATPAM INTERNAL
|
|
// ========================================================
|
|
public void JawabanBenar(AudioSource tombolBenar = null)
|
|
{
|
|
// 🛑 SATPAM: Tolak mentah-mentah jika dipencet sebelum suara petunjuk selesai!
|
|
if (tahapSaatIni == 1 && !bolehKlikJawaban) return;
|
|
|
|
// Simpan AudioSource tombol ke variabel global agar nanti bisa di-rem saat klik Next
|
|
audioTombolAktif = tombolBenar;
|
|
|
|
waktuBerjalan = false;
|
|
if (TombolNextGlobal != null) TombolNextGlobal.SetActive(true);
|
|
if (popUpBenar != null) popUpBenar.SetActive(true);
|
|
|
|
if (audioSource != null) audioSource.Stop();
|
|
|
|
if (Panel_TebakSuara != null && Panel_TebakSuara.activeInHierarchy)
|
|
{
|
|
AudioSource suaraSoal = Panel_TebakSuara.GetComponent<AudioSource>();
|
|
if (suaraSoal != null) suaraSoal.Stop();
|
|
}
|
|
|
|
StartCoroutine(AntrianSuaraBenar(tombolBenar));
|
|
}
|
|
|
|
System.Collections.IEnumerator AntrianSuaraBenar(AudioSource suaraDariTombol)
|
|
{
|
|
if (audioSource != null && klipBenar != null)
|
|
{
|
|
audioSource.PlayOneShot(klipBenar, volumeBenarSalah);
|
|
yield return new WaitForSeconds(klipBenar.length);
|
|
}
|
|
|
|
if (audioSource != null && klipKalimatBenar != null)
|
|
{
|
|
audioSource.PlayOneShot(klipKalimatBenar, volumeSuaraUtama);
|
|
yield return new WaitForSeconds(klipKalimatBenar.length);
|
|
}
|
|
|
|
if (suaraDariTombol != null && tahapSaatIni == 1)
|
|
{
|
|
suaraDariTombol.loop = false;
|
|
suaraDariTombol.volume = volumeSuaraUtama;
|
|
suaraDariTombol.Play();
|
|
}
|
|
}
|
|
|
|
System.Collections.IEnumerator TungguSuaraSoalSelesai()
|
|
{
|
|
yield return new WaitForSeconds(0.1f);
|
|
|
|
if (Panel_TebakSuara != null && Panel_TebakSuara.activeInHierarchy)
|
|
{
|
|
AudioSource suaraSoal = Panel_TebakSuara.GetComponent<AudioSource>();
|
|
if (suaraSoal != null && suaraSoal.clip != null)
|
|
{
|
|
yield return new WaitForSeconds(suaraSoal.clip.length);
|
|
}
|
|
}
|
|
|
|
// KUNCI DIBUKA!
|
|
bolehKlikJawaban = true;
|
|
}
|
|
|
|
public bool CekApakahBolehKlik()
|
|
{
|
|
if (tahapSaatIni == 1) return bolehKlikJawaban;
|
|
else return true;
|
|
}
|
|
|
|
public void SatuPotonganBenar()
|
|
{
|
|
potonganTerkumpul++;
|
|
if (potonganTerkumpul >= 4)
|
|
{
|
|
JawabanBenar(null);
|
|
}
|
|
}
|
|
|
|
// ========================================================
|
|
// 🔥 FUNGSI JAWABAN SALAH DENGAN SATPAM INTERNAL
|
|
// ========================================================
|
|
public void JawabanSalah()
|
|
{
|
|
// 🛑 SATPAM: Tolak mentah-mentah jika dipencet sebelum suara petunjuk selesai!
|
|
if (tahapSaatIni == 1 && !bolehKlikJawaban) return;
|
|
|
|
if (popUpSalah != null)
|
|
{
|
|
popUpSalah.SetActive(true);
|
|
Invoke("SembunyikanPopUpSalah", 1.2f);
|
|
}
|
|
|
|
if (audioSource != null && klipSalah != null)
|
|
{
|
|
audioSource.Stop();
|
|
audioSource.PlayOneShot(klipSalah, volumeBenarSalah);
|
|
}
|
|
|
|
if (layarMerah != null) StartCoroutine(ProsesKedipMerah());
|
|
}
|
|
|
|
void SembunyikanPopUp() { if (popUpBenar != null) popUpBenar.SetActive(false); }
|
|
void SembunyikanPopUpSalah() { if (popUpSalah != null) popUpSalah.SetActive(false); }
|
|
|
|
public void KlikTombolNextGlobal()
|
|
{
|
|
if (!bisaKlikNext) return;
|
|
|
|
// ========================================================
|
|
// 🔥 REM DARURAT TOTAL: Matikan SEMUA suara saat pindah panel
|
|
// ========================================================
|
|
StopAllCoroutines();
|
|
if (audioSource != null) audioSource.Stop(); // Matikan suara GameManager
|
|
if (audioTombolAktif != null) audioTombolAktif.Stop(); // Matikan suara dari tombol (Biar gak bocor ke puzzle!)
|
|
|
|
if (Panel_TebakSuara != null)
|
|
{
|
|
AudioSource suaraSoal = Panel_TebakSuara.GetComponent<AudioSource>();
|
|
if (suaraSoal != null) suaraSoal.Stop();
|
|
}
|
|
|
|
if (TombolNextGlobal != null) TombolNextGlobal.SetActive(false);
|
|
if (popUpBenar != null) popUpBenar.SetActive(false);
|
|
|
|
if (tahapSaatIni == 1)
|
|
{
|
|
tahapSaatIni = 2;
|
|
Panel_TebakSuara.SetActive(false);
|
|
Panel_Puzzle.SetActive(true);
|
|
ResetWaktu();
|
|
}
|
|
else if (tahapSaatIni == 2)
|
|
{
|
|
tahapSaatIni = 3;
|
|
Panel_Puzzle.SetActive(false);
|
|
Panel_TebakHabitat.SetActive(true);
|
|
ResetWaktu();
|
|
}
|
|
else if (tahapSaatIni == 3)
|
|
{
|
|
waktuBerjalan = false;
|
|
if (Panel_TebakHabitat != null) Panel_TebakHabitat.SetActive(false);
|
|
if (Panel_Kemenangan != null) Panel_Kemenangan.SetActive(true);
|
|
|
|
if (wadahNyawa != null) wadahNyawa.SetActive(false);
|
|
if (teksWaktu != null) teksWaktu.gameObject.SetActive(false);
|
|
for (int i = 0; i < iconHati.Length; i++) { if (iconHati[i] != null) iconHati[i].SetActive(false); }
|
|
}
|
|
|
|
StartCoroutine(JedaKlik());
|
|
}
|
|
|
|
System.Collections.IEnumerator JedaKlik()
|
|
{
|
|
bisaKlikNext = false;
|
|
yield return new WaitForSeconds(1.0f);
|
|
bisaKlikNext = true;
|
|
}
|
|
|
|
public void KlikTombolLevel(GameObject levelTujuan)
|
|
{
|
|
for (int i = 0; i < semuaLevelHewan.Length; i++)
|
|
{
|
|
if (semuaLevelHewan[i] == levelTujuan)
|
|
{
|
|
indexLevelSaatIni = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (Panel_PilihLevel != null) Panel_PilihLevel.SetActive(false);
|
|
if (Panel_PilihLevel2 != null) Panel_PilihLevel2.SetActive(false);
|
|
if (ikonTombolPause != null) ikonTombolPause.SetActive(true);
|
|
|
|
levelTujuan.SetActive(true);
|
|
|
|
Transform cariSuara = levelTujuan.transform.Find("Panel_TebakSuara");
|
|
Transform cariPuzzle = levelTujuan.transform.Find("Panel_Puzzle");
|
|
Transform cariHabitat = levelTujuan.transform.Find("Panel_TebakHabitat");
|
|
Transform cariMenang = levelTujuan.transform.Find("Panel_Kemenangan");
|
|
|
|
if (cariSuara != null && cariPuzzle != null && cariHabitat != null && cariMenang != null)
|
|
{
|
|
Panel_TebakSuara = cariSuara.gameObject;
|
|
Panel_Puzzle = cariPuzzle.gameObject;
|
|
Panel_TebakHabitat = cariHabitat.gameObject;
|
|
Panel_Kemenangan = cariMenang.gameObject;
|
|
|
|
tahapSaatIni = 1;
|
|
Panel_TebakSuara.SetActive(true);
|
|
Panel_Puzzle.SetActive(false);
|
|
Panel_TebakHabitat.SetActive(false);
|
|
Panel_Kemenangan.SetActive(false);
|
|
|
|
ResetWaktu();
|
|
}
|
|
}
|
|
|
|
public void KlikLanjutLevelBerikutnya()
|
|
{
|
|
if (popupLanjut != null) popupLanjut.SetActive(false);
|
|
if (popUpBenar != null) popUpBenar.SetActive(false);
|
|
if (popUpSalah != null) popUpSalah.SetActive(false);
|
|
|
|
if (indexLevelSaatIni < semuaLevelHewan.Length && semuaLevelHewan[indexLevelSaatIni] != null)
|
|
{
|
|
semuaLevelHewan[indexLevelSaatIni].SetActive(false);
|
|
}
|
|
|
|
indexLevelSaatIni++;
|
|
|
|
if (indexLevelSaatIni < semuaLevelHewan.Length && semuaLevelHewan[indexLevelSaatIni] != null)
|
|
{
|
|
KlikTombolLevel(semuaLevelHewan[indexLevelSaatIni]);
|
|
}
|
|
else
|
|
{
|
|
Debug.Log("Level Habis! Kembali ke Home.");
|
|
KlikKeHome();
|
|
}
|
|
}
|
|
|
|
public void KlikKeHome()
|
|
{
|
|
waktuBerjalan = false;
|
|
if (popUpBenar != null) popUpBenar.SetActive(false);
|
|
if (popUpSalah != null) popUpSalah.SetActive(false);
|
|
if (popupLanjut != null) popupLanjut.SetActive(false);
|
|
|
|
if (semuaLevelHewan.Length > 0 && indexLevelSaatIni < semuaLevelHewan.Length && semuaLevelHewan[indexLevelSaatIni] != null)
|
|
{
|
|
semuaLevelHewan[indexLevelSaatIni].SetActive(false);
|
|
}
|
|
|
|
if (teksWaktu != null) teksWaktu.gameObject.SetActive(false);
|
|
if (wadahNyawa != null) wadahNyawa.SetActive(false);
|
|
for (int i = 0; i < iconHati.Length; i++) { if (iconHati[i] != null) iconHati[i].SetActive(false); }
|
|
|
|
if (Panel_PilihLevel != null) Panel_PilihLevel.SetActive(true);
|
|
if (ikonTombolPause != null) ikonTombolPause.SetActive(false);
|
|
}
|
|
|
|
public void KembaliKeMainMenu() { SceneManager.LoadScene("Main_Menu"); }
|
|
|
|
public void TombolPauseDitekan()
|
|
{
|
|
if (panelPause != null) panelPause.SetActive(true);
|
|
Time.timeScale = 0f;
|
|
}
|
|
|
|
public void TombolLanjutDitekan()
|
|
{
|
|
if (panelPause != null) panelPause.SetActive(false);
|
|
Time.timeScale = 1f;
|
|
}
|
|
|
|
public void TombolHomeDitekan()
|
|
{
|
|
Time.timeScale = 1f;
|
|
SceneManager.LoadScene("Main_Menu");
|
|
}
|
|
|
|
System.Collections.IEnumerator ProcessKedipMerah() { yield return null; }
|
|
System.Collections.IEnumerator ProsesKedipMerah()
|
|
{
|
|
layarMerah.color = new Color(1f, 0f, 0f, 0.4f);
|
|
yield return new WaitForSeconds(0.05f);
|
|
float alpha = 0.4f;
|
|
while (alpha > 0f)
|
|
{
|
|
alpha -= Time.deltaTime * 1.5f;
|
|
layarMerah.color = new Color(1f, 0f, 0f, alpha);
|
|
yield return null;
|
|
}
|
|
layarMerah.color = new Color(1f, 0f, 0f, 0f);
|
|
}
|
|
|
|
System.Collections.IEnumerator JedaSebelumReset()
|
|
{
|
|
yield return new WaitForSecondsRealtime(1.2f);
|
|
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
|
|
}
|
|
} |