void Start()
    {
        gameSceneController = GameObject.FindObjectOfType <GameSceneController>();

        // BGM
        if (BaseManager.globalMenuMusic != null)
        {
            StartCoroutine(AudioHelper.FadeAudioObject(BaseManager.globalMenuMusic, -1f));
        }
        if (BaseManager.globalGameMusic == null)
        {
            // create and return the Intro Scene music audio
            BaseManager.globalGameMusic = AudioHelper.CreateGetFadeAudioObject(BaseManager.GetInstance().gameMusic, true, BaseManager.GetInstance().fadeClip, "Audio-GameMusic");
            // play the clip
            StartCoroutine(AudioHelper.FadeAudioObject(BaseManager.globalGameMusic, 0.5f));
        }
        // Load data (if not done yet)
        GlobalData.LoadLevelData();


        if (GlobalData.gameMode == GlobalData.GameMode.PUZZLE_MODE)
        {
            // create board
            GameObject board = Instantiate(ModePuzzlePrefab) as GameObject;
            _bubbleBoard = board.GetComponent <IBubbleBoard>();

            // Set Data
            RequiredSquirrel  = GlobalData.LevelRequire[GlobalData.GetCurrentLevel()];
            RemainBubbleShoot = GlobalData.StarTarget[GlobalData.GetCurrentLevel()][0];

            if (GlobalData.GetCurrentLevel() >= 40)
            {
                RemainBubbleShoot += 15;
            }

            StarTargets[0] = GlobalData.StarTarget[GlobalData.GetCurrentLevel()][1];
            StarTargets[1] = GlobalData.StarTarget[GlobalData.GetCurrentLevel()][2];
            StarTargets[2] = GlobalData.StarTarget[GlobalData.GetCurrentLevel()][3];

            float maxPoint = StarTargets[2] + StarTargets[2] * 15 / 100;
            for (int i = 0; i < 3; i++)
            {
                RectTransform tf = StarTargetFlags[i].GetComponent <RectTransform>();
                tf.anchoredPosition = new Vector2(StarTargets[i] / maxPoint * 266f, tf.anchoredPosition.y);
            }


            // Levelselect switch
            LevelSelectController.NewUnlockedLevel           = -1;
            LevelSelectController.needUpdateMoveSquirrelIcon = false;
        }
        else if (GlobalData.gameMode == GlobalData.GameMode.ENDLESS_MODE)
        {
            LittleSquirrelController.publicList.Clear();

            // create board
            GameObject board = Instantiate(ModeEndlessPrefab) as GameObject;
            _bubbleBoard = board.GetComponent <IBubbleBoard>();

            // Set Data
            RequiredSquirrel  = -1;
            RemainBubbleShoot = -1;

            BubbleRemainBoard.SetActive(false);
            SquirrelCounter.SetActive(false);
            HUDBGEndless.SetActive(true);
            SplitBar.SetActive(true);

            RECT_ScoreBoard.anchoredPosition = new Vector2(-134, -16);
            RECT_StarBar.anchoredPosition    = new Vector2(-122, -52);
            RECT_StarRealBar.sizeDelta       = new Vector2(470, 12.8f);
            RECT_StarRealBar.GetComponent <Image>().sprite = longStarBarSprite;

            for (int i = 0; i < 3; i++)
            {
                StarTargetFlags[i].SetActive(false);
            }

            EndlessLastScore   = 0;
            EndlessTargetScore = GlobalData.ENDLESS_TARGET_EACHLEVEL;
        }

        // InitHUD

        foreach (UnityEngine.UI.Text txt in txtLevelLabels)
        {
            txt.text = GlobalData.GetCurrentLevel().ToString();
        }

        // Finish InitHUD


        UpdateHUD();

        gameStarted    = false;
        gameEnded      = false;
        allLoadingDone = false;
        _bubbleBoard.InitBubbleBoard();

        InitBubbles();
        _usingArrow = false;

        _shootArrow.CreateDots();
        _shootArrow.UpdateArrow();
    }