using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class DragItem : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler { public VegetableData vData; [HideInInspector] public Transform parentAfterDrag; private CanvasGroup canvasGroup; private RectTransform rectTransform; private void Start() { // Gunakan AddComponent jika belum ada, atau ambil yang sudah ada di prefab canvasGroup = GetComponent(); if (canvasGroup == null) canvasGroup = gameObject.AddComponent(); rectTransform = GetComponent(); if (vData != null) { GetComponent().sprite = vData.fullColorSprite; rectTransform.localEulerAngles = new Vector3(0, 0, vData.rotasiManual); rectTransform.sizeDelta = vData.ukuranCustom; } } public void OnBeginDrag(PointerEventData eventData) { // SATPAM: Cek apakah AudioSource di GameManager lagi bunyi (VO sedang jalan) AudioSource audio = GameManager.instance.GetComponent(); if (audio != null && audio.isPlaying) { // Batalkan drag secara total eventData.pointerDrag = null; return; } // Simpan parent asli (ChoiceArea) agar bisa pulang kalau salah drop parentAfterDrag = transform.parent; // Pindahkan ke root Canvas agar saat ditarik berada di paling depan transform.SetParent(transform.root); canvasGroup.blocksRaycasts = false; } public void OnDrag(PointerEventData eventData) { // Objek mengikuti posisi mouse/jari transform.position = Input.mousePosition; } public void OnEndDrag(PointerEventData eventData) { canvasGroup.blocksRaycasts = true; GameObject dropObj = eventData.pointerCurrentRaycast.gameObject; // Cek apakah dilepas di atas objek yang punya script DropZone if (dropObj != null && dropObj.GetComponent() != null) { DropZone zone = dropObj.GetComponent(); float distance = Vector2.Distance(rectTransform.position, dropObj.transform.position); // LOGIKA JIKA BENAR (Sayur cocok dan jarak dekat) if (zone.vData == vData && distance < 150f) { // 1. Tempelkan sayur ke dalam objek siluet (Target) transform.SetParent(dropObj.transform); // 2. Paksa posisi ke tengah siluet agar presisi rectTransform.anchorMin = new Vector2(0.5f, 0.5f); rectTransform.anchorMax = new Vector2(0.5f, 0.5f); rectTransform.pivot = new Vector2(0.5f, 0.5f); rectTransform.anchoredPosition = Vector2.zero; // Samakan rotasi dan ukuran dengan tempatnya rectTransform.rotation = dropObj.GetComponent().rotation; rectTransform.sizeDelta = dropObj.GetComponent().sizeDelta; // 3. Putar Voice Over Sayur if (vData.suaraVO != null) { GameManager.instance.PutarVO(vData.suaraVO); } // 4. Tambah skor dan matikan script agar tidak bisa ditarik lagi GameManager.instance.TambahSkor(); this.enabled = false; return; } else { // Munculkan popup salah jika siluet tidak cocok GameManager.instance.MunculkanWrong(); } } else { // Munculkan popup salah jika dilepas di area kosong if (dropObj != null) GameManager.instance.MunculkanWrong(); } // JIKA SALAH: Kembalikan sayur ke kotak pilihan (ChoiceArea) transform.SetParent(parentAfterDrag); rectTransform.anchoredPosition = Vector2.zero; } }