346 lines
12 KiB
C#
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);
|
|
}
|
|
} |