Files
Barrack-Unity/Assets/Scripts/MainMenu/MenuKey.cs
T

144 lines
3.4 KiB
C#

using UnityEngine;
public class MenuKey : MonoBehaviour
{
public AudioClip keyTurnOpen;
public AudioClip keyTurnClose;
public MenuCallbackHolder callbackHolder;
private AudioSource audioSource;
private Animator animator;
private int currentRow = 0;
private int targetRow = 0;
private bool isTranslating = false;
private bool triggered = false;
private float translationElapsed = 0f;
private float translationStartY = 0f;
private float translationTargetY = 0f;
private static float animationDuration = 0.45f;
private static float[] rowPositions = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
audioSource = GetComponent<AudioSource>();
animator = GetComponent<Animator>();
// Precompute the row positions based on the number of rows and the desired spacing.
for (int i = 0; i < rowPositions.Length; i++)
{
rowPositions[i] = 1.462f - (i * 0.69f);
}
}
// Update is called once per frame
void Update()
{
if (!isTranslating && currentRow != targetRow)
{
animator.SetTrigger("buttonChanged");
translationElapsed = 0f;
translationStartY = rowPositions[currentRow];
translationTargetY = rowPositions[targetRow];
isTranslating = true;
}
if (isTranslating)
{
translationElapsed += Time.deltaTime;
float t = Mathf.Clamp01(translationElapsed / animationDuration);
float easedT = EaseOutQuad(t);
float y = Mathf.Lerp(translationStartY, translationTargetY, easedT);
Vector3 position = transform.position;
position.y = y;
transform.position = position;
if (t >= 1f)
{
currentRow = targetRow;
isTranslating = false;
position.y = translationTargetY;
transform.position = position;
animator.ResetTrigger("buttonChanged");
animator.SetTrigger("inserted");
}
}
}
public void PlayKeyTurnOpen(int _)
{
audioSource.PlayOneShot(keyTurnOpen);
}
public void PlayKeyTurnClose(int _)
{
audioSource.PlayOneShot(keyTurnClose);
}
public void TranslateTo(int row)
{
targetRow = row;
}
public void OpenKey(bool trigger)
{
this.triggered = trigger;
animator.ResetTrigger("buttonReleased");
animator.SetTrigger("buttonClicked");
if (!trigger)
animator.SetBool("inButton", true);
}
public void CloseKey()
{
animator.SetBool("inButton", false);
}
public void ReleaseKey()
{
animator.ResetTrigger("buttonClicked");
animator.SetTrigger("buttonReleased");
}
public void InvokeCallback()
{
if (!isTranslating)
{
callbackHolder.InvokeCallback(currentRow);
}
}
public void TriggerCallback(int _)
{
if (!isTranslating && triggered)
{
triggered = false;
callbackHolder.InvokeCallback(currentRow);
ReleaseKey();
}
}
private float EaseOutQuad(float t)
{
// Quadratic easing out - deceleration until the end
return 1 - (1 - t) * (1 - t);
}
}