public static void CreateAtEmpty(ref PuzzleData puzzleData,PuzzleOperaterParam puzzleParam,Material[] puzzleColorList)
    {
        // Rearranged in ascending order of ID puzzles
        puzzleData.Sort();
        // Create
        puzzleData.pieceObjectList.ForEach((GameObject pieceObject) =>
        {
            PuzzlePiece targetPiece = pieceObject.GetComponent<PuzzlePiece>();
            // Create a new puzzle piece ID that is not used
            if(targetPiece.used == false)
            {
                // Resume Puzzle Piece
                targetPiece.Resume();

                // Set Puzzle position
                Vector3 endPos 		= PuzzleCalculator.GetPiecePosition(puzzleParam,targetPiece.ID);
                Vector3 startPos	= endPos;
                endPos.z			= -50;
                targetPiece.Move(startPos,endPos,puzzleParam.moveTime);

                // Set the color to random.
                int typeNo = Random.Range(0,puzzleColorList.Length);
                targetPiece.SetColor(typeNo,puzzleColorList[typeNo]);
            }
        } );
    }
    public static void SortByRefEmpty(ref PuzzleData puzzleData,PuzzleOperaterParam puzzleParam)
    {
        // Rearranged in ascending order of ID puzzles
        puzzleData.Sort();

        for(int puzzleNo = puzzleData.pieceObjectList.Count - 1; puzzleNo >= 0;puzzleNo--)
        {
            Vector3 puzzlePos = Vector3.zero;
            PuzzlePiece nowPiece = puzzleData.pieceObjectList[puzzleNo].GetComponent<PuzzlePiece>();

            // It moves one on the target is empty
            int targetRowNo = PuzzleCalculator.GetPieceRowNo(puzzleParam,nowPiece.ID);
            if(targetRowNo < puzzleParam.maxRows - 1)
            {
                // Check until it can move
                for(int id = nowPiece.ID + puzzleParam.maxColumns;id < puzzleParam.maxPuzzles;id += puzzleParam.maxColumns)
                {
                    GameObject emptyTemp = puzzleData.pieceObjectList[puzzleData.FindPieceObjectIndex(id)];
                    PuzzlePiece emptyPuzzle = emptyTemp.GetComponent<PuzzlePiece>();
                    if(emptyPuzzle.used == false)
                    {
                        emptyPuzzle.ID 	= nowPiece.ID;
                        nowPiece.ID = id;
                        emptyPuzzle.Stop();
                        emptyTemp.transform.position = PuzzleCalculator.GetPiecePosition(puzzleParam,emptyPuzzle.ID);
                    }
                }
            }

            nowPiece.MoveAmountClear();

            // Move puzzle piece
            Vector3 nowPos 		= puzzleData.pieceObjectList[puzzleNo].transform.position;
            Vector3 targetPos 	= PuzzleCalculator.GetPiecePosition(puzzleParam,nowPiece.ID);
            if(Vector3.Distance(nowPos,targetPos) > PuzzleCalculator.GetPieceSpaceOffset(puzzleParam))
                nowPiece.Move(targetPos,puzzleParam.moveTime);
        }
    }
    public static void SortByRefID(ref PuzzleData puzzleData,PuzzleOperaterParam puzzleParam)
    {
        // Rearranged in ascending order of ID puzzles
        puzzleData.Sort();

        puzzleData.pieceObjectList.ForEach((GameObject pieceObject) =>
        {
            PuzzlePiece targetPiece = pieceObject.GetComponent<PuzzlePiece>();
            Vector3 targetPos = PuzzleCalculator.GetPiecePosition(puzzleParam,targetPiece.ID);
            targetPiece.Move(targetPos,puzzleParam.moveTime);

        });
    }