Example #1
0
    private void Start()
    {
        canvasObject = GameObject.Find(ResourceNames.canvas);

        if (!SoundWareHouse.Instance.bgmNormal.isPlaying)
        {
            SoundWareHouse.Instance.StopAllBGM();
            SoundWareHouse.Instance.bgmNormal.Play();
        }


        var screenComponents  = ScreenComponentsFactory.Make();
        var headerWidth       = screenComponents.headerWidth;
        var headerHeight      = screenComponents.headerHeight;
        var headerMarginTop   = screenComponents.headerMarginTop;
        var headerToolsMargin = screenComponents.headerToolsMargin;
        var innerFrameObject  = screenComponents.innerFrameObject;
        var innerFrameSize    = innerFrameObject.GetComponent <RectTransform>().sizeDelta;


        var titleImageObject = Instantiate(Resources.Load <GameObject>(ResourceNames.titleImage));

        //Debug.Log(titleImageObject);
        titleImageObject.transform.SetParent(canvasObject.transform, false);
        var titleImageRectTransform = titleImageObject.GetComponent <RectTransform>();
        var titleImageSize          = new Vector2(
            headerHeight * 4f,
            headerHeight
            );
        var titleImageAnchoredPosition = new Vector2(
            0f,
            -(Screen.height / 2f) + (titleImageSize.y / 2f)
            );

        titleImageRectTransform.anchoredPosition = titleImageAnchoredPosition;
        titleImageRectTransform.sizeDelta        = Vector2.zero;

        var buttonPadding      = innerFrameSize.y * 0.05f;
        var buttonMarginTop    = innerFrameSize.y * 0.13f;
        var buttonMarginBottom = innerFrameSize.y * 0.13f;
        var buttonCount        = 5;

        GameObject makeButton(string title, int index, Func <Button, bool> onClick)
        {
            var buttonObject = Instantiate(Resources.Load <GameObject>(ResourceNames.titleButton));

            buttonObject.transform.SetParent(innerFrameObject.transform, false);
            var rectTransform = buttonObject.GetComponent <RectTransform>();
            var height        = (innerFrameSize.y - buttonMarginTop - buttonMarginBottom - (buttonPadding * (buttonCount - 1))) / buttonCount;
            var width         = height * 4f;

            rectTransform.anchoredPosition = new Vector2(
                0f,
                -buttonMarginTop - (buttonPadding * index) - (height * index)
                );
            rectTransform.sizeDelta = new Vector2(
                width,
                height
                );
            var text = buttonObject.GetComponentInChildren <Text>();

            text.text = title;
            var button = buttonObject.GetComponent <Button>();

            button.onClick.AddListener(() =>
            {
                onClick(button);
            });
            return(buttonObject);
        }

        var curtainObject = Instantiate(Resources.Load <GameObject>(ResourceNames.curtainImage));

        curtainObject.transform.SetParent(canvasObject.transform, false);
        var curtainManager = curtainObject.GetComponent <CurtainManager>();

        var startButton = makeButton("ゲームスタート", 0, (button) =>
        {
            Transition(ResourceNames.stageSelectionScene, curtainManager);
            return(true);
        });
        var tutorialButton = makeButton("操作説明", 1, (button) =>
        {
            curtainObject.transform.SetAsLastSibling();
            curtainManager.Close(() =>
            {
                TutorialViewFactory.Make(canvasObject, curtainManager);
                return(true);
            });
            return(true);
        });
        var resetButton = makeButton("初期化", 2, (button) =>
        {
            var blackoutImageObject = Instantiate(Resources.Load <GameObject>(ResourceNames.blackoutImage));
            blackoutImageObject.transform.SetParent(canvasObject.transform, false);
            var resetConfirmation = Instantiate(Resources.Load <GameObject>(ResourceNames.resetCofirmation));
            resetConfirmation.transform.SetParent(canvasObject.transform, false);
            var resetConfirmationText = resetConfirmation.transform.Find(ResourceNames.titleText).gameObject;
            var resetConfirmationTextRectTransform       = resetConfirmationText.GetComponent <RectTransform>();
            resetConfirmationTextRectTransform.sizeDelta = new Vector2(
                Screen.width,
                Screen.height * 0.2f
                );
            GameObject MakeButton(int sign, string name, Func <bool> onClick)
            {
                var buttonObject  = resetConfirmation.transform.Find(name).gameObject;
                var rectTransform = buttonObject.GetComponent <RectTransform>();
                var width         = innerFrameSize.x * 0.3f;
                var height        = width / 4f;
                rectTransform.anchoredPosition = new Vector2(sign * (width + Screen.width * 0.05f) / 2f, 0f);
                rectTransform.sizeDelta        = new Vector2(width, height);
                var yesButton = buttonObject.GetComponent <Button>();
                yesButton.onClick.AddListener(() =>
                {
                    onClick();
                });
                return(buttonObject);
            }
            MakeButton(-1, ResourceNames.yesButton, () =>
            {
                ClearedStages.Reset();
                resetConfirmation.GetComponent <UIAnimator>().Animate(UIAnimator.AnimationKey.Alpha, animationDuration, 0f, (animator) =>
                {
                    var resetAlert = Instantiate(Resources.Load <GameObject>(ResourceNames.resetAlert));
                    resetAlert.transform.SetParent(canvasObject.transform, false);
                    var resetAlertText = resetAlert.transform.Find(ResourceNames.titleText).gameObject;
                    resetAlertText.GetComponent <RectTransform>().sizeDelta = resetConfirmationTextRectTransform.sizeDelta;
                    var closeButtonObject              = resetAlert.transform.Find(ResourceNames.closeButton).gameObject;
                    var closeButtonRectTransform       = closeButtonObject.GetComponent <RectTransform>();
                    var closeButtonWidth               = Screen.width * 0.3f;
                    var closeButtonHeight              = closeButtonWidth / 4f;
                    closeButtonRectTransform.sizeDelta = new Vector2(closeButtonWidth, closeButtonHeight);
                    var closeButton = closeButtonObject.GetComponent <Button>();
                    closeButton.onClick.AddListener(() =>
                    {
                        blackoutImageObject.GetComponent <UIAnimator>().Animate(UIAnimator.AnimationKey.Alpha, animationDuration, 0f, (a2) =>
                        {
                            Destroy(blackoutImageObject);
                            return(true);
                        });
                        resetAlert.GetComponent <UIAnimator>().Animate(UIAnimator.AnimationKey.Alpha, animationDuration, 0f, (a2) =>
                        {
                            Destroy(resetAlert);
                            return(true);
                        });
                    });
                    resetAlert.GetComponent <UIAnimator>().Animate(UIAnimator.AnimationKey.Alpha, animationDuration, 1f, (a2) =>
                    {
                        return(true);
                    });
                    Destroy(resetConfirmation);
                    return(true);
                });
                return(true);
            });
            MakeButton(1, ResourceNames.noButton, () =>
            {
                blackoutImageObject.GetComponent <UIAnimator>().Animate(UIAnimator.AnimationKey.Alpha, animationDuration, 0f, (animator) =>
                {
                    Destroy(blackoutImageObject);
                    return(true);
                });
                resetConfirmation.GetComponent <UIAnimator>().Animate(UIAnimator.AnimationKey.Alpha, animationDuration, 0f, (animator) =>
                {
                    Destroy(resetConfirmation);
                    return(true);
                });
                return(true);
            });
            resetConfirmation.GetComponent <UIAnimator>().Animate(UIAnimator.AnimationKey.Alpha, animationDuration, 1f, (animator) =>
            {
                return(true);
            });
            return(true);
        });
        var configButton = makeButton("設定", 3, (button) =>
        {
            curtainObject.transform.SetAsLastSibling();
            curtainManager.Close(() =>
            {
                var configView = ConfigViewFactory.Make(canvasObject);
                curtainObject.transform.SetAsLastSibling();
                curtainManager.Open(() =>
                {
                    curtainObject.transform.SetAsFirstSibling();
                    var closeConfigButton = configView.transform.Find(ResourceNames.closeConfigButton).GetComponent <Button>();
                    closeConfigButton.onClick.AddListener(() =>
                    {
                        curtainObject.transform.SetAsLastSibling();
                        curtainManager.Close(() =>
                        {
                            Destroy(configView);
                            curtainManager.Open(() =>
                            {
                                curtainObject.transform.SetAsFirstSibling();
                                return(true);
                            });
                            return(true);
                        });
                    });
                    return(true);
                });
                return(true);
            });
            return(true);
        });
        var endButton = makeButton("終了", 4, (button) =>
        {
            UnityEngine.Application.Quit();
            return(true);
        });


        curtainManager.Open(() =>
        {
            curtainObject.transform.SetAsFirstSibling();
            titleImageRectTransform.GetComponent <UIAnimator>().Animate(UIAnimator.AnimationKey.Size, animationDuration, titleImageSize * 2f, (animator) =>
            {
                animator.Animate(UIAnimator.AnimationKey.Size, animationDuration, titleImageSize, (a2) =>
                {
                    animator.Animate(UIAnimator.AnimationKey.PositionY, animationDuration, -headerMarginTop, (a3) =>
                    {
                        var buttons = new GameObject[] { startButton, tutorialButton, resetButton, configButton, endButton };
                        foreach (var button in buttons)
                        {
                            button.GetComponent <UIAnimator>().Animate(UIAnimator.AnimationKey.Alpha, animationDuration, 1f, (a4) =>
                            {
                                return(true);
                            });
                        }
                        return(true);
                    });
                    return(true);
                });
                return(true);
            });
            return(true);
        }, animationDuration);
    }
Example #2
0
    public void Build(StageData stageData, bool fieldOnly = false, bool curtain = true, bool withSnapShot = true, bool dropAnimation = true)
    {
        this.stageData = stageData;
        var canvas = GameObject.Find(ResourceNames.canvas);
        var innerFramePaddingBottom = 5f;

        if (gameDirector == null)
        {
            gameDirector = GameObject.Find(ResourceNames.gameDirector).GetComponent <GameDirector>();
        }
        if (!fieldOnly)
        {
            var screenComponents        = ScreenComponentsFactory.Make();
            var fieldMarginBottom       = screenComponents.fieldMarginBottom;
            var fieldWidth              = screenComponents.fieldWidth;
            var fieldHeight             = screenComponents.fieldHeight;
            var headerHeight            = screenComponents.headerHeight;
            var headerToolsWidth        = screenComponents.headerToolsWidth;
            var headerMarginTop         = screenComponents.headerMarginTop;
            var headerMarginBottom      = screenComponents.headerMarginBottom;
            var headerToolsMargin       = screenComponents.headerToolsMargin;
            var decorationCirclesWidth  = screenComponents.decorationCirclesWidth;
            var decorationCirclesHeight = screenComponents.decorationCirclesHeight;

            var menuButtonWidth    = headerToolsWidth * 0.1f;
            var formulaImageWidth  = headerToolsWidth - menuButtonWidth - decorationCirclesWidth;
            var formulaImageHeight = formulaImageWidth / 10f;
            var menuButtonHeight   = menuButtonWidth;

            var menuButtonObject = Instantiate(Resources.Load <GameObject>(ResourceNames.menuButton));
            menuButtonObject.transform.SetParent(canvas.transform, false);
            var menuButtonRectTransform = menuButtonObject.GetComponent <RectTransform>();
            menuButtonRectTransform.anchoredPosition = new Vector2(
                (Screen.width - fieldWidth) / 2,
                -headerMarginTop - (menuButtonHeight / 2f) - ((headerHeight - menuButtonHeight) / 2f)
                );
            menuButtonRectTransform.sizeDelta = new Vector2(menuButtonWidth, menuButtonHeight);
            var menuButton = menuButtonObject.GetComponent <Button>();
            menuButton.onClick.AddListener(() =>
            {
                if (isAnimation || IsEmpty)
                {
                    SoundWareHouse.Instance.seButtonError.Play();
                    return;
                }
                SoundWareHouse.Instance.seSpecialButton.Play();
                gameDirector.ShowMenu();
            });
            var formulaImageObject = Instantiate(Resources.Load <GameObject>(ResourceNames.formulaImage));
            formulaImageObject.transform.SetParent(canvas.transform, false);
            var formulaImageRectTransform = formulaImageObject.GetComponent <RectTransform>();
            formulaImageRectTransform.anchoredPosition = new Vector2(
                menuButtonRectTransform.anchoredPosition.x + menuButtonRectTransform.sizeDelta.x + headerToolsMargin,
                -headerMarginTop - (formulaImageHeight / 2f) - ((headerHeight - formulaImageHeight) / 2f)
                );
            formulaImageRectTransform.sizeDelta = new Vector2(
                formulaImageWidth,
                formulaImageHeight
                );
            formulaText = formulaImageObject.GetComponentInChildren <FormulaText>();
            var formulaTextRectTransform = formulaText.GetComponent <RectTransform>();
            formulaTextRectTransform.anchoredPosition = new Vector2(
                formulaImageWidth * 0.01f,
                0f
                );
            formulaTextRectTransform.sizeDelta = formulaImageRectTransform.sizeDelta;
            formulaText.text = "";
            var decorationCirclesObject = Instantiate(Resources.Load <GameObject>(ResourceNames.decorationCirclesImage));
            decorationCirclesObject.transform.SetParent(canvas.transform, false);
            var decorationCirclesRectTransform = decorationCirclesObject.GetComponent <RectTransform>();
            decorationCirclesRectTransform.anchoredPosition = new Vector2(
                formulaImageRectTransform.anchoredPosition.x + formulaImageRectTransform.sizeDelta.x + headerToolsMargin,
                -headerMarginTop - (decorationCirclesHeight / 2f) - ((headerHeight - decorationCirclesHeight) / 2f)
                );
            decorationCirclesRectTransform.sizeDelta = new Vector2(
                decorationCirclesWidth,
                decorationCirclesHeight
                );

            var outerFrameObject = Instantiate(Resources.Load <GameObject>(ResourceNames.gameFieldOuterFrameImage));
            outerFrameObject.transform.SetParent(canvas.transform, false);
            var outerFrameRectTransform = outerFrameObject.GetComponent <RectTransform>();
            outerFrameRectTransform.sizeDelta        = new Vector2(fieldWidth, fieldHeight);
            outerFrameRectTransform.anchoredPosition = new Vector2(0f, fieldMarginBottom);
            innerFrameObject = Instantiate(Resources.Load <GameObject>(ResourceNames.gameFieldInnerFrameImage));
            innerFrameObject.transform.SetParent(outerFrameObject.transform, false);
            var innerFrameRectTransform = innerFrameObject.GetComponent <RectTransform>();
            innerFrameSize = new Vector2(fieldWidth - 30f, fieldHeight - 30f);
            innerFrameRectTransform.sizeDelta = innerFrameSize;

            //innerFrameRectTransform.sizeDelta = outerFrameRectTransform.sizeDelta * 0.97f;
            var numberOfButtonsInColumn = 5;
            buttonSize = (innerFrameRectTransform.sizeDelta.y - innerFramePaddingBottom - (padding * (numberOfButtonsInColumn - 1))) / numberOfButtonsInColumn;
            var maxToolCount   = 4;
            var toolMargin     = innerFrameSize.y * 0.05f;
            var maxButtonCount = 7;
            var rightSpace     = (innerFrameSize.x - (buttonSize * maxButtonCount) - (padding * (maxButtonCount - 1))) / 2f;
            var toolSize       = (innerFrameSize.y - (toolMargin * (maxToolCount + 2))) / maxToolCount;
            //Debug.Log(toolSize);
            var toolPositionX    = (innerFrameSize.x / 2f) - ((rightSpace - toolSize) / 2f) - (toolSize / 2f);
            var helpButtonObject = Instantiate(Resources.Load <GameObject>(ResourceNames.helpButton));
            helpButtonObject.transform.SetParent(innerFrameObject.transform, false);
            var helpButtonRectTransform = helpButtonObject.GetComponent <RectTransform>();
            helpButtonRectTransform.anchoredPosition = new Vector2(toolPositionX, -(innerFrameSize.y / 2f) + (toolSize / 2f) + toolMargin);
            helpButtonRectTransform.sizeDelta        = new Vector2(toolSize, toolSize);
            var helpButton = helpButtonObject.GetComponent <Button>();
            helpButton.onClick.AddListener(() => {
                if (isAnimation || IsEmpty)
                {
                    SoundWareHouse.Instance.seButtonError.Play();
                    return;
                }
                SoundWareHouse.Instance.seSpecialButton.Play();
                gameDirector.ShowClearConditionAlert();
            });
            var backButtonObject = Instantiate(Resources.Load <GameObject>(ResourceNames.backButton));
            backButtonObject.transform.SetParent(innerFrameObject.transform, false);
            var backButtonRectTransform = backButtonObject.GetComponent <RectTransform>();
            backButtonRectTransform.anchoredPosition = new Vector2(toolPositionX, -(innerFrameSize.y / 2f) + (toolSize * 1.5f) + (toolMargin * 2f));
            backButtonRectTransform.sizeDelta        = new Vector2(toolSize, toolSize);
            var backButton = backButtonObject.GetComponent <Button>();
            backButton.onClick.AddListener(() => {
                if (GoBackTurn())
                {
                    SoundWareHouse.Instance.seControlButton.GetComponent <AudioSource>().Play();
                }
                else
                {
                    SoundWareHouse.Instance.seButtonError.GetComponent <AudioSource>().Play();
                }
            });
            var forwardButtonObject = Instantiate(Resources.Load <GameObject>(ResourceNames.forwardButton));
            forwardButtonObject.transform.SetParent(innerFrameObject.transform, false);
            var forwardButtonRectTransform = forwardButtonObject.GetComponent <RectTransform>();
            forwardButtonRectTransform.anchoredPosition = new Vector2(toolPositionX, -(innerFrameSize.y / 2f) + (toolSize * 2.5f) + (toolMargin * 3f));
            forwardButtonRectTransform.sizeDelta        = new Vector2(toolSize, toolSize);
            var forwardButton = forwardButtonObject.GetComponent <Button>();
            forwardButton.onClick.AddListener(() => {
                if (GoForwardTurn())
                {
                    SoundWareHouse.Instance.seControlButton.GetComponent <AudioSource>().Play();
                }
                else
                {
                    SoundWareHouse.Instance.seButtonError.GetComponent <AudioSource>().Play();
                }
            });
            var movesTextObject = Instantiate(Resources.Load <GameObject>(ResourceNames.movesText));
            movesTextObject.transform.SetParent(innerFrameObject.transform, false);
            var movesTextRectTransform = movesTextObject.GetComponent <RectTransform>();
            movesTextRectTransform.anchoredPosition = new Vector2(toolPositionX, -(innerFrameSize.y / 2f) + (toolSize * 3.5f) + (toolMargin * 5f));
            movesTextRectTransform.sizeDelta        = new Vector2(toolSize, toolSize);
            movesText      = movesTextObject.GetComponent <Text>();
            movesText.text = "0/" + stageData.moves.ToString() + "手";
        }

        void MakeButtons()
        {
            var termButtons = new List <TermButton>();
            var maxX        = 0;

            foreach (var operand in stageData.operands)
            {
                maxX = Math.Max(maxX, operand.position.x);
                var operandButtonObject = Instantiate(Resources.Load <GameObject>(ResourceNames.operandButton));
                var operandButton       = operandButtonObject.GetComponent <OperandButton>();
                operandButton.Operand = operand;
                operandButton.onClick.AddListener(() =>
                {
                    HandleOperandButton(operandButton);
                });
                termButtons.Add(operandButton);
            }
            foreach (var oper in stageData.operators)
            {
                maxX = Math.Max(maxX, oper.position.x);
                var operatorButtonObject = Instantiate(Resources.Load <GameObject>(ResourceNames.operatorButton));
                var operatorButton       = operatorButtonObject.GetComponent <OperatorButton>();
                operatorButton.Operator = oper;
                operatorButton.onClick.AddListener(() =>
                {
                    HandleOperatorButton(operatorButton);
                });
                termButtons.Add(operatorButton);
            }
            foreach (var equal in stageData.equals)
            {
                maxX = Math.Max(maxX, equal.position.x);
                var equalButtonObject = Instantiate(Resources.Load <GameObject>(ResourceNames.equalButton));
                var equalButton       = equalButtonObject.GetComponent <EqualButton>();
                equalButton.equal = equal;
                equalButton.onClick.AddListener(() =>
                {
                    HandleEqualButton(equalButton);
                });
                termButtons.Add(equalButton);
            }
            termButtons.Sort((a, b) =>
            {
                var pa = a.GetPosition();
                var pb = b.GetPosition();
                if (pa.y != pb.y)
                {
                    return(pa.y - pb.y);
                }
                return(pa.x - pb.x);
            });
            var index = 0;
            var paddingBetweenTermButtons = Screen.height * 0.05f;
            var notificationCount         = 0;
            var buttonCount = termButtons.Count;

            if (this.maxX == int.MaxValue)
            {
                this.maxX = maxX;
            }
            else
            {
                maxX = this.maxX;
            }
            foreach (var termButton in termButtons)
            {
                termButton.transform.SetParent(innerFrameObject.transform, false);
                var rect = termButton.GetComponent <RectTransform>();
                rect.sizeDelta = new Vector2(buttonSize, buttonSize);
                var buttonPosition = termButton.GetPosition();
                var offsetX        = innerFrameSize.x / 2f - ((float)(maxX + 1) / 2 * buttonSize) - ((float)maxX / 2 * padding);
                var x = buttonSize * buttonPosition.x + padding * buttonPosition.x + offsetX;
                var y = buttonSize * buttonPosition.y + padding * buttonPosition.y + innerFramePaddingBottom;
                if (dropAnimation)
                {
                    rect.anchoredPosition = new Vector2(
                        x,
                        y + Screen.height + (paddingBetweenTermButtons * buttonPosition.y) + (paddingBetweenTermButtons / (maxX - buttonPosition.x + 1))
                        );
                    var delay             = 0.1f;
                    var animationDuration = 0.5f + (delay * index);
                    termButton.GetComponent <UIAnimator>().Animate(UIAnimator.AnimationKey.PositionY, animationDuration, y, (animator) =>
                    {
                        ++notificationCount;
                        if (notificationCount == buttonCount)
                        {
                            gameDirector.ShowClearConditionAlert();
                        }
                        SoundWareHouse.Instance.seButtonDropped.GetComponent <AudioSource>().Play();
                        return(true);
                    });
                }
                else
                {
                    rect.anchoredPosition = new Vector2(
                        x,
                        y
                        );
                }

                ++index;
            }
            TermButtons = termButtons;
            if (withSnapShot)
            {
                SaveSnapShot();
            }
        }

        if (curtain)
        {
            curtainObject.transform.SetAsLastSibling();
            curtainObject.GetComponent <CurtainManager>().Open(() =>
            {
                curtainObject.transform.SetAsFirstSibling();
                MakeButtons();
                return(true);
            });
        }
        else
        {
            MakeButtons();
        }
    }
    private void Start()
    {
        canvasObject = GameObject.Find(ResourceNames.canvas);

        if (!SoundWareHouse.Instance.bgmNormal.isPlaying)
        {
            SoundWareHouse.Instance.StopAllBGM();
            SoundWareHouse.Instance.bgmNormal.Play();
        }


        var screenComponents  = ScreenComponentsFactory.Make();
        var headerWidth       = screenComponents.headerWidth;
        var headerHeight      = screenComponents.headerHeight;
        var headerMarginTop   = screenComponents.headerMarginTop;
        var headerToolsMargin = screenComponents.headerToolsMargin;
        var innerFrameObject  = screenComponents.innerFrameObject;
        var innerFrameSize    = innerFrameObject.GetComponent <RectTransform>().sizeDelta;

        var stageSelectionTextObject = Instantiate(Resources.Load <GameObject>(ResourceNames.stageSelectionText));

        stageSelectionTextObject.transform.SetParent(canvasObject.transform, false);
        var stageSelectionTextRectTransform    = stageSelectionTextObject.GetComponent <RectTransform>();
        var stageSelectionTextAnchoredPosition = new Vector2(
            0f,
            -headerMarginTop
            );
        var stageSelectionTextSize = new Vector2(
            headerWidth * 0.8f,
            headerHeight
            );

        stageSelectionTextRectTransform.anchoredPosition = stageSelectionTextAnchoredPosition;
        stageSelectionTextRectTransform.sizeDelta        = stageSelectionTextSize;

        var backToPreviousSceneButtonObject = Instantiate(Resources.Load <GameObject>(ResourceNames.backToPreviousSceneButton));

        backToPreviousSceneButtonObject.transform.SetParent(canvasObject.transform, false);
        var backToPreviousSceneButtonRectTransform = backToPreviousSceneButtonObject.GetComponent <RectTransform>();

        backToPreviousSceneButtonRectTransform.anchoredPosition = new Vector2(
            (Screen.width - headerWidth) / 2,
            -headerMarginTop
            );
        backToPreviousSceneButtonRectTransform.sizeDelta = new Vector2(
            headerHeight,
            headerHeight
            );

        //
        screenComponents.outerFrameObject.transform.SetAsLastSibling();
        //

        var curtainObject = Instantiate(Resources.Load <GameObject>(ResourceNames.curtainImage));

        curtainObject.transform.SetParent(canvasObject.transform, false);
        var curtainManager = curtainObject.GetComponent <CurtainManager>();

        var backToPreviousSceneButton = backToPreviousSceneButtonObject.GetComponent <Button>();

        backToPreviousSceneButton.onClick.AddListener(() =>
        {
            curtainManager.transform.SetAsLastSibling();
            curtainManager.Close(() =>
            {
                SceneManager.LoadScene(ResourceNames.titleScene);
                return(true);
            });
        });


        curtainManager.Open(() =>
        {
            curtainObject.transform.SetAsFirstSibling();
            var numberOfButtonsInRow = 10;
            var stageCount           = StageManager.Stages.Length;
            //Debug.Log(stageCount);
            var numberOfButtonsInColumn = Mathf.Ceil((float)stageCount / (float)numberOfButtonsInRow);
            var expectedButtonWidth     = (innerFrameSize.x / numberOfButtonsInRow);
            var expectedButtonHeight    = (innerFrameSize.y / numberOfButtonsInColumn);
            var padding    = innerFrameSize.y * 0.05f;
            var buttonSize = (expectedButtonWidth < expectedButtonHeight) ?
                             (innerFrameSize.x - (padding * (numberOfButtonsInRow + 1))) / numberOfButtonsInRow :
                             (innerFrameSize.y - (padding * (numberOfButtonsInColumn + 1))) / numberOfButtonsInColumn;
            var horizontalMargin = (expectedButtonWidth < expectedButtonHeight) ?
                                   padding : (innerFrameSize.x - (buttonSize * numberOfButtonsInRow) - (padding * (numberOfButtonsInRow - 1))) / 2f;
            var verticalMargin = (expectedButtonWidth < expectedButtonHeight) ?
                                 (innerFrameSize.y - (buttonSize * numberOfButtonsInColumn) - (padding * (numberOfButtonsInColumn - 1))) / 2f : padding;
            var baseButtonY         = -verticalMargin;
            var clearedStages       = ClearedStages.Load();
            var buttonObjectHolders = new List <ButtonObjectHolder>();
            for (var stageIndex = 0; stageIndex < stageCount; ++stageIndex)
            {
                var buttonObject = Instantiate(Resources.Load <GameObject>(ResourceNames.stageButton));
                buttonObjectHolders.Add(new ButtonObjectHolder(
                                            stageIndex,
                                            baseButtonY,
                                            buttonObject
                                            ));
                buttonObject.transform.SetParent(innerFrameObject.transform, false);
                var buttonRectTransform = buttonObject.GetComponent <RectTransform>();
                var indexInRow          = (stageIndex % numberOfButtonsInRow);
                buttonRectTransform.anchoredPosition = new Vector2(
                    (buttonSize * indexInRow) + (padding * indexInRow) + horizontalMargin,
                    baseButtonY + Screen.height
                    );
                buttonRectTransform.sizeDelta = new Vector2(buttonSize, buttonSize);
                var button = buttonObject.GetComponent <Button>();
                button.onClick.AddListener(() =>
                {
                    curtainObject.transform.SetAsLastSibling();
                    HandleStageButton(button, curtainManager);
                });
                var text  = buttonObject.GetComponentInChildren <Text>();
                text.text = (stageIndex + 1).ToString();
                if (clearedStages.stageIndices.Contains(stageIndex))
                {
                    var image    = buttonObject.GetComponentInChildren <Image>();
                    image.sprite = Resources.Load <Sprite>(ResourceNames.stageButtonCleared);
                }
                if ((stageIndex + 1) % (numberOfButtonsInRow) == 0)
                {
                    baseButtonY -= (padding + buttonSize);
                }
            }
            buttonObjectHolders.Sort((h1, h2) =>
            {
                var y1 = h1.stageIndex / numberOfButtonsInRow;
                var y2 = h2.stageIndex / numberOfButtonsInRow;
                if (y1 != y2)
                {
                    return(y2 - y1);
                }
                var x1 = h1.stageIndex % numberOfButtonsInRow;
                var x2 = h2.stageIndex % numberOfButtonsInRow;
                return(x1 - x2);
            });
            var index = 0;
            var delay = 0.05f;
            foreach (var buttonObjectHolder in buttonObjectHolders)
            {
                var buttonObject      = buttonObjectHolder.buttonObject;
                var animationDuration = 0.5f + (delay * index);
                buttonObject.GetComponent <UIAnimator>().Animate(UIAnimator.AnimationKey.PositionY, animationDuration, buttonObjectHolder.y, (animator) =>
                {
                    SoundWareHouse.Instance.seButtonDropped.GetComponent <AudioSource>().Play();
                    return(true);
                });
                ++index;
            }
            return(true);
        });
    }