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