| | |
| | | SlideFromTop, // 从顶部滑入 |
| | | SlideFromBottom, // 从底部滑入 |
| | | SlideFromLeft, // 从左侧滑入 |
| | | SlideFromRight // 从右侧滑入 |
| | | SlideFromRight, // 从右侧滑入 |
| | | ScaleOverInOut,// 缩放(超过)之后再返回 |
| | | |
| | | } |
| | | |
| | | [RequireComponent(typeof(Canvas))] |
| | |
| | | // 动画相关 |
| | | [SerializeField] public UIAnimationType openAnimationType = UIAnimationType.None; |
| | | [SerializeField] public UIAnimationType closeAnimationType = UIAnimationType.None; |
| | | [SerializeField] protected RectTransform _rectTransform; //界面默认添加根节点用于表现界面开启关闭动画 |
| | | |
| | | [SerializeField]/*[HideInInspector]*/ public float animeDuration = 0.2f; |
| | | [SerializeField][HideInInspector] public Ease animationEase = Ease.OutQuad; // 确保使用 DG.Tweening.Ease |
| | | |
| | |
| | | |
| | | private Button btnClickEmptyClose; |
| | | |
| | | protected int functionOrder = 0; |
| | | // 跟OneLevelWin联动 实际上是需要继承自OneLevelWin才能生效的值 使用需要注意 |
| | | int m_FunctionOrder = 0; |
| | | public int functionOrder |
| | | { |
| | | get { return m_FunctionOrder; } |
| | | set { m_FunctionOrder = value; } |
| | | } |
| | | |
| | | // 内部状态 |
| | | protected bool isActive = false; |
| | |
| | | // 组件引用 |
| | | protected Canvas canvas; |
| | | protected CanvasGroup canvasGroup; |
| | | protected RectTransform _rectTransform; //界面默认添加根节点用于表现界面开启关闭动画 |
| | | |
| | | // 动画相关 |
| | | protected Vector3 originalPosition; |
| | |
| | | |
| | | protected virtual void Awake() |
| | | { |
| | | CreateRootNode(); |
| | | // 防止有人不写base.InitComponent引发错误 所以拆分 |
| | | InitComponentInternal(); |
| | | // 在Awake中进行基本初始化 |
| | |
| | | } |
| | | } |
| | | |
| | | private void CreateRootNode() |
| | | { |
| | | if (openAnimationType == UIAnimationType.None && closeAnimationType == UIAnimationType.None) |
| | | return; |
| | | |
| | | List<Transform> children = new List<Transform>(); |
| | | foreach (Transform child in transform) |
| | | { |
| | | children.Add(child); |
| | | } |
| | | |
| | | rootNode = new GameObject("WindowRoot"); |
| | | rootNode.transform.SetParent(transform, false); |
| | | rootNode.layer = LayerMask.NameToLayer("UI"); |
| | | _rectTransform = rootNode.AddMissingComponent<RectTransform>();
|
| | |
|
| | | //设置成拉伸效果,和父容器保持同样大小自动适配 |
| | | _rectTransform.anchorMin = Vector2.zero; |
| | | _rectTransform.anchorMax = Vector2.one; |
| | | _rectTransform.pivot = new Vector2(0.5f, 0.5f); |
| | | _rectTransform.anchoredPosition = Vector2.zero; |
| | | _rectTransform.sizeDelta = Vector2.zero; // 设置为0,表示拉伸到父容器大小 |
| | | |
| | | foreach (Transform child in children) |
| | | { |
| | | child.SetParent(rootNode.transform, false); |
| | | } |
| | | } |
| | | |
| | | protected virtual void Start() |
| | | { |
| | | // 子类可以重写此方法进行额外初始化 |
| | | } |
| | | |
| | | protected async UniTask ApplySettings() |
| | | {
|
| | | { |
| | | if (clickEmptySpaceClose) |
| | | { |
| | | //延迟创建会导致层级在ScreenMask之上 |
| | |
| | | btnClickEmptyClose = goBtnESC.GetComponent<Button>(); |
| | | btnClickEmptyClose.AddListener(CloseWindow); |
| | | btnClickEmptyClose.transform.SetAsFirstSibling(); |
| | | await UniTask.DelayFrame(5);
|
| | |
|
| | | btnClickEmptyClose = goBtnESC.GetComponent<Button>();
|
| | | await UniTask.DelayFrame(5); |
| | | |
| | | btnClickEmptyClose = goBtnESC.GetComponent<Button>(); |
| | | btnClickEmptyClose.AddListener(CloseWindow); |
| | | } |
| | | } |
| | |
| | | PlayOpenAnimation(); |
| | | |
| | | OnOpen(); |
| | | |
| | | ExecuteNextFrame(NextFrameAfterOpen); |
| | | } |
| | | |
| | | protected virtual void NextFrameAfterOpen() |
| | | { |
| | | |
| | | } |
| | | |
| | | // 关闭UI - 修改后的方法 |
| | |
| | | // 禁用交互但保持可见 |
| | | if (canvasGroup != null) |
| | | { |
| | | canvasGroup.interactable = false; |
| | | canvasGroup.blocksRaycasts = false; |
| | | } |
| | | |
| | |
| | | if (canvasGroup != null) |
| | | { |
| | | canvasGroup.alpha = 0f; |
| | | canvasGroup.interactable = false; |
| | | canvasGroup.blocksRaycasts = false; |
| | | } |
| | | if (canvasScaler != null) |
| | |
| | | if (canvasGroup != null) |
| | | { |
| | | canvasGroup.alpha = 1f; |
| | | canvasGroup.interactable = false; |
| | | canvasGroup.blocksRaycasts = false; |
| | | } |
| | | if (canvasScaler != null) |
| | |
| | | // 启用交互 |
| | | if (canvasGroup != null) |
| | | { |
| | | canvasGroup.interactable = true; |
| | | canvasGroup.blocksRaycasts = true; |
| | | } |
| | | |
| | | }); |
| | | |
| | | // currentAnimation.ingoreTimeScale = true; |
| | | |
| | | currentAnimation.Play(); |
| | | } |
| | |
| | | if (canvasGroup != null) |
| | | { |
| | | canvasGroup.alpha = 1f; |
| | | canvasGroup.interactable = true; |
| | | canvasGroup.blocksRaycasts = true; |
| | | } |
| | | isAnimating = false; |
| | |
| | | if (canvasGroup != null) |
| | | { |
| | | canvasGroup.alpha = 1f; |
| | | canvasGroup.interactable = true; |
| | | canvasGroup.blocksRaycasts = true; |
| | | } |
| | | if (canvasScaler != null) |