bool SetButtonPositions()
    {
        InitLineSpace();

        List <BossTap> tempTapList   = new List <BossTap>();
        List <float>   tempWidthList = new List <float>();

        for (int i = 0; i < m_TapDic.Count; i++)
        {
            float width = m_TapDic[i].GetScaler().x;
            if (width < MinWidth)
            {
                width = MinWidth;
            }
            if (tempWidthList.Count == 0)
            {
                tempWidthList.Add(width);
                tempTapList.Add(m_TapDic[i]);
            }
            else
            {
                for (int j = 0; j < tempWidthList.Count; j++)
                {
                    if (width > tempWidthList[j])
                    {
                        tempWidthList.Insert(j, width);
                        tempTapList.Insert(j, m_TapDic[i]);
                        break;
                    }
                    else if (j == tempWidthList.Count - 1)
                    {
                        tempWidthList.Add(width);
                        tempTapList.Add(m_TapDic[i]);
                        break;
                    }
                }
            }
        }

        for (int i = 0; i < tempTapList.Count; i++)
        {
            List <PossibleRange> possibleRanges = GetPossibleRange(tempTapList[i]);
            if (possibleRanges.Count == 0)
            {
                return(false);
            }
            else
            {
                RefreshRandomSeed();
                int   index     = Random.Range(0, possibleRanges.Count);
                float leftEdge  = possibleRanges[index].LeftToRightRange.Key + tempWidthList[i] * 0.5f;
                float rightEdge = possibleRanges[index].LeftToRightRange.Value - tempWidthList[i] * 0.5f;
                RefreshRandomSeed();
                float posX = Random.Range(leftEdge, rightEdge);

                tempTapList[i].SetPosition(new Vector3(posX, m_LineHeight[possibleRanges[index].LineIndex]));
                PossibleRange possibleRange = new PossibleRange();
                possibleRange.LineIndex        = possibleRanges[index].LineIndex;
                possibleRange.LeftToRightRange = new KeyValuePair <float, float>(posX - tempWidthList[i] * 0.5f, posX + tempWidthList[i] * 0.5f);

                if (m_Lines[possibleRange.LineIndex].Space.Count == 0)
                {
                    m_Lines[possibleRange.LineIndex].Space.Add(possibleRange.LeftToRightRange);
                }
                else
                {
                    bool added = false;
                    for (int j = 0; j < m_Lines[possibleRange.LineIndex].Space.Count; j++)
                    {
                        if (possibleRange.LeftToRightRange.Key < m_Lines[possibleRange.LineIndex].Space[j].Key)
                        {
                            m_Lines[possibleRange.LineIndex].Space.Insert(j, possibleRange.LeftToRightRange);
                            added = true;
                            break;
                        }
                    }
                    if (!added)
                    {
                        m_Lines[possibleRange.LineIndex].Space.Add(possibleRange.LeftToRightRange);
                    }
                }
            }
        }

        return(true);
    }
    List <PossibleRange> GetPossibleRange(BossTap tap)
    {
        List <PossibleRange> result = new List <PossibleRange>();
        float width = tap.GetScaler().x + WidthExtra;

        if (width < MinWidth)
        {
            width = MinWidth;
        }
        for (int i = 0; i < m_LineHeight.Length; i++)
        {
            if (m_Lines[i].Space.Count == 0)
            {
                PossibleRange posRan = new PossibleRange();
                posRan.LineIndex        = i;
                posRan.LeftToRightRange = new KeyValuePair <float, float>(m_RectCenter - RectWidth * 0.5f, m_RectCenter + RectWidth * 0.5f);
                result.Add(posRan);
                continue;
            }
            else
            {
                for (int j = 0; j < m_Lines[i].Space.Count; j++)
                {
                    float leftEdge, rightEdge;
                    if (j == 0)
                    {
                        leftEdge = m_RectCenter - RectWidth * 0.5f;
                    }
                    else
                    {
                        leftEdge = m_Lines[i].Space[j - 1].Value;
                    }

                    if (j == m_Lines[i].Space.Count - 1)
                    {
                        rightEdge = m_RectCenter + RectWidth * 0.5f;
                    }
                    else
                    {
                        rightEdge = m_Lines[i].Space[j + 1].Key;
                    }


                    if (m_Lines[i].Space[j].Key - leftEdge > width)
                    {
                        PossibleRange posRan = new PossibleRange();
                        posRan.LineIndex        = i;
                        posRan.LeftToRightRange = new KeyValuePair <float, float>(leftEdge, m_Lines[i].Space[j].Key);
                        result.Add(posRan);
                    }

                    if (j == m_Lines[i].Space.Count - 1)
                    {
                        if (rightEdge - m_Lines[i].Space[j].Value > width)
                        {
                            PossibleRange posRan = new PossibleRange();
                            posRan.LineIndex        = i;
                            posRan.LeftToRightRange = new KeyValuePair <float, float>(m_Lines[i].Space[j].Value, rightEdge);
                            result.Add(posRan);
                        }
                    }
                }
            }
        }
        return(result);
    }