107 lines
4.0 KiB
C#
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;
|
|
}
|
|
} |