MIF_E31230101/Assets/Script Manager/DragDropItem.cs

125 lines
3.6 KiB
C#

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using System.Collections;
public class DragDropItem : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
public int itemID;
public float snapDistance = 100f;
private RectTransform rectTransform;
private CanvasGroup canvasGroup;
private Transform originalCardBackground;
private Vector3 startWorldPos;
private DragDropManager manager;
private bool isLocked = false;
public void Setup(Sprite sp, int id, DragDropManager mgr)
{
rectTransform = GetComponent<RectTransform>();
canvasGroup = GetComponent<CanvasGroup>();
if (canvasGroup == null) canvasGroup = gameObject.AddComponent<CanvasGroup>();
GetComponent<Image>().sprite = sp;
itemID = id;
manager = mgr;
}
public void OnBeginDrag(PointerEventData eventData)
{
if (isLocked) return;
originalCardBackground = transform.parent;
startWorldPos = transform.position;
transform.SetParent(transform.root);
transform.SetAsLastSibling();
canvasGroup.blocksRaycasts = false;
canvasGroup.alpha = 0.8f;
}
public void OnDrag(PointerEventData eventData)
{
if (isLocked) return;
transform.position = eventData.position;
}
public void OnEndDrag(PointerEventData eventData)
{
if (isLocked) return;
canvasGroup.blocksRaycasts = true;
canvasGroup.alpha = 1f;
ShadowSlot[] slots = FindObjectsOfType<ShadowSlot>();
ShadowSlot closest = null;
float minDist = snapDistance;
foreach (ShadowSlot s in slots)
{
float d = Vector2.Distance(transform.position, s.transform.position);
if (d < minDist && s.slotID == itemID && !s.isOccupied)
{
minDist = d;
closest = s;
}
}
if (closest != null) StartCoroutine(CorrectAnim(closest));
else StartCoroutine(WrongAnim());
}
// --- FITUR BARU: ANIMASI KETIKA BENAR ---
IEnumerator CorrectAnim(ShadowSlot s)
{
isLocked = true;
transform.position = s.transform.position;
// Animasi "Pulse" (Membesar sedikit lalu pas)
float t = 0;
while (t < 1)
{
t += Time.deltaTime * 8;
transform.localScale = Vector3.Lerp(Vector3.one, new Vector3(1.2f, 1.2f, 1.2f), t);
yield return null;
}
s.CompleteSlot();
manager.CheckWin();
Destroy(gameObject);
}
// --- FITUR BARU: ANIMASI SALAH + HUKUMAN ---
IEnumerator WrongAnim()
{
isLocked = true;
// Panggil Hukuman Waktu dari Manager!
manager.BerikanHukumanWaktu();
// Animasi "Shake" (Bergetar Kiri-Kanan tanda salah)
Vector3 curPos = transform.position;
for (int i = 0; i < 4; i++)
{
transform.position = curPos + new Vector3((i % 2 == 0 ? 15f : -15f), 0, 0);
yield return new WaitForSeconds(0.04f);
}
transform.position = curPos; // Kembalikan ke titik asalnya sebelum terbang balik
// Meluncur balik ke bingkai aslinya
float time = 0;
while (time < 1)
{
time += Time.deltaTime * 8;
transform.position = Vector3.Lerp(curPos, startWorldPos, time);
yield return null;
}
transform.SetParent(originalCardBackground);
rectTransform.anchoredPosition = Vector2.zero;
isLocked = false;
}
}