427 lines
13 KiB
C#
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);
|
|
}
|
|
} |