/// <summary>
    /// コンテナを破壊してピースを開放する
    /// </summary>
    public void DestroyContainer()
    {
        //設定した変更を元に戻す
        foreach (Piece p in pieceArray)
        {
            p.noCollision = false;
            p.transform.SetParent(null);
            p.GetComponent <Collider2D>().enabled = true;
            StageGenerator.SetPiecePosition(p, p.transform.position);
            p.transform.position = p.position;
        }

        //パーティクル開放
        if (createParticle)
        {
            createParticle.transform.SetParent(null);
            ParticleManager.ParticleDestroy(createParticle);
        }
        if (moveParticle)
        {
            moveParticle.transform.SetParent(null);
            ParticleManager.ParticleDestroy(moveParticle);
        }

        Debug.Log("DestroyContainer");
        Destroy(gameObject);
    }
    /// <summary>
    /// 指定された座標へ動かす
    /// </summary>
    /// <param name="newPosition">移動する場所</param>
    /// <param name="isXDir">はさんでいる方向</param>
    public void Move(Vector2 newPosition, bool isXDir)
    {
        //角の座標を定義
        Vector2[] checkPosition = new Vector2[4];
        checkPosition[0] = new Vector2(-containerSize.x, -containerSize.y);
        checkPosition[1] = new Vector2(-containerSize.x, containerSize.y - 0.1f);
        checkPosition[2] = new Vector2(containerSize.x - 0.1f, -containerSize.y);
        checkPosition[3] = new Vector2(containerSize.x - 0.1f, containerSize.y - 0.1f);

        for (int i = 0; i < 4; i++)
        {
            checkPosition[i]  *= 0.5f;
            checkPosition[i]  += newPosition + new Vector2(0.5f, 0.5f);
            checkPosition[i].x = (int)checkPosition[i].x;
            checkPosition[i].y = (int)checkPosition[i].y;
        }


        /* x方向の制限 */
        bool isXCollision = false;

        if (isXDir)
        {
            for (int i = 0; i < 2; i++)
            {
                //チェック用の位置を保存
                Vector2 startPosition = checkPosition[i];
                Vector2 endPosition   = checkPosition[i + 2];

                //同じ座標も対応するので+1する
                endPosition.x += 1;

                //判定を連続でとる
                do
                {
                    Piece p = StageGenerator.GetPiece(startPosition);
                    if (p && !p.noCollision)
                    {
                        isXCollision = true;
                        break;
                    }

                    startPosition.x += 1;
                } while(startPosition != endPosition);

                if (isXCollision)
                {
                    break;
                }
            }
        }

        Vector2 hitPos = new Vector2();

        //方向がYの場合は+1まで検査
        if (!isXDir)
        {
            Vector2[] cy = new Vector2[4];
            cy[0] = newPosition + new Vector2(0.1f, -0.5f - containerSize.y * 0.5f);
            cy[1] = newPosition + new Vector2(0.9f, -0.5f - containerSize.y * 0.5f);
            cy[2] = newPosition + new Vector2(0.1f, 1.5f + containerSize.y * 0.5f);
            cy[3] = newPosition + new Vector2(0.9f, 1.5f + containerSize.y * 0.5f);

            foreach (var ccy in cy)
            {
                if (StageGenerator.GetPiece(ccy))
                {
                    hitPos       = StageGenerator.GetPiece(ccy).position;
                    isXCollision = true;
                    break;
                }
            }
        }

        if (isXCollision)
        {
            newPosition.y = (int)((transform.position.y + 0.25) * 2) * 0.5f;
        }


        /* y方向の制限 */
        bool isYCollision = false;

        if (!isXDir)
        {
            for (int i = 0; i < 2; i++)
            {
                //チェック用の位置を保存
                Vector2 startPosition = checkPosition[i * 2];
                Vector2 endPosition   = checkPosition[i * 2 + 1];

                //同じ座標も対応するので+1する
                endPosition.y += 1;

                //判定を連続でとる
                do
                {
                    Piece p = StageGenerator.GetPiece(startPosition);
                    if (p && !p.noCollision)
                    {
                        isYCollision = true;
                        break;
                    }

                    startPosition.y += 1;
                } while(startPosition != endPosition);

                if (isYCollision)
                {
                    break;
                }
            }
        }

        hitPos = new Vector2();
        //方向がXの場合は+1まで検査
        if (isXDir)
        {
            Vector2[] cx = new Vector2[4];
            cx[0] = newPosition + new Vector2(-0.5f - containerSize.x * 0.5f, 0.1f);
            cx[1] = newPosition + new Vector2(-0.5f - containerSize.x * 0.5f, 0.9f);
            cx[2] = newPosition + new Vector2(1.5f + containerSize.x * 0.5f, 0.1f);
            cx[3] = newPosition + new Vector2(1.5f + containerSize.x * 0.5f, 0.9f);

            foreach (var ccx in cx)
            {
                if (StageGenerator.GetPiece(ccx))
                {
                    hitPos       = StageGenerator.GetPiece(ccx).position;
                    isYCollision = true;
                    break;
                }
            }
        }

        if (isYCollision)
        {
            newPosition.x = (int)((transform.position.x + 0.25) * 2) * 0.5f;
        }


        //移動
        transform.position = newPosition;

        //座標を反映
        foreach (Piece p in pieceArray)
        {
            StageGenerator.SetPiecePosition(p, p.transform.position);
        }
    }