public async Task Show(bool show, bool skipTween, bool forcibly = false)
    {
        if (!forcibly && _isOpening == show)
        {
            return;
        }

        // Init tween
        if (_tween != null && _tween.IsActive() && _tween.IsPlaying())
        {
            return;
        }

        if (show)
        {
            _rectRoot.gameObject.SetActive(true);
        }

        _cgRoot.blocksRaycasts = false;

        float startAlpha = show ? 0.0f : 1.0f;
        float goalAlpha  = show ? 1.0f : 0.0f;
        float duration   = skipTween ? 0.0f : _duration;

        _tween = DOTween.To(
            () => startAlpha,
            (v) => {
            _cgRoot.alpha = v;
            startAlpha    = v;
        },
            goalAlpha, duration).SetUpdate(true);

        await _tween.AsyncWaitForCompletion();

        if (!show)
        {
            _rectRoot.gameObject.SetActive(false);
        }
        else
        {
            _cgRoot.blocksRaycasts = true;
        }

        _isOpening = show;
    }