93 lines
2.7 KiB
C#
93 lines
2.7 KiB
C#
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using UnityEngine.EventSystems;
|
|
using UnityEngine.SceneManagement;
|
|
using System.Collections;
|
|
|
|
public class MasterButton : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
|
|
{
|
|
[Header("Navigasi Scene")]
|
|
public bool aktifkanPindahScene = true;
|
|
public string namaSceneTujuan;
|
|
|
|
[Header("Audio SFX")]
|
|
public AudioSource sfxSource;
|
|
public AudioClip suaraKlik;
|
|
|
|
[Header("Animasi Idle (Denyut)")]
|
|
public bool gunakanDenyut = true; // Bisa dicentang atau tidak
|
|
public float kekuatanDenyut = 0.05f;
|
|
public float kecepatanDenyut = 3f;
|
|
|
|
[Header("Efek Kenyal (Saat Klik)")]
|
|
public bool gunakanEfekKenyal = true;
|
|
public float kekuatanKenyal = 0.2f;
|
|
public float kecepatanKenyal = 15f;
|
|
|
|
private Vector3 skalaAwal;
|
|
private Coroutine coroutineKenyal;
|
|
|
|
void Start()
|
|
{
|
|
skalaAwal = transform.localScale;
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
// Efek denyut hanya jalan kalau dicentang dan tidak lagi animasi klik
|
|
if (gunakanDenyut && coroutineKenyal == null)
|
|
{
|
|
float pulse = Mathf.Sin(Time.time * kecepatanDenyut) * kekuatanDenyut;
|
|
transform.localScale = skalaAwal + new Vector3(pulse, pulse, 0);
|
|
}
|
|
}
|
|
|
|
public void OnPointerDown(PointerEventData eventData)
|
|
{
|
|
// Ganti bagian bunyiin suara jadi ini:
|
|
if (AudioManager.instance != null && suaraKlik != null)
|
|
{
|
|
AudioManager.instance.PlayClick(suaraKlik);
|
|
}
|
|
else if (sfxSource != null && suaraKlik != null)
|
|
{
|
|
// Cadangan kalau AudioManager gak sengaja kehapus
|
|
sfxSource.PlayOneShot(suaraKlik);
|
|
}
|
|
|
|
// Animasi kenyal pas ditekan
|
|
if (gunakanEfekKenyal)
|
|
{
|
|
if (coroutineKenyal != null) StopCoroutine(coroutineKenyal);
|
|
coroutineKenyal = StartCoroutine(AnimasiKenyal());
|
|
}
|
|
}
|
|
|
|
public void OnPointerUp(PointerEventData eventData)
|
|
{
|
|
// Pindah scene pas jari dilepas
|
|
if (aktifkanPindahScene && !string.IsNullOrEmpty(namaSceneTujuan))
|
|
{
|
|
SceneManager.LoadScene(namaSceneTujuan);
|
|
}
|
|
}
|
|
|
|
IEnumerator AnimasiKenyal()
|
|
{
|
|
float timer = 0;
|
|
float durasi = 0.4f;
|
|
|
|
while (timer < durasi)
|
|
{
|
|
timer += Time.deltaTime;
|
|
float damping = Mathf.Lerp(1, 0, timer / durasi);
|
|
float sin = Mathf.Sin(timer * kecepatanKenyal) * kekuatanKenyal * damping;
|
|
|
|
transform.localScale = new Vector3(skalaAwal.x + sin, skalaAwal.y - sin, skalaAwal.z);
|
|
yield return null;
|
|
}
|
|
|
|
transform.localScale = skalaAwal;
|
|
coroutineKenyal = null; // Selesai, balik ke mode denyut (kalau aktif)
|
|
}
|
|
} |