0312 遮罩组件在界面开发中生成,遮罩开关和点击空白为其中的组件特性
1个文件已修改
49 ■■■■■ 已修改文件
Main/System/UIBase/UIBase.cs 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/UIBase/UIBase.cs
@@ -53,10 +53,10 @@
    [SerializeField] public bool isPersistent = false;
    [SerializeField][HideInInspector] public int maxIdleRounds = 20;
    // 动画相关
    [SerializeField] public UIAnimationType openAnimationType = UIAnimationType.None;
    [SerializeField] public UIAnimationType closeAnimationType = UIAnimationType.None;
    [SerializeField] protected RectTransform _rectTransform; //界面默认添加根节点用于表现界面开启关闭动画,或者设置适配用
    
    [SerializeField]/*[HideInInspector]*/ public float animeDuration = 0.2f;
    [SerializeField]public TweenCurve scaleOverInOutCurve;
@@ -69,13 +69,19 @@
    // 子UI管理
    [HideInInspector] public List<UIBase> childrenUI = new List<UIBase>();
    [Header("所有UI排版应该在此节点内层")]
    [SerializeField] protected RectTransform _rectTransform; //界面默认添加根节点用于表现界面开启关闭动画,或者设置适配用
    //遮罩组件在界面开发中生成,遮罩开关和点击空白为其中的组件特性
    //  打开遮罩
    [Header("遮罩(透明)开关")]
    [SerializeField] public bool openMask = false;
    //  默认点击空白区域关闭界面
    [Header("点击空白关闭")]
    [SerializeField] public bool clickEmptySpaceClose = false;
    private GameObject screenMask = null;
    public GameObject screenMask = null;
    private Button btnClickEmptyClose;
    public Action btnClickEmptyCloseEvent = null;   //提供点击空白区域关闭界面的回调
@@ -121,15 +127,9 @@
        }
        ApplySettings();
        if (openMask)
        {
            screenMask = GameObject.Instantiate(Resources.Load<GameObject>("Prefabs/ScreenMask"), transform);
            screenMask.transform.localScale = Vector3.one;
            screenMask.transform.localPosition = Vector3.zero;
        if (screenMask != null)
            screenMask.transform.SetAsFirstSibling();
        }
        InitClickEmptySpaceBtn();
    }
    protected virtual void Start()
@@ -137,16 +137,22 @@
        // 子类可以重写此方法进行额外初始化
    }
    protected async UniTask ApplySettings()
    protected async UniTask ApplyClickEmptySpaceClose()
    {
        if (clickEmptySpaceClose)
        {
            //延迟创建会导致层级在ScreenMask之上
            GameObject goBtnESC = GameObject.Instantiate(Resources.Load<GameObject>("Prefabs/ClickEmptyCloseMask"), transform);
            btnClickEmptyClose = goBtnESC.GetComponent<Button>();
            btnClickEmptyClose.transform.SetAsFirstSibling();
            //延迟x帧后可点击,防止点击过快立即关闭了
            await UniTask.DelayFrame(5);
            btnClickEmptyClose.interactable = true;
        }
    }
    private void InitClickEmptySpaceBtn()
    {
        if (!clickEmptySpaceClose)
        {
            return;
        }
            btnClickEmptyClose.AddListener(()=>
            {
                if (btnClickEmptyCloseEvent != null)
@@ -158,7 +164,8 @@
                    CloseWindow();
                }
            });
        }
        btnClickEmptyClose.interactable = false;
    }
@@ -250,6 +257,12 @@
            return;
        }
        if ((clickEmptySpaceClose || openMask) && screenMask == null)
        {
            Debug.LogError($"界面: {uiName} 缺少遮罩 ");
            return;
        }
        OnPreOpen();
        // 如果正在播放动画,先停止
        StopCurrentAnimation();
@@ -268,6 +281,7 @@
        // _rectTransform.offsetMax = new Vector2(0, -50); //上方
        OnOpen();
        ApplyClickEmptySpaceClose();
        ExecuteNextFrame(NextFrameAfterOpen);
    }
@@ -283,6 +297,9 @@
        // 如果已经在关闭过程中,直接返回
        if (isClosing) return;
        
        if (clickEmptySpaceClose)
            btnClickEmptyClose.interactable = false;
        OnPreClose();
        
        // 如果正在播放动画,先停止