Raihan_TugasAkhir/Assets/Script/buah/GameManagerBuah.cs

427 lines
13 KiB
C#

using UnityEngine;
using UnityEngine.UI;
using TMPro; // Untuk teks tajam
using UnityEngine.SceneManagement;
public class GameManagerBuah : MonoBehaviour
{
public static GameManagerBuah instance;
[Header("PANEL LEVEL")]
public GameObject Panel_TebakBentuk;
public GameObject Panel_Puzzle;
public GameObject Panel_Manfaat;
public GameObject Panel_PilihLevel; // Menu daftar buah
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 popUpLanjutLevel;
[Header("MANFAAT BUAH")]
public TMP_Text teksPapanManfaat;
[TextArea] public string isiTeksManfaat;
public AudioClip suaraManfaat;
[Header("AUDIO")]
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; // 1 = 100% (Paling Keras)
[Range(0f, 1f)] public float volumeBenarSalah = 0.4f; // 0.4 = 40% (Lebih pelan)
[Header("DAFTAR SEMUA LEVEL (UNTUK TOMBOL LANJUT)")]
public GameObject[] semuaLevelBuah; // Keranjang untuk menyimpan urutan level 1-20
private int indexLevelSaatIni = 0; // Mengingat sekarang lagi di level berapa
[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; // Pengunci tombol anti double-click
private void Awake() { instance = this; }
private void Start()
{
sisaNyawa = iconHati.Length;
bisaKlikNext = true;
waktuBerjalan = false;
// 1. Matikan Semua UI Global
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);
}
// 2. Matikan Semua Pop Up & Tombol
if (popUpBenar != null) popUpBenar.SetActive(false);
if (popUpSalah != null) popUpSalah.SetActive(false);
if (popUpLanjutLevel != null) popUpLanjutLevel.SetActive(false);
if (TombolNextGlobal != null) TombolNextGlobal.SetActive(false);
// 3. Pastikan Game Dimulai dari Menu Pilih Level
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();
}
}
}
}
private void NyawaBerkurang()
{
sisaNyawa--;
UpdateNyawa();
if (audioSource != null && klipNyawaBerkurang != null)
{
audioSource.PlayOneShot(klipNyawaBerkurang, volumeBenarSalah);
}
if (layarMerah != null)
StartCoroutine(ProsesKedipMerah());
if (sisaNyawa <= 0)
{
waktuBerjalan = false;
StartCoroutine(JedaSebelumReset());
}
else
{
ResetWaktu();
}
}
private void ResetWaktu()
{
timer = 20f;
waktuBerjalan = true;
potonganTerkumpul = 0; // Mengembalikan hitungan puzzle ke 0 tiap tahap baru mulai
if (teksWaktu != null) teksWaktu.gameObject.SetActive(true);
if (wadahNyawa != null) wadahNyawa.SetActive(true);
// ================================================================
// 🔥 BARIS KUNCI: Sembunyikan tombol panah next tiap masuk tahap baru!
// ================================================================
if (TombolNextGlobal != null) TombolNextGlobal.SetActive(false);
// ================================================================
UpdateNyawa();
}
public void UpdateNyawa()
{
for (int i = 0; i < iconHati.Length; i++)
{
if (iconHati[i] != null) iconHati[i].SetActive(i < sisaNyawa);
}
}
public void JawabanBenar()
{
waktuBerjalan = false;
if (TombolNextGlobal != null) TombolNextGlobal.SetActive(true);
if (popUpBenar != null) popUpBenar.SetActive(true);
float jedaSuara = 0.5f;
if (audioSource != null)
{
audioSource.Stop();
if (klipBenar != null) audioSource.PlayOneShot(klipBenar, volumeBenarSalah);
if (klipKalimatBenar != null)
{
audioSource.PlayOneShot(klipKalimatBenar, volumeSuaraUtama);
jedaSuara = klipKalimatBenar.length;
}
}
AudioSource suaraObjek = null;
if (Panel_TebakBentuk != null && Panel_TebakBentuk.activeInHierarchy)
{
suaraObjek = Panel_TebakBentuk.GetComponent<AudioSource>();
}
if (suaraObjek != null)
{
suaraObjek.Stop();
suaraObjek.PlayDelayed(jedaSuara);
}
}
public void JawabanSalah()
{
if (popUpSalah != null)
{
popUpSalah.SetActive(true);
Invoke("SembunyikanPopUpSalah", 1.2f);
}
if (audioSource != null && klipSalah != null)
{
audioSource.Stop();
audioSource.PlayOneShot(klipSalah, volumeBenarSalah);
}
// Layar merah dimatikan biar muncul pas nyawa kurang aja
// if (layarMerah != null) StartCoroutine(ProsesKedipMerah());
}
// ==========================================
// FUNGSI SATU POTONGAN BENAR (Kring & Pop-Up)
// ==========================================
public void SatuPotonganBenar()
{
potonganTerkumpul++;
// JIKA BARU PASANG 1, 2, atau 3 KEPING: Bunyikan Kring saja!
if (potonganTerkumpul < 4)
{
if (audioSource != null && klipBenar != null)
audioSource.PlayOneShot(klipBenar, volumeBenarSalah);
}
// JIKA PASANG KEPING KE-4 (LENGKAP): Panggil jawaban benar (Otomatis Pop-Up & Suara Full)
if (potonganTerkumpul >= 4)
{
JawabanBenar(); // Dibiarkan kosong tanpa null agar tidak error di Buah
}
}
private void SembunyikanPopUpSalah() { if (popUpSalah != null) popUpSalah.SetActive(false); }
public void KlikTombolNext()
{
if (!bisaKlikNext) return;
if (popUpBenar != null) popUpBenar.SetActive(false);
if (tahapSaatIni == 1) // Pindah ke Puzzle
{
tahapSaatIni = 2;
Panel_TebakBentuk.SetActive(false);
Panel_Puzzle.SetActive(true);
ResetWaktu(); // Di dalam sini tombol Next otomatis disembunyikan sekarang!
}
else if (tahapSaatIni == 2) // Pindah ke Manfaat
{
tahapSaatIni = 3;
Panel_Puzzle.SetActive(false);
Panel_Manfaat.SetActive(true);
waktuBerjalan = false;
teksWaktu.gameObject.SetActive(false);
wadahNyawa.SetActive(false);
for (int i = 0; i < iconHati.Length; i++)
{
if (iconHati[i] != null) iconHati[i].SetActive(false);
}
}
else if (tahapSaatIni == 3) // Muncul PopUp Lanjut
{
if (popUpLanjutLevel != null) popUpLanjutLevel.SetActive(true);
TombolNextGlobal.SetActive(false);
}
StartCoroutine(JedaKlik());
}
System.Collections.IEnumerator JedaKlik()
{
bisaKlikNext = false;
yield return new WaitForSeconds(1.0f);
bisaKlikNext = true;
}
public void KlikKeHome()
{
waktuBerjalan = false;
if (popUpLanjutLevel != null) popUpLanjutLevel.SetActive(false);
if (popUpBenar != null) popUpBenar.SetActive(false);
if (popUpSalah != null) popUpSalah.SetActive(false);
if (Panel_TebakBentuk != null)
{
Panel_TebakBentuk.transform.parent.gameObject.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);
}
public void KlikTombolLevel(GameObject levelTujuan)
{
for (int i = 0; i < semuaLevelBuah.Length; i++)
{
if (semuaLevelBuah[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 cariTebak = levelTujuan.transform.Find("Panel_TebakBentuk");
Transform cariPuzzle = levelTujuan.transform.Find("Panel_Puzzle");
Transform cariManfaat = levelTujuan.transform.Find("Panel_Manfaat");
if (cariTebak == null) Debug.LogError("GAGAL KETEMU: Nama 'Panel_TebakBentuk' salah ketik di " + levelTujuan.name);
if (cariPuzzle == null) Debug.LogError("GAGAL KETEMU: Nama 'Panel_Puzzle' salah ketik di " + levelTujuan.name);
if (cariManfaat == null) Debug.LogError("GAGAL KETEMU: Nama 'Panel_Manfaat' salah ketik di " + levelTujuan.name);
if (cariTebak != null && cariPuzzle != null && cariManfaat != null)
{
Panel_TebakBentuk = cariTebak.gameObject;
Panel_Puzzle = cariPuzzle.gameObject;
Panel_Manfaat = cariManfaat.gameObject;
tahapSaatIni = 1;
Panel_TebakBentuk.SetActive(true);
Panel_Puzzle.SetActive(false);
Panel_Manfaat.SetActive(false);
ResetWaktu();
}
}
public void KlikLanjutLevelBerikutnya()
{
if (popUpLanjutLevel != null) popUpLanjutLevel.SetActive(false);
if (semuaLevelBuah.Length > 0 && semuaLevelBuah[indexLevelSaatIni] != null)
{
semuaLevelBuah[indexLevelSaatIni].SetActive(false);
}
indexLevelSaatIni++;
if (indexLevelSaatIni < semuaLevelBuah.Length && semuaLevelBuah[indexLevelSaatIni] != null)
{
KlikTombolLevel(semuaLevelBuah[indexLevelSaatIni]);
}
else
{
Debug.Log("Level Habis! Kembali ke Home.");
KlikKeHome();
}
}
public void PutarSuaraManfaat()
{
if (audioSource != null && suaraManfaat != null)
{
audioSource.Stop();
audioSource.PlayOneShot(suaraManfaat);
}
}
public void KembaliKeMainMenu()
{
Debug.Log("Pindah ke Main Menu...");
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;
KembaliKeMainMenu();
}
private void KalahAtauReset()
{
Debug.Log("Game Over! Kembali ke Menu Utama...");
Time.timeScale = 1f;
SceneManager.LoadScene("Main_Menu");
}
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);
}
}