using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; // Wajib ada using System.Collections; public class MenuSlider : MonoBehaviour { [Header("Hubungkan UI di Sini")] public ScrollRect scrollRect; // Tarik Object Card_Window public RectTransform contentHolder; // Tarik Object Content_Holder [Header("Setting")] public float snapSpeed = 10f; // Kecepatan geser kartu // Variabel internal (Jangan diubah manual) private float[] cardPositions; private int currentIndex = 0; private float targetX = 0; private bool isInitialized = false; void Start() { // Delay sebentar biar Layout Group selesai menghitung ukuran Invoke("InitializePositions", 0.1f); } // Hitung posisi koordinat setiap kartu void InitializePositions() { int childCount = contentHolder.childCount; cardPositions = new float[childCount]; // Ambil lebar kartu pertama + spasi float cardWidth = contentHolder.GetChild(0).GetComponent().rect.width; float spacing = contentHolder.GetComponent().spacing; float step = cardWidth + spacing; for (int i = 0; i < childCount; i++) { // Posisi X selalu minus karena geser ke kiri cardPositions[i] = -(i * step); } isInitialized = true; } void Update() { if (!isInitialized) return; // Logika Geser Halus (Lerp) Vector2 currentPos = contentHolder.anchoredPosition; float newX = Mathf.Lerp(currentPos.x, targetX, Time.deltaTime * snapSpeed); contentHolder.anchoredPosition = new Vector2(newX, currentPos.y); } // --- FUNGSI TOMBOL NEXT --- public void NextCard() { // 1. Bunyi SFX if (Audio.instance != null) Audio.instance.PlayButtonSound(); // 2. Animasi Tombol GameObject tombol = EventSystem.current.currentSelectedGameObject; if (tombol != null) { StartCoroutine(AnimasiDanPindah(tombol.transform, true)); } else { MoveLogic(true); } } // --- FUNGSI TOMBOL PREV --- public void PrevCard() { // 1. Bunyi SFX if (Audio.instance != null) Audio.instance.PlayButtonSound(); // 2. Animasi Tombol GameObject tombol = EventSystem.current.currentSelectedGameObject; if (tombol != null) { StartCoroutine(AnimasiDanPindah(tombol.transform, false)); } else { MoveLogic(false); } } // Animasi Tombol Next/Prev (Squash -> Pindah Logic -> Stretch) IEnumerator AnimasiDanPindah(Transform tombol, bool isNext) { float timer = 0; float durasi = 0.1f; // FASE 1: SQUASH (Ditekan) while (timer < durasi) { timer += Time.deltaTime; float t = timer / durasi; float scaleX = Mathf.Lerp(1f, 1.2f, t); float scaleY = Mathf.Lerp(1f, 0.8f, t); tombol.localScale = new Vector3(scaleX, scaleY, 1f); yield return null; } // -- PINDAHKAN KARTU SEKARANG (Biar responsif) -- MoveLogic(isNext); timer = 0; // FASE 2: STRETCH (Membal Balik) while (timer < durasi) { timer += Time.deltaTime; float t = timer / durasi; float scaleX = Mathf.Lerp(1.2f, 1f, t); // Balik ke 1 float scaleY = Mathf.Lerp(0.8f, 1f, t); // Balik ke 1 tombol.localScale = new Vector3(scaleX, scaleY, 1f); yield return null; } // Pastikan normal tombol.localScale = Vector3.one; } // Logika Matematika Geser Index void MoveLogic(bool isNext) { if (isNext) { if (currentIndex < cardPositions.Length - 1) { currentIndex++; targetX = cardPositions[currentIndex]; } } else { if (currentIndex > 0) { currentIndex--; targetX = cardPositions[currentIndex]; } } } }