Project_WL/Assets/Script/UI/Common/BotMenu.cs

72 lines
2.3 KiB
C#

using System.Collections;
using UnityEngine;
using UnityEngine.UI;
public class BotMenu : MonoBehaviourSingletonTemplate<BotMenu>
{
public RectTransform rtf_onoff, rtf_layout;
public HorizontalLayoutGroup m_layout;
private bool bOn = true; // 현재 상태 (On/Off)
private bool isAnimating = false; // 애니메이션 진행 여부 확인
private void OnEnable()
{
Set_OnOff();
}
void Set_OnOff()
{
// 애니메이션이 이미 진행 중이라면 실행하지 않음
if (isAnimating) return;
StartCoroutine(Co_OnOff());
}
IEnumerator Co_OnOff()
{
isAnimating = true; // 애니메이션 시작
var targetValue = bOn ? -257 : -800; // 목표 값
var startValue = m_layout.padding.left; // 시작 값
var duration = 0.15f; // 애니메이션 시간
var elapsedTime = 0f;
// 초기 회전 값과 목표 회전 값 설정
var startRotation = rtf_onoff.localEulerAngles.z;
var targetRotation = bOn ? -90f : 90f;
while (elapsedTime < duration)
{
elapsedTime += Time.deltaTime;
var t = Mathf.Clamp01(elapsedTime / duration);
// 선형 보간으로 padding.left 값을 업데이트
var newValue = Mathf.Lerp(startValue, targetValue, t);
m_layout.padding.left = Mathf.RoundToInt(newValue);
LayoutRebuilder.ForceRebuildLayoutImmediate(rtf_layout);
// 선형 보간으로 회전값 업데이트
var newRotation = Mathf.LerpAngle(startRotation, targetRotation, t);
rtf_onoff.localEulerAngles = new Vector3(rtf_onoff.localEulerAngles.x, rtf_onoff.localEulerAngles.y, newRotation);
// 변경된 값을 레이아웃에 반영
m_layout.CalculateLayoutInputHorizontal();
yield return null;
}
// 최종 값 설정
m_layout.padding.left = targetValue;
rtf_onoff.localEulerAngles = new Vector3(rtf_onoff.localEulerAngles.x, rtf_onoff.localEulerAngles.y, targetRotation);
LayoutRebuilder.ForceRebuildLayoutImmediate(rtf_layout);
isAnimating = false; // 애니메이션 종료
}
public void OnClick_OnOff()
{
// 상태를 토글하고 애니메이션 시작
bOn = !bOn;
Set_OnOff();
}
}