//플레이어 스탯과 각종 정보들을 저장하는 함수
    public void Write_Player_Info()
    {
        string[,] playerInfoString = { { "SlotNum", "Date", "ID", "Name", "Move Speed", "Rotate Speed", "Health", "Mana", "Power", "Damage", "Critical Rate", "Critical Point", "Level", "Exp", "Gold", "Cash", "Equipped Skin", "EquippedSkill0", "EquippedSkill1", "EquippedSkill2", "Stage0Lock" },
                                       { "",        "",     "",   "",     "",           "",             "",       "",     "",      "",       "",              "",               "",      "",    "",     "",     "",              "",               "",               "",               ""           } };

        ////값이 반영됨. 저장 성공
        ////제대로 저장되는 지 확인하기 위한 코딩
        //playerInfo._SET_Player_Name = "Writing Success?";
        //playerInfo.__Buy_OR_Sell__About_Money("Gold", 1);

        //ID와 이름
        playerInfoString[1, 0] = playerInfo._GET_Player_ID;
        playerInfoString[1, 1] = playerInfo._GET_Player_Name;
        //이동속도, 회전속도
        playerInfoString[1, 2] = playerController.__PLY_Stat.__PUB_Move_Speed.ToString();
        playerInfoString[1, 3] = playerController.__PLY_Stat.__PUB_Rotation_Speed.ToString();
        //체력, 마나, 파워
        playerInfoString[1, 4] = playerController.__PLY_Stat.__GET_Max_HP.ToString();
        playerInfoString[1, 5] = playerController.__PLY_Stat.__GET_Max_MP.ToString();
        playerInfoString[1, 6] = playerController.__PLY_Stat.__GET_Max_PP.ToString();
        //공격력, 크리티컬 확률, 크리티컬 계수
        playerInfoString[1, 7] = playerController.__PLY_Stat.__PUB_ATK__Val.ToString();
        playerInfoString[1, 8] = playerController.__PLY_Stat.__PUB_Critical_Rate.ToString();
        playerInfoString[1, 9] = playerController.__PLY_Stat.__PUB_Critical_P.ToString();
        //레벨, 경험치
        playerInfoString[1, 10] = playerInfo._GET_Player_Level.ToString();
        playerInfoString[1, 11] = playerInfo._GET_Player_Exp.ToString();
        //골드와 캐쉬
        playerInfoString[1, 12] = playerInfo._GET_Player_Gold.ToString();
        playerInfoString[1, 13] = playerInfo._GET_Player_Cash.ToString();
        //장착 중인 스킨 ID
        playerInfoString[1, 14] = playerInfo._GET_Player_SkinID;

        IO_CSV.Writer_CSV("/Sample__Player_Info.csv", playerInfoString);
    }
    //플레이어 스탯과 각종 정보들을 불러오는 함수
    private void Read_Player_Info(int saveSlotNum)
    {
        List <string> playerInfoList = IO_CSV.__Get_pieces_OF_BaseStrings(IO_CSV.Reader_CSV("/SaveSlot.csv")[saveSlotNum]);

        playerInfo.Set_Player_Infomation(playerInfoList);
        playerController.__PLY_Stat.Initialize_Player_Stat(playerInfoList);
        playerController.Initialize_Player_EquippedSkills(playerInfoList);
    }
    void Awake()
    {
        //Sample_SkillDB에 저장된 스킬 내용들을 불러오기
        allSkills = IO_CSV.__Get_All_SkillBaseStat();

        //Sample_Player_Info에 저장된 스킬 내용들 불러오기
        equippedSkills = Player_Info_Manager.Read_Equipped_SkillBaseStat();
    }
    void Awake()
    {
        playerController = GameObject.Find("SamplePlayer").GetComponent <PlayerController>();

        //SaveSlot.cs 파일이 없다면 값 초기화, 있다면 아무것도 안 함
        IO_CSV.InitFiles();
        //SaveSlot.cs 파일에서 플레이어 정보를 읽어온다.
        Read_Player_Info();
    }
    //저장슬롯에 따라 플레이어 스탯과 각종 정보들을 저장하는 함수
    public void Write_Player_Info(int slotNum)
    {
        string[] playerInfoString = new string[21];

        ////값이 반영됨. 저장 성공
        ////제대로 저장되는 지 확인하기 위한 코딩
        playerInfo._SET_Player_Name = "NEWNEW Writing Success?";
        //playerInfo.__Buy_OR_Sell__About_Money("Gold", 1);

        //저장슬롯ID, 저장날짜
        playerInfoString[0] = playerInfo._GET_saveSlotNum.ToString();
        playerInfoString[1] = System.DateTime.Now.ToString();
        //ID와 이름
        playerInfoString[2] = playerInfo._GET_Player_ID;
        playerInfoString[3] = playerInfo._GET_Player_Name;
        //이동속도, 회전속도
        playerInfoString[4] = playerController.__PLY_Stat.__PUB_Move_Speed.ToString();
        playerInfoString[5] = playerController.__PLY_Stat.__PUB_Rotation_Speed.ToString();
        //체력, 마나, 파워
        playerInfoString[6] = playerController.__PLY_Stat.__GET_Max_HP.ToString();
        playerInfoString[7] = playerController.__PLY_Stat.__GET_Max_MP.ToString();
        playerInfoString[8] = playerController.__PLY_Stat.__GET_Max_PP.ToString();
        //공격력, 크리티컬 확률, 크리티컬 계수
        playerInfoString[9]  = playerController.__PLY_Stat.__PUB_ATK__Val.ToString();
        playerInfoString[10] = playerController.__PLY_Stat.__PUB_Critical_Rate.ToString();
        playerInfoString[11] = playerController.__PLY_Stat.__PUB_Critical_P.ToString();
        //레벨, 경험치
        playerInfoString[12] = playerInfo._GET_Player_Level.ToString();
        playerInfoString[13] = playerInfo._GET_Player_Exp.ToString();
        //골드와 캐쉬
        playerInfoString[14] = playerInfo._GET_Player_Gold.ToString();
        playerInfoString[15] = playerInfo._GET_Player_Cash.ToString();
        //장착 중인 스킨 ID
        playerInfoString[16] = playerInfo._GET_Player_SkinID;
        //장착 중인 스킬들
        playerInfoString[17] = playerController.__PLY_Selected_Skills[0].__Get_Skill_ID;
        playerInfoString[18] = playerController.__PLY_Selected_Skills[1].__Get_Skill_ID;
        playerInfoString[19] = playerController.__PLY_Selected_Skills[2].__Get_Skill_ID;
        //스테이지 진척도
        string stageString = "c";

        for (int i = 0; i < playerInfo._GET_stageIsLocked.Count; i++)
        {
            stageString += playerInfo._GET_stageIsLocked[i].ToString();
        }
        playerInfoString[20] = stageString;

        IO_CSV.Writer_CSV("/SaveSlot.csv", playerInfoString);
    }
    public void Initialize_U_Skill(SkillBaseStat whichSkill, bool isPlayerUsingThis_Input)
    {
        thisSkillStat = whichSkill;

        //나중엔 UltimateSkill DB를 따로 만들거나 기존의 SKill DB에 부가 효과에 대한 정보를 입력하고 거기서 읽어올 것.
        //아래 조치는 임시 조치

        //이속 디버프 추가
        subSkillStats.Add(IO_CSV.__Get_Searched_SkillBaseStat("NORMAL_SP_01"));
        //차이 확인을 위해 임의로 값을 변경한다. (상대 이속 & 회전속도를 70% 감소시키는 디버프)
        subSkillStats[0].__SET_Skill_Rate = 0.7f;

        isPlayerUsingThis = isPlayerUsingThis_Input;

        Destroy(gameObject, whichSkill.__GET_Skill_ING_Time);
    }
    public void InitialLize_Enemy_Stat(List <string> enemyStatBaseString)
    {
        enemyName = enemyStatBaseString[1];

        base.__PUB_Move_Speed     = float.Parse(enemyStatBaseString[2]);
        base.__PUB_Rotation_Speed = float.Parse(enemyStatBaseString[3]);

        base.__MAX_Health_Point = int.Parse(enemyStatBaseString[4]);
        base.__MAX_Mana_Point   = int.Parse(enemyStatBaseString[5]);
        base.__MAX_Power_Point  = int.Parse(enemyStatBaseString[6]);

        base.__PUB__Health_Point = base.__MAX_Health_Point;
        base.__PUB__Mana_Point   = base.__MAX_Mana_Point;
        base.__PUB__Power_Point  = 0;

        base.__PUB_ATK__Val      = int.Parse(enemyStatBaseString[7]);
        base.__PUB_Critical_Rate = float.Parse(enemyStatBaseString[8]);
        base.__PUB_Critical_P    = float.Parse(enemyStatBaseString[9]);

        base.FOriginalMoveSpeed   = base._Move_Speed;
        base.FOriginalRotateSpeed = base._Rotation_Speed;

        //소수점 이하는 내림해서 값이 결정됨.
        half_HP = (int)(__MAX_Health_Point / 2);

        ai_Level = int.Parse(enemyStatBaseString[10]);

        //ai_Level = 1;

        //Enemy가 장착한 스킬들
        enemySkillList.Add(IO_CSV.__Get_Searched_SkillBaseStat(enemyStatBaseString[11]));
        enemySkillList.Add(IO_CSV.__Get_Searched_SkillBaseStat(enemyStatBaseString[12]));
        enemySkillList.Add(IO_CSV.__Get_Searched_SkillBaseStat(enemyStatBaseString[13]));

        //버프, 디버프 통제용
        for (int i = 0; i < 5; i++)
        {
            __PUB_Stat_IsCoolTimeOn.Add(false);
            __PUB_Stat_Real_Locker.Add(false);
        }

        //기본 마나 회복
        __PUB_Stat_IsCoolTimeOn[2] = true;
    }
    //Read_EquippedSkills()에서 읽은 ID를 이용하여 Sample__SkilLDataBase.csv에서
    //해당되는 ID값의 SkillStat만 resultSkill에 넣어 반환할 것
    public static List <SkillBaseStat> Read_Equipped_SkillBaseStat()
    {
        List <SkillBaseStat> resultSkills   = new List <SkillBaseStat>();
        List <string>        equippedSkills = IO_CSV.Reader_CSV("/Sample__PlayerEquippedInfo.csv");

        //나중에 Exception 처리할 것
        if (equippedSkills[0] == "FileNotFoundException")
        {
            Debug.Log("Read_Equipped_SkillBaseStat: " + equippedSkills[0] + ", Sample__PlayerEquippedInfo.csv");
        }

        //필요없는 정보는 지운다. Reader_CSV에서 직접 지우도록 변경됨
        //equippedSkills.Remove("Skill_ID");

        //플레이어가 장착하고 있는 스킬들의 정보를 읽어온다.
        for (int i = 0; i < equippedSkills.Count; i++)
        {
            resultSkills.Add(IO_CSV.__Get_Searched_SkillBaseStat(equippedSkills[i]));
        }

        return(resultSkills);
    }
    void Awake()
    {
        //이속, 회전속도, 체력, 마나, 파워 게이지, 공격력, 크리확률, 크리계수, AI레벨
        //enemyStat.SampleInit(10.0f, 30.0f, 10, 10, 10, 1, 0.1f, 2.0f, 0);
        //enemyStat.SampleInit(10.0f, 30.0f, 10, 10, 10, 1, 0.1f, 2.0f, sample_AI_Level);
        enemyStat.InitialLize_Enemy_Stat(IO_CSV.__Get_Searched_EnemyBaseStat(unitID));

        //UnitBaseEngine에 Enemy라고 알려준다.
        enemyAIEngine._unitBaseEngine = transform.GetComponent <UnitBaseEngine>();

        enemyAIEngine.enemyCoolTimer = enemyCoolTimer;

        //CombatEngine에서 해당 클래스에 접근할 수 있도록 밑작업
        enemyAIEngine._unitBaseEngine.enemyController = this;
        enemyAIEngine._unitBaseEngine._unit_Combat_Engine.__SET_unit_Base_Engine = enemyAIEngine._unitBaseEngine;
        enemyAIEngine._unitBaseEngine._unit_Move_Engine._SET_unit_Base_Engine    = enemyAIEngine._unitBaseEngine;

        enemyAIEngine._unitBaseEngine._unit_Move_Engine.movingEffect = this.movingEffect;

        //Unit__Base_Engine이 Unit__Base_Stat 내용에 접근할 수 있도록 한다.
        enemyAIEngine._unitBaseEngine._unit_Stat = enemyStat;


        enemyAI = transform.GetComponent <EnemyAI>();

        for (int index = 0; index < enemyAIEngine._PUB_enemy_Is_ON_CoolTime.Length; index++)
        {
            enemyAIEngine._PUB_enemy_Is_ON_CoolTime[index] = true;
        }

        _AI_FuncList.Add(() => enemyAI.AI_Simple_Level0());
        _AI_FuncList.Add(() => enemyAI.AI_Simple_Level0_WITH_BOSS());
        _AI_FuncList.Add(() => enemyAI.AI_Simple_Level0_BOSS());
        _AI_FuncList.Add(() => enemyAI.AI_ReinforceLearn_RandomBehave_Ver());
        _AI_FuncList.Add(() => enemyAI.__OLD__AI_DeepLearning__BigData_Ver());
        _AI_FuncList.Add(() => enemyAI.AI_DeepLearning__BigData_Ver());

        aiLV = enemyStat._GET_ai_Level;
    }
    //스킬을 장착하는 함수
    private void Equip_Skill(string skillName)
    {
        try
        {
            //Exception 여부를 검사한다. (스킬을 추가로 장착할 수 있는지 확인한다.)
            MainSceneManagerSkillException.Validate_FullSkillInventoryException(buttonsSkillInventory);
            MainSceneManagerSkillException.Validate_SkillOverlapped_IN_InventoryException(skillName, equippedSkills);
            //(장착하려는 스킬이 잠겨있는 스킬인지 확인한다.)
            MainSceneManagerSkillException.Validate_SkillLockedException(IO_CSV.__Get_Searched_SkillBaseStat(skillName).__GET_isItLocked, player.GetComponent <Player_Info_Manager>().__GET_playerInfo._GET_saveSlotNum);

            //스킬을 장착할 빈 자리가 있으면 스킬을 장착한다.
            equippedSkills.Add(Search_SkillBaseStat_BY_Name_IN_List(skillName, allSkills));

            textSystemLog_Skill.text = skillName + "을(를) 장착합니다.";

            //정보를 업데이트한다.
            SkillEquipWindowCleaner();
        }
        //스킬을 장착할 빈 자리가 없는 경우
        catch (MainSceneManagerSkillException.FullSkillInventoryException)
        {
            //안내 메세지만 띄운다.
            textSystemLog_Skill.text = "더 장착할 수 없습니다.";
        }
        //장착하려고 하는 스킬이 이미 장착된 경우
        catch (MainSceneManagerSkillException.SkillOverlapped_IN_InventoryException)
        {
            //안내 메시지만 띄운다.
            textSystemLog_Skill.text = skillName + "을(를) 이미 장착했습니다.";
        }
        catch (MainSceneManagerSkillException.SkillLockedException)
        {
            //안내 메시지만 띄운다.
            textSystemLog_Skill.text = skillName + "은(는) 잠겨있는 스킬입니다.";
        }
    }
    //================================================================================================

    void Awake()
    {
        //================================================================================================
        //업그레이드 관련 내용 초기화
        //나중에 CSV 파일에서 읽어올것-------------------------------------------------------
        //--------------------------------------------
        statNameArray[0] = "이동속도";
        statNameArray[1] = "회전속도";

        statNameArray[2] = "최대 체력";
        statNameArray[3] = "최대 마력";
        statNameArray[4] = "최대 궁극지 게이지";

        statNameArray[5] = "공격력";
        statNameArray[6] = "치명타 확률";
        statNameArray[7] = "치명타 계수";
        //--------------------------------------------
        statValue[0] = 5f;
        statValue[1] = 5f;

        statValue[2] = 1f;
        statValue[3] = 1f;
        statValue[4] = 1f;

        statValue[5] = 1f;
        statValue[6] = 1f;
        statValue[7] = 0.1f;
        //--------------------------------------------
        statMinValue[0] = 5f;
        statMinValue[1] = 20f;

        statMinValue[2] = 5f;
        statMinValue[3] = 6f;
        statMinValue[4] = 7f;

        statMinValue[5] = 1f;
        statMinValue[6] = 5f;
        statMinValue[7] = 1.5f;
        //--------------------------------------------
        statMaxValue[0] = 100f;
        statMaxValue[1] = 90f;

        statMaxValue[2] = 30f;
        statMaxValue[3] = 25f;
        statMaxValue[4] = 20f;

        statMaxValue[5] = 10f;
        statMaxValue[6] = 20f;
        statMaxValue[7] = 3f;
        //--------------------------------------------
        statPrice[0] = 1;
        statPrice[1] = 2;

        statPrice[2] = 3;
        statPrice[3] = 4;
        statPrice[4] = 5;

        statPrice[5] = 6;
        statPrice[6] = 7;
        statPrice[7] = 8;
        //--------------------------------------------
        //---------------------------------------------------------------------------------
        //수정한 적 없으면 아래와 같이 -1로 초기화 한다.
        for (int index = 0; index < statBeforeSave.Length; index++)
        {
            statBeforeSave[index] = -1f;
        }

        //================================================================================================

        //================================================================================================
        //스킬 장착 관련 내용 초기화
        //Sample_SkillDB에 저장된 스킬 내용들을 불러오기
        allSkills = IO_CSV.__Get_All_SkillBaseStat();
        //================================================================================================
    }