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(); objekGaris = new GameObject("Tali_" + gameObject.name); objekGaris.transform.SetParent(this.transform, false); Image img = objekGaris.AddComponent(); img.color = new Color(1f, 0.5f, 0f); img.raycastTarget = false; rectGaris = objekGaris.GetComponent(); 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(); 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(); if (managerGame != null) { managerGame.GarisTersambung(kasetNamaTujuan); } } else { objekGaris.SetActive(false); rectGaris.sizeDelta = new Vector2(0, 15f); ManagerMencocokan managerGame = FindObjectOfType(); if (managerGame != null) managerGame.JawabanSalah(); } } }