MIF_E31230650/Assets/Resources/Script/DragItem.cs

107 lines
3.1 KiB
C#

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class DragItem : MonoBehaviour,
IBeginDragHandler, IDragHandler, IEndDragHandler
{
[HideInInspector] public int indexHewan;
[HideInInspector] public PuzzleManager puzzleManager;
[HideInInspector] public RectTransform dropZoneRect;
private RectTransform rectTransform;
private CanvasGroup canvasGroup;
private Vector2 posisiAsal;
private Transform parentAsal;
private Canvas canvas;
private bool sudahBenar = false;
private bool sedangDiproses = false; // ✏️ TAMBAH: cegah double trigger
void Awake()
{
rectTransform = GetComponent<RectTransform>();
canvas = GetComponentInParent<Canvas>();
canvasGroup = GetComponent<CanvasGroup>();
if (canvasGroup == null)
canvasGroup = gameObject.AddComponent<CanvasGroup>();
}
public void ResetItem()
{
sudahBenar = false;
sedangDiproses = false;
}
public void SetBenar()
{
sudahBenar = true;
}
public void OnBeginDrag(PointerEventData eventData)
{
if (sudahBenar || sedangDiproses) return;
posisiAsal = rectTransform.anchoredPosition;
parentAsal = transform.parent;
transform.SetParent(canvas.transform, true);
transform.SetAsLastSibling();
canvasGroup.blocksRaycasts = false;
canvasGroup.alpha = 0.85f;
}
public void OnDrag(PointerEventData eventData)
{
if (sudahBenar || sedangDiproses) return;
rectTransform.anchoredPosition += eventData.delta / canvas.scaleFactor;
}
public void OnEndDrag(PointerEventData eventData)
{
canvasGroup.alpha = 1f;
canvasGroup.blocksRaycasts = true;
if (sudahBenar || sedangDiproses) return;
if (dropZoneRect != null && IsOverDropZone())
{
// ✏️ TAMBAH: set sedangDiproses dulu biar tidak double trigger
sedangDiproses = true;
puzzleManager.CekJawaban(this);
}
else
{
// ✏️ UBAH: selalu balik ke posisi asal kalau tidak di dropzone
KembaliKePosisiAsal();
}
}
// ✏️ TAMBAH: fungsi public biar bisa dipanggil dari PuzzleManager
public void KembaliKePosisiAsal()
{
if (parentAsal != null)
transform.SetParent(parentAsal, false);
rectTransform.anchoredPosition = posisiAsal;
sedangDiproses = false;
}
bool IsOverDropZone()
{
Vector3[] itemCorners = new Vector3[4];
Vector3[] dropCorners = new Vector3[4];
rectTransform.GetWorldCorners(itemCorners);
dropZoneRect.GetWorldCorners(dropCorners);
Rect itemRect = new Rect(
itemCorners[0].x, itemCorners[0].y,
itemCorners[2].x - itemCorners[0].x,
itemCorners[2].y - itemCorners[0].y);
Rect dropRect = new Rect(
dropCorners[0].x, dropCorners[0].y,
dropCorners[2].x - dropCorners[0].x,
dropCorners[2].y - dropCorners[0].y);
return itemRect.Overlaps(dropRect);
}
}