using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class SlideGesture : MonoBehaviour { [Header("Slides")] public GameObject[] slides; [Header("Dot Indicator (opsional)")] public Image[] dots; public Color dotActive = Color.white; public Color dotInactive = new Color(1, 1, 1, 0.35f); [Header("Swipe Setting")] public float swipeThreshold = 50f; private int currentIndex = 0; private float touchStartY = 0f; private bool isSwiping = false; void Start() { ShowSlide(0); } void Update() { // Hanya proses swipe kalau panel ini aktif if (!gameObject.activeInHierarchy) return; // Touch if (Input.touchCount > 0) { Touch t = Input.GetTouch(0); // Abaikan kalau touch kena button if (EventSystem.current.IsPointerOverGameObject(t.fingerId)) { // Cek apakah yang di-touch adalah slide area, bukan button // Kalau kena UI selain slide, biarkan if (IsTouchOnButton(t.fingerId)) { isSwiping = false; return; } } if (t.phase == TouchPhase.Began) { touchStartY = t.position.y; isSwiping = true; } else if (t.phase == TouchPhase.Ended && isSwiping) { float diff = touchStartY - t.position.y; ProcessSwipe(diff); isSwiping = false; } } // Mouse (Editor) if (Input.GetMouseButtonDown(0)) { // Abaikan kalau klik button if (!IsPointerOnButton()) { touchStartY = Input.mousePosition.y; isSwiping = true; } } if (Input.GetMouseButtonUp(0) && isSwiping) { float diff = touchStartY - Input.mousePosition.y; ProcessSwipe(diff); isSwiping = false; } } void ProcessSwipe(float diff) { if (diff > swipeThreshold && currentIndex < slides.Length - 1) ShowSlide(currentIndex + 1); else if (diff < -swipeThreshold && currentIndex > 0) ShowSlide(currentIndex - 1); } // Cek apakah pointer sedang di atas Button bool IsPointerOnButton() { var results = new System.Collections.Generic.List(); var ped = new PointerEventData(EventSystem.current) { position = Input.mousePosition }; EventSystem.current.RaycastAll(ped, results); foreach (var r in results) if (r.gameObject.GetComponent