public void loadLevel()
    {
        Stream stream = File.Open(Application.dataPath + "/Levels/" + panelUILoad.transform.FindChild("LabelFile").GetComponent<UILabel>().text, FileMode.Open);
        BinaryFormatter bformatter = new BinaryFormatter();
        bformatter.Binder = new VersionDeserializationBinder();
        Level l = (Level)bformatter.Deserialize(stream);
        stream.Close();

        //purge
        actualLevel.purge(maxWidth, maxHeight, maxVolume);
        for(int i=0; i<listUIEnemy.Count; i++)
        {
            for(int j=0; j<listUIEnemy.ElementAt(i).Value.Count; j++)
            {
                Destroy(listUIEnemy.ElementAt(i).Value.ElementAt(j));
            }
        }
        listUIEnemy.Clear();

        //load
        actualLevel.loadLevel(l);

        //Recreate the world
        var theLevelState = actualLevel.getEntireBlocState();
        for(int i=0; i<maxWidth; i++)
        {
            for(int j=0; j<maxHeight; j++)
            {
                for(int h=0; h<maxVolume; h++)
                {
                    if(theLevelState[i,j,h] == BLOCSTATE.CUBE)
                    {
                        var go = (GameObject)Instantiate(h == 0 ? cubeBase : cubeBloc, new Vector3(j*2, h*2, i*2), cubeBase.transform.rotation);
                        actualLevel.setCube(i, j, h, go);
                        go.SetActive(true);
                    }

                    if(theLevelState[i,j,h] == BLOCSTATE.SPECIAL)
                    {
                        var go = (GameObject)Instantiate(special, new Vector3(j*2, h*2, i*2), special.transform.rotation);
                        actualLevel.setSpecial(i, j, h, go);
                        go.SetActive(true);
                    }
                }
            }
        }
        actualLevel.setStartPlayerPosition((int)l.getPlayerSpawn().x, (int)l.getPlayerSpawn().y);
        actualLevel.setFinishPlayerPosition((int)l.getPlayerFinish().x, (int)l.getPlayerFinish().y);
        playerSpawnValid.SetActive(true);
        playerSpawn.transform.position = new Vector3(l.getPlayerSpawn().y*2f, 2f, l.getPlayerSpawn().x*2f);
        playerFinishValid.SetActive(true);
        playerFinish.transform.position = new Vector3(l.getPlayerFinish().y*2f, 2f, l.getPlayerFinish().x*2f);

        //Recréation de la liste d'ennemy
        listUIEnemy = new Dictionary<Enemy, List<GameObject>>();
        for(int i=0; i<l.getEnemies().Count; i++)
        {
            var enemy = l.getEnemies().ElementAt(i);
            var go = (GameObject)Instantiate(enemy.isHelicopter ? enemyHelicoModel : enemyModel, new Vector3(enemy.startY*2, enemy.isHelicopter ? 6f : 2f, enemy.startX*2), enemyModel.transform.rotation);
            if(enemy.isHelicopter){
                actualLevel.setStartEnemyPosition(enemy.startX, enemy.startY, go);
            }else{
                actualLevel.setStartEnemyHelicoPosition(enemy.startX, enemy.startY, go);
            }
            go.SetActive(true);
            go.transform.GetComponent<Enemy>().loadEnemy(enemy);
            listUIEnemy.Add(go.transform.GetComponent<Enemy>(), new List<GameObject>());
            actualEnemyEdit = go.transform.GetComponent<Enemy>();
            for(int j=0; j<enemy.ea.Count; j++)
            {
                bool isDeplacement = ((int)actualEnemyEdit.getLastAction() <= 3);
                actualEnemyEdit.addAction(enemy.ea.ElementAt(j).state, enemy.ea.ElementAt(j).timeWait);
                if((int)enemy.ea.ElementAt(j).state <= 3)
                {
                    actualNumberAction = actualEnemyEdit.getNumberOfAction();
                    placeUIWay(enemy.ea.ElementAt(j).state, actualEnemyEdit.isHelico());
                }else{
                    if(isDeplacement)
                    {
                        placeUIAction(actualEnemyEdit.getLastPosition(), actualEnemyEdit.isHelico());
                    }
                }
                listUIEnemy[actualEnemyEdit].Last().SetActive(false);
            }
        }

        for(int i=0; i<l.getObjects().Count; i++)
        {
            var theObj = l.getObjects().ElementAt(i);
            if(theObj.isCanon)
            {
                var go = (GameObject)Instantiate(canonModel, new Vector3(theObj.positionY*2f, 2.2f, theObj.positionX*2f), canonModel.transform.rotation);
                actualLevel.setCanon((int)theObj.positionX, (int)theObj.positionY, go);
                go.SetActive(true);
                go.GetComponent<Canon>().setLook((LOOK)theObj.theLook);
                switch(theObj.theLook)
                {
                case LOOK.DOWN:
                    go.transform.eulerAngles = new Vector3(0f, 0f, 0f);
                    break;
                case LOOK.UP:
                    go.transform.eulerAngles = new Vector3(0f, 180f, 0f);
                    break;
                case LOOK.RIGHT:
                    go.transform.eulerAngles = new Vector3(0f, -90f, 0f);
                    break;
                case LOOK.LEFT:
                    go.transform.eulerAngles = new Vector3(0f, 90f, 0f);
                    break;
                }
            }else{
                var go = (GameObject)Instantiate(cameraEnModel, new Vector3(theObj.positionY*2f, 4f, theObj.positionX*2f), cameraEnModel.transform.rotation);
                actualLevel.setCameraEnemy((int)theObj.positionX, (int)theObj.positionY, go);
                go.GetComponent<CameraEnemy>().rightFirst = theObj.isRightFirst;
                go.SetActive(true);
                go.GetComponent<CameraEnemy>().setLook((LOOK)theObj.theLook);
                switch(theObj.theLook)
                {
                case LOOK.DOWN:
                    go.transform.eulerAngles = new Vector3(0f, 90f, 0f);
                    break;
                case LOOK.UP:
                    go.transform.eulerAngles = new Vector3(0f, -90f, 0f);
                    break;
                case LOOK.RIGHT:
                    go.transform.eulerAngles = new Vector3(0f, 0f, 0f);
                    break;
                case LOOK.LEFT:
                    go.transform.eulerAngles = new Vector3(0f, 180f, 0f);
                    break;
                }
            }
        }

        panelUILoad.SetActive(false);
        actualMode = EDITMODE.CUBE;
        oldWidthSelected = -1;
        oldHeightSelected = -1;
    }
    void UpdateHelico()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if(Physics.Raycast(ray, out hit)){
            //Detection de la position curseur
            UpdatePositionMouse(hit);

            //Verification de la nouvelle position
            if(actualWidthSelected != oldWidthSelected || actualHeightSelected != oldHeightSelected)
            {
                oldWidthSelected = actualWidthSelected;
                oldHeightSelected = actualHeightSelected;
                gridWidthSelected = (int)actualWidthSelected/2;
                gridHeightSelected = (int)actualHeightSelected/2;

                //Actualisation
                enemyHelicoCursor.transform.position = new Vector3(actualHeightSelected, 6f, actualWidthSelected);

                //Activation des curseur
                var blocStateStage = actualLevel.getBlocState(gridWidthSelected, gridHeightSelected, actualSizeSelected);
                if((blocStateStage == BLOCSTATE.EMPTY || blocStateStage == BLOCSTATE.HELICOSTART))
                {
                    if(blocStateStage == BLOCSTATE.HELICOSTART)
                    {
                        enemyHelicoHover.SetActive(true);
                        enemyHelicoValid.SetActive(false);
                    }else{
                        enemyHelicoHover.SetActive(false);
                        enemyHelicoValid.SetActive(true);
                    }

                    enemyHelicoInvalid.SetActive(false);
                }else{
                    enemyHelicoInvalid.SetActive(true);
                    enemyHelicoValid.SetActive(false);
                    enemyHelicoHover.SetActive(false);
                }
            }

        }else{
            enemyHelicoInvalid.SetActive(false);
            enemyHelicoValid.SetActive(false);
        }

        if(Input.GetMouseButton(0))
        {
            if(enemyHelicoValid.activeSelf){
                var go = (GameObject)Instantiate(enemyHelicoModel, new Vector3(actualHeightSelected, actualSizeSelected*2, actualWidthSelected), enemyHelicoModel.transform.rotation);
                actualLevel.setStartEnemyHelicoPosition(gridWidthSelected, gridHeightSelected, go);
                go.SetActive(true);
                go.transform.GetComponent<Enemy>().init (enemyLook, new Vector2((float)gridWidthSelected, (float)gridHeightSelected), true, true);
                listUIEnemy.Add(go.transform.GetComponent<Enemy>(), new List<GameObject>());
                enemyHelicoValid.SetActive(false);
                actualMode = EDITMODE.CUBE;
                oldWidthSelected = -1;
                oldHeightSelected = -1;
            }else if(enemyHelicoHover.activeSelf)
            {
                enemyHelicoHover.SetActive(false);
                actualEnemyEdit = actualLevel.getGameObjectAt(gridWidthSelected, gridHeightSelected, 3).transform.GetComponent<Enemy>();
                lastEnemyEditPosition = actualEnemyEdit.getLastPosition();
                refreshPossiblePositionActionHelico();
                panelUIEdit.SetActive(true);
                actualMode = EDITMODE.EDITHELICO;
                enableEnemyWay(actualEnemyEdit);
                oldWidthSelected = -1;
                oldHeightSelected = -1;
            }

        }else if(Input.GetMouseButtonDown(1) && enemyHelicoValid.activeSelf){

            enemyLook++;
            if((int) enemyLook >= 4)
            {
                enemyLook = (LOOK) 0;
            }
            switch(enemyLook)
            {
            case LOOK.DOWN:
                enemyHelicoValid.transform.eulerAngles = new Vector3(0f, 90f, 0f);
                enemyHelicoInvalid.transform.eulerAngles = new Vector3(0f, 90f, 0f);
                enemyHelicoHover.transform.eulerAngles = new Vector3(0f, 90f, 0f);
                break;
            case LOOK.UP:
                enemyHelicoValid.transform.eulerAngles = new Vector3(0f, -90f, 0f);
                enemyHelicoInvalid.transform.eulerAngles = new Vector3(0f, -90f, 0f);
                enemyHelicoHover.transform.eulerAngles = new Vector3(0f, -90f, 0f);
                break;
            case LOOK.RIGHT:
                enemyHelicoValid.transform.eulerAngles = new Vector3(0f, 0f, 0f);
                enemyHelicoInvalid.transform.eulerAngles = new Vector3(0f, 0f, 0f);
                enemyHelicoHover.transform.eulerAngles = new Vector3(0f, 0f, 0f);
                break;
            case LOOK.LEFT:
                enemyHelicoValid.transform.eulerAngles = new Vector3(0f, 180f, 0f);
                enemyHelicoInvalid.transform.eulerAngles = new Vector3(0f, 180f, 0f);
                enemyHelicoHover.transform.eulerAngles = new Vector3(0f, 180f, 0f);
                break;
            }
            oldWidthSelected = -1;
            oldHeightSelected = -1;

        }
        if(Input.GetKeyDown(KeyCode.Escape))
        {
             quitSpawnEnemy();
        }

        UpdateCamera();
    }