using System.Collections; using UnityEngine; using UnityEngine.UI; public class BotMenu : MonoBehaviourSingletonTemplate { 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(); } }