Ekosistem_Game/Assets/Script/TarikGarisUI.cs

122 lines
4.4 KiB
C#

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class TarikGarisUI : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
[Header("Identitas & Suara (Edukasi)")]
public string idGaris;
public AudioClip kasetNamaObjek; // Contoh: Suara "Paus"
public AudioClip kasetNamaTujuan; // Contoh: Suara "Ekosistem Laut"
[Header("Pasangan Jawaban Benar")]
public RectTransform targetBenar;
private GameObject objekGaris;
private RectTransform rectGaris;
private bool sudahTerkoneksi = false;
private Canvas canvasUtama;
void Start()
{
canvasUtama = GetComponentInParent<Canvas>();
objekGaris = new GameObject("Tali_" + gameObject.name);
objekGaris.transform.SetParent(this.transform, false);
Image img = objekGaris.AddComponent<Image>();
img.color = new Color(1f, 0.5f, 0f);
img.raycastTarget = false;
rectGaris = objekGaris.GetComponent<RectTransform>();
rectGaris.pivot = new Vector2(0, 0.5f);
rectGaris.sizeDelta = new Vector2(0, 15f);
rectGaris.anchoredPosition = Vector2.zero;
objekGaris.SetActive(false);
}
public void OnBeginDrag(PointerEventData eventData)
{
if (sudahTerkoneksi) return;
// ========================================================
// REVISI SISTEM SUARA: GANTI KASET OTOMATIS (ANTI NABRAK)
// ========================================================
ManagerMencocokan managerGame = FindObjectOfType<ManagerMencocokan>();
if (managerGame != null && kasetNamaObjek != null)
{
// 1. Paksa berhenti suara yang sedang ngoceh (baik itu suara narator, hewan lain, atau penjelasan)
managerGame.speakerGame.Stop();
// 2. Masukkan kaset nama hewan yang baru dipencet
managerGame.speakerGame.clip = kasetNamaObjek;
// 3. Mainkan kasetnya
managerGame.speakerGame.Play();
}
objekGaris.SetActive(true);
objekGaris.transform.SetAsLastSibling();
}
public void OnDrag(PointerEventData eventData)
{
if (sudahTerkoneksi) return;
Vector3 posisiAwal = transform.position;
Vector3 posisiJari = eventData.position;
float jarak = Vector3.Distance(posisiAwal, posisiJari);
Vector3 arah = posisiJari - posisiAwal;
float sudut = Mathf.Atan2(arah.y, arah.x) * Mathf.Rad2Deg;
float jarakAntiMelar = jarak / canvasUtama.scaleFactor;
rectGaris.sizeDelta = new Vector2(jarakAntiMelar, 15f);
rectGaris.rotation = Quaternion.Euler(0, 0, sudut);
}
public void OnEndDrag(PointerEventData eventData)
{
if (sudahTerkoneksi) return;
if (targetBenar == null) return;
Vector2 posisiTargetLayar = RectTransformUtility.WorldToScreenPoint(eventData.pressEventCamera, targetBenar.position);
float jarakKeTarget = Vector2.Distance(eventData.position, posisiTargetLayar);
if (jarakKeTarget < 200f)
{
Vector3 posisiAwal = transform.position;
Vector3 posisiTarget = targetBenar.position;
float jarakPas = Vector3.Distance(posisiAwal, posisiTarget);
Vector3 arahPas = posisiTarget - posisiAwal;
float sudutPas = Mathf.Atan2(arahPas.y, arahPas.x) * Mathf.Rad2Deg;
float jarakPasAntiMelar = jarakPas / canvasUtama.scaleFactor;
rectGaris.sizeDelta = new Vector2(jarakPasAntiMelar, 15f);
rectGaris.rotation = Quaternion.Euler(0, 0, sudutPas);
sudahTerkoneksi = true;
// ========================================================
// REVISI: LAPOR KE MANAGER SAMBIL KIRIM KASET EKOSISTEM
// ========================================================
ManagerMencocokan managerGame = FindObjectOfType<ManagerMencocokan>();
if (managerGame != null)
{
managerGame.GarisTersambung(kasetNamaTujuan);
}
}
else
{
objekGaris.SetActive(false);
rectGaris.sizeDelta = new Vector2(0, 15f);
ManagerMencocokan managerGame = FindObjectOfType<ManagerMencocokan>();
if (managerGame != null) managerGame.JawabanSalah();
}
}
}