195 lines
5.7 KiB
C#
195 lines
5.7 KiB
C#
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<RectTransform> enterItems = new List<RectTransform>();
|
|
private readonly List<CanvasGroup> enterGroups = new List<CanvasGroup>();
|
|
private readonly List<Vector2> enterBasePos = new List<Vector2>();
|
|
private readonly List<bool> enterRestoreTransform = new List<bool>();
|
|
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<CanvasGroup>();
|
|
if (cg == null)
|
|
cg = rt.gameObject.AddComponent<CanvasGroup>();
|
|
|
|
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);
|
|
}
|
|
});
|
|
}
|
|
}
|