using UnityEngine; using UnityEngine.UI; using DG.Tweening; using System.Collections.Generic; public class ui_Panel_Setting : MonoBehaviour { [SerializeField] Button button_Close; [SerializeField] Toggle toggle_Game; [SerializeField] Toggle toggle_Game_Pie; [SerializeField] GameObject game_Content; [SerializeField] Toggle toggle_View; [SerializeField] Toggle toggle_View_Pie; [SerializeField] GameObject view_Content; [Header("Enter Animation")] [SerializeField] bool playEnterAnimation = true; [SerializeField] float enterItemDuration = 0.24f; [SerializeField] float enterItemStagger = 0.03f; [SerializeField] float enterOffsetY = 28f; [SerializeField] Ease enterEase = Ease.OutCubic; private readonly List enterItems = new List(); private readonly List enterGroups = new List(); private readonly List enterBasePos = new List(); private readonly List enterRestoreTransform = new List(); private Sequence enterSequence; private void Awake() { button_Close?.onClick.AddListener(Close); toggle_Game.onValueChanged.AddListener((isOn) => { game_Content.SetActive(isOn); if (isOn == false) return; if (game_Content.TryGetComponent(out SimpleAxisTween simpleAxisTween)) { simpleAxisTween.PlayTween(); } }); toggle_Game_Pie.onValueChanged.AddListener((isOn) => { toggle_Game.isOn = isOn; }); toggle_View.onValueChanged.AddListener((isOn) => { view_Content.SetActive(isOn); if (isOn == false) return; if (view_Content.TryGetComponent(out SimpleAxisTween simpleAxisTween)) { simpleAxisTween.PlayTween(); } }); toggle_View_Pie.onValueChanged.AddListener((isOn) => { toggle_View.isOn = isOn; }); toggle_Game.isOn = true; } private void OnEnable() { if (playEnterAnimation) { PlayEnterAnimation(); } } private void OnDisable() { KillEnterAnimation(); } private void Update() { if (Input.GetKeyDown(KeyCode.Escape)) { Close(); } } private void PlayEnterAnimation() { KillEnterAnimation(); CacheEnterItems(); if (enterItems.Count == 0) return; enterSequence = DOTween.Sequence().SetUpdate(true); for (int i = 0; i < enterItems.Count; i++) { RectTransform rt = enterItems[i]; CanvasGroup cg = enterGroups[i]; Vector2 basePos = enterBasePos[i]; bool restoreTransform = i < enterRestoreTransform.Count && enterRestoreTransform[i]; if (rt == null || cg == null) continue; rt.DOKill(); cg.DOKill(); if (restoreTransform) { rt.anchoredPosition = basePos - new Vector2(0f, Mathf.Abs(enterOffsetY)); } cg.alpha = 0f; float start = i * Mathf.Max(0f, enterItemStagger); if (restoreTransform) { enterSequence.Insert(start, rt.DOAnchorPos(basePos, Mathf.Max(0.01f, enterItemDuration)) .SetEase(enterEase) .SetUpdate(true)); } enterSequence.Insert(start, cg.DOFade(1f, Mathf.Max(0.01f, enterItemDuration)) .SetEase(Ease.OutCubic) .SetUpdate(true)); } enterSequence.OnKill(RestoreEnterAnimationState); enterSequence.OnComplete(RestoreEnterAnimationState); } private void CacheEnterItems() { enterItems.Clear(); enterGroups.Clear(); enterBasePos.Clear(); enterRestoreTransform.Clear(); for (int i = 0; i < transform.childCount; i++) { Transform child = transform.GetChild(i); if (child == null || !child.gameObject.activeInHierarchy) continue; RectTransform rt = child as RectTransform; if (rt == null) continue; CanvasGroup cg = rt.GetComponent(); if (cg == null) cg = rt.gameObject.AddComponent(); enterItems.Add(rt); enterGroups.Add(cg); enterBasePos.Add(rt.anchoredPosition); enterRestoreTransform.Add(!UI_OrderedEntryAnimator.IsLayoutSensitive(rt)); } } private void KillEnterAnimation() { if (enterSequence != null) { enterSequence.Kill(); enterSequence = null; } } private void RestoreEnterAnimationState() { for (int i = 0; i < enterItems.Count; i++) { RectTransform rt = enterItems[i]; CanvasGroup cg = i < enterGroups.Count ? enterGroups[i] : null; bool restoreTransform = i < enterRestoreTransform.Count && enterRestoreTransform[i]; if (rt != null) { rt.DOKill(); if (restoreTransform && i < enterBasePos.Count) { rt.anchoredPosition = enterBasePos[i]; } } if (cg != null) { cg.DOKill(); cg.alpha = 1f; } } } void Close() { UI_PanelExitUtility.PlayExitThen(gameObject, () => { if (gameObject != null) { gameObject.SetActive(false); } }); } }