85 lines
2.2 KiB
C#
85 lines
2.2 KiB
C#
using System.Collections;
|
|
using UnityEngine;
|
|
|
|
namespace ConjureOS.ArcadeMenu
|
|
{
|
|
public class ConjureArcadeMenuButtonSelectionBorder : MonoBehaviour
|
|
{
|
|
[SerializeField]
|
|
private AnimationCurve scaleCurve;
|
|
|
|
[SerializeField]
|
|
private float scaleSpeed = 1.0f;
|
|
|
|
[SerializeField]
|
|
private float scaleFactor = 1.0f;
|
|
|
|
private bool isSelected;
|
|
private CanvasGroup canvasGroup;
|
|
|
|
private float scaleTimer;
|
|
private Coroutine scaleCoroutine;
|
|
|
|
public bool IsSelected
|
|
{
|
|
get => isSelected;
|
|
set
|
|
{
|
|
if (value && !isSelected)
|
|
{
|
|
scaleTimer = 0;
|
|
scaleCoroutine = StartCoroutine(ScaleRoutine());
|
|
}
|
|
else if (!value)
|
|
{
|
|
StopScaleRoutine();
|
|
}
|
|
|
|
if (canvasGroup)
|
|
{
|
|
canvasGroup.alpha = value ? 1f : 0f;
|
|
}
|
|
isSelected = value;
|
|
}
|
|
}
|
|
|
|
private void Awake()
|
|
{
|
|
canvasGroup = GetComponent<CanvasGroup>();
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
StopScaleRoutine();
|
|
}
|
|
|
|
private IEnumerator ScaleRoutine()
|
|
{
|
|
while (true)
|
|
{
|
|
float currentScale = scaleCurve.Evaluate(scaleTimer);
|
|
transform.localScale = Vector3.one + new Vector3(currentScale, currentScale, currentScale) * scaleFactor;
|
|
|
|
yield return null;
|
|
|
|
scaleTimer += Time.deltaTime * scaleSpeed;
|
|
if (scaleTimer > 1.0f)
|
|
{
|
|
scaleTimer -= 1.0f;
|
|
}
|
|
}
|
|
|
|
// ReSharper disable once IteratorNeverReturns
|
|
// Reason: This coroutine ends when the border is no longer connected.
|
|
}
|
|
|
|
private void StopScaleRoutine()
|
|
{
|
|
if (scaleCoroutine != null)
|
|
{
|
|
StopCoroutine(scaleCoroutine);
|
|
scaleCoroutine = null;
|
|
}
|
|
}
|
|
}
|
|
} |