public void WriteInXMLFile(PatternRaceGame actualPatternToCheck, string playerName)
    {
        string fileName = FileNemForSavingSharableIA(playerName);

        LoadAiFile(playerName);

        if (_raceGameAi != null)
        {
            if (_raceGameAi._listPatternRaceGame.Count < _raceGameAi._maxPatternCount)
            {
                _raceGameAi._listPatternRaceGame.Add(actualPatternToCheck);
            }
            else
            {
                int indexMinScore = 0;
                for (int i = 1; i < _raceGameAi._listPatternRaceGame.Count; i++)
                {
                    if (_raceGameAi._listPatternRaceGame[i]._score < _raceGameAi._listPatternRaceGame[indexMinScore]._score)
                        indexMinScore = i;
                }

                _raceGameAi._listPatternRaceGame[indexMinScore] = actualPatternToCheck;
            }

            System.Xml.Serialization.XmlSerializer writer = new XmlSerializer(typeof(RaceGameAi));
            System.IO.FileStream file = System.IO.File.Create(fileName);

            writer.Serialize(file, _raceGameAi);

            file.Close();
        }
        else
        {
            Debug.Log("Error XML");
        }
    }
    // Update is called once per frame
    void Update()
    {
        if(carControl.position != 0 && _raceTime < 0 && !_aiScript.isInTheLab)
        {
           _timeEnd = Time.time;
            _raceTime = _timeEnd - _timeStart;
            _score = 1.0f / _raceTime * 1000.0f;

            float _averageAngleInside;
            float _averageAngleOutside;
            float _percentInsideTurn;
            float _percentInsideStraightLine;
            float _minDistanceTurn = 0.0f;

            _percentInsideTurn = _insideTurnCount / (_lookInsideStraightCount + _lookOutsideStraightCount) * 100.0f;
            _percentInsideStraightLine = _insideStraight / (_lookInsideStraightCount + _lookOutsideStraightCount) * 100.0f;
            _averageAngleInside = _angleSumInside / _lookInsideStraightCount;
            _averageAngleOutside = _angleSumOutside / _lookOutsideStraightCount;

            Debug.Log("Ecriture");
            patternRace = new PatternRaceGame(_score,_percentInsideStraightLine,_percentInsideTurn, _averageAngleInside,_averageAngleOutside, _minDistanceTurn);

           WriteXmlRaceScript writeXmlRaceScript = new WriteXmlRaceScript();

            Debug.Log(PlayerPrefs.GetString(carControl.playerName).ToUpper());

            writeXmlRaceScript.WriteInXMLFile(patternRace,PlayerPrefs.GetString(carControl.playerName).ToUpper());

            Debug.Log("Fin écriture");
        }

        if (carControl.enableController && carControl.position == 0)
        {
            if(_timeStart < 0 )
            {
                _timeStart  = Time.time;
            }
            if (_aiScript.HasCheckPoints())
            {
                // Pour savoir s'il regarde dans le sens du virage ou dans le sens opposé
                float angleCarForwardPreviousCurrentCheckPoint = 0;
                bool lookTurnDirection = true;

                if (_aiScript._nextCheckPoint)
                {
                    angleCarForwardPreviousCurrentCheckPoint = Vector3.Angle(transform.forward, _aiScript._currentCheckPoint.transform.position - _aiScript._previousCheckPoint.transform.position);

                    float angleCarForwardCurrentNextCheckPoint = Vector3.Angle(transform.forward, _aiScript._nextCheckPoint.transform.position - _aiScript._currentCheckPoint.transform.position);

                    if (angleCarForwardCurrentNextCheckPoint >= 90 && angleCarForwardCurrentNextCheckPoint <= 180)
                    {
                        //angleCarForwardPreviousCurrentCheckPoint = -angleCarForwardPreviousCurrentCheckPoint;
                        lookTurnDirection = false;

                        ++_lookOutsideStraightCount;
                    }
                    else
                        ++_lookInsideStraightCount;

                    _currentAngle = angleCarForwardPreviousCurrentCheckPoint;

                    // Pour savoir si le joueur est à l'interieur ou à l'exterieur du chemin
                    Vector3 previous = _aiScript._previousCheckPoint.transform.position;
                    Vector3 current = _aiScript._currentCheckPoint.transform.position;
                    Vector3 next = _aiScript._nextCheckPoint.transform.position;
                    Vector3 position = transform.position;

                    float previousCurrent = ((previous.x - position.x) * (current.z - position.z)) - ((previous.z - position.z) * (current.x - position.x));
                    float currentNext = ((current.x - position.x) * (next.z - position.z)) - ((current.z - position.z) * (next.x - position.x));
                    float nextPrevious = ((next.x - position.x) * (previous.z - position.z)) - ((next.z - position.z) * (previous.x - position.x));

                    Vector3 positionToPreviousCheckPoint = (_aiScript._previousCheckPoint.transform.position - _aiScript.transform.position);

                    // Cas voiture dans l'interieur du chemin
                    if ((previousCurrent > 0 && currentNext > 0 && nextPrevious > 0) || (previousCurrent < 0 && currentNext < 0 && nextPrevious < 0))
                    {
                        // Virage interieur
                        if (positionToPreviousCheckPoint.magnitude <= (Mathf.Max(_aiScript._previousCheckPoint._cubeSize.x, _aiScript._previousCheckPoint._cubeSize.z) / 1.5f))
                        {
                            ++_insideTurnCount;
                        }
                        // Ligne droite interieur
                        else
                        {
                            ++_insideStraight;

                            if (lookTurnDirection)
                            {
                                _angleSumInside += _currentAngle;
                            }
                            else
                            {
                                _angleSumOutside += _currentAngle;
                            }
                        }
                    }
                    // Cas voiture dans l'exterieur du chemin
                    else
                    {
                        // Virage exterieur
                        if (positionToPreviousCheckPoint.magnitude <= (Mathf.Max(_aiScript._previousCheckPoint._cubeSize.x, _aiScript._previousCheckPoint._cubeSize.z) / 1.5f))
                        {
                            ++_outsideTurnCount;
                        }
                        // Ligne droite exterieur
                        else
                        {
                            ++_outsideStraight;

                            if (lookTurnDirection)
                            {
                                _angleSumInside += _currentAngle;
                            }
                            else
                            {
                                _angleSumOutside += _currentAngle;
                            }
                        }
                    }

                   // Debug.Log((_angleSumInside / _lookInsideStraightCount) + " --- " + (_angleSumOutside / _lookOutsideStraightCount));
                }
            }

        }
    }
    // Use this for initialization
    void Start()
    {
        //_carControleScript._playerMove = false;
        _axeHorizontal = 0.0f;
        _path = _pathScript._path;

        if (_path.Count >= 3)
        {
            _previousCheckPoint = _path[_path.Count - 1];
            _currentCheckPoint = _path[0];
            _nextCheckPoint = _path[1];
        }

        if (isInTheLab)
        {
            Debug.Log("LAUCHING SHARABLE AI");
            ReadXmlRaceScript readXmlScript = new ReadXmlRaceScript();
            patternRaceGame = readXmlScript.ReadXmlFile(PlayerPrefs.GetString(_carControleScript.playerName));

            if(patternRaceGame != null)
            {
                Debug.Log("Pattern Loaded");
                _angleMaxRange = patternRaceGame._averageAngleInside;
            }
        }

        StartCoroutine(randomAngle());
    }