122 lines
4.4 KiB
C#
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();
|
|
}
|
|
}
|
|
} |