125 lines
3.6 KiB
C#
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;
|
|
}
|
|
} |