MIF_E31230979/Assets/Scripts/CocokGambar/DragItem.cs

107 lines
4.0 KiB
C#

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<CanvasGroup>();
if (canvasGroup == null) canvasGroup = gameObject.AddComponent<CanvasGroup>();
rectTransform = GetComponent<RectTransform>();
if (vData != null)
{
GetComponent<Image>().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<AudioSource>();
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<DropZone>() != null)
{
DropZone zone = dropObj.GetComponent<DropZone>();
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<RectTransform>().rotation;
rectTransform.sizeDelta = dropObj.GetComponent<RectTransform>().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;
}
}