fix: 변경된 스킬 데이터가 정상적으로 매핑되지 않는 오류 수정
This commit is contained in:
		@@ -0,0 +1,133 @@
 | 
			
		||||
using System.Collections;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using BackEnd;
 | 
			
		||||
using UnityEngine;
 | 
			
		||||
 | 
			
		||||
namespace TON
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// 뒤끝 서버 사용자 스킬 슬롯 데이터 관리 담당 클래스
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public class BackendSkillDataManager
 | 
			
		||||
    {
 | 
			
		||||
        // 테이블 이름 상수
 | 
			
		||||
        private const string SKILL_TABLE = "USER_SKILL_DATA";
 | 
			
		||||
 | 
			
		||||
        // 내 스킬 슬롯롯 데이터 조회
 | 
			
		||||
        public void LoadMySkillData(System.Action<UserSkillData> onComplete)
 | 
			
		||||
        {
 | 
			
		||||
            UserSkillData userSkillData = new UserSkillData();
 | 
			
		||||
 | 
			
		||||
            Backend.PlayerData.GetMyData(SKILL_TABLE, callback =>
 | 
			
		||||
            {
 | 
			
		||||
                if (callback.IsSuccess() == false)
 | 
			
		||||
                {
 | 
			
		||||
                    Debug.Log("스킬 슬롯 정보 읽기 중에 문제가 발생했습니다 : " + callback.ToString());
 | 
			
		||||
                    onComplete?.Invoke(userSkillData);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // 불러오기에는 성공했으나 데이터가 존재하지 않는 경우
 | 
			
		||||
                if (callback.IsSuccess() && callback.FlattenRows().Count <= 0)
 | 
			
		||||
                {
 | 
			
		||||
                    Debug.Log("데이터가 존재하지 않습니다");
 | 
			
		||||
                    InsertInitData(userSkillData, () =>
 | 
			
		||||
                    {
 | 
			
		||||
                        // 초기 데이터 삽입 후 다시 데이터를 불러옴
 | 
			
		||||
                        LoadDataAfterInsert(onComplete);
 | 
			
		||||
                    });
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (callback.IsSuccess())
 | 
			
		||||
                {
 | 
			
		||||
                    // 데이터를 SkillData 객체로 변환합니다.
 | 
			
		||||
                    userSkillData.slot_1 = callback.FlattenRows()[0]["slot_1"].ToString() ?? string.Empty;
 | 
			
		||||
                    userSkillData.slot_2 = callback.FlattenRows()[0]["slot_2"].ToString() ?? string.Empty;
 | 
			
		||||
                    userSkillData.slot_3 = callback.FlattenRows()[0]["slot_3"].ToString() ?? string.Empty;
 | 
			
		||||
                    onComplete?.Invoke(userSkillData);
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    Debug.LogError("Failed to load skill data: " + callback.GetMessage());
 | 
			
		||||
                    onComplete?.Invoke(null);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 데이터 삽입 후 다시 불러오는 메소드
 | 
			
		||||
        private void LoadDataAfterInsert(System.Action<UserSkillData> onComplete)
 | 
			
		||||
        {
 | 
			
		||||
            Backend.PlayerData.GetMyData(SKILL_TABLE, callback =>
 | 
			
		||||
            {
 | 
			
		||||
                UserSkillData skillData = new UserSkillData();
 | 
			
		||||
 | 
			
		||||
                if (callback.IsSuccess() && callback.FlattenRows().Count > 0)
 | 
			
		||||
                {
 | 
			
		||||
                    skillData.slot_1 = callback.FlattenRows()[0]["slot_1"].ToString() ?? string.Empty;
 | 
			
		||||
                    skillData.slot_2 = callback.FlattenRows()[0]["slot_2"].ToString() ?? string.Empty;
 | 
			
		||||
                    skillData.slot_3 = callback.FlattenRows()[0]["slot_3"].ToString() ?? string.Empty;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                onComplete?.Invoke(skillData);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 스킬 슬롯 데이터 초기 row 삽입
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        private void InsertInitData(UserSkillData skillData, System.Action onComplete = null)
 | 
			
		||||
        {
 | 
			
		||||
            if (PlayerDataManager.Singleton.player == null)
 | 
			
		||||
            {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Param param = new Param();
 | 
			
		||||
            param.Add("slot_1", skillData.slot_1);
 | 
			
		||||
            param.Add("slot_2", skillData.slot_2);
 | 
			
		||||
            param.Add("slot_3", skillData.slot_3);
 | 
			
		||||
 | 
			
		||||
            Backend.PlayerData.InsertData(SKILL_TABLE, param, callback =>
 | 
			
		||||
            {
 | 
			
		||||
                if (callback.IsSuccess())
 | 
			
		||||
                {
 | 
			
		||||
                    Debug.Log("초기 스킬 데이터 삽입 성공");
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    Debug.LogError("초기 스킬 데이터 삽입 실패: " + callback.ToString());
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                onComplete?.Invoke();
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 스킬 슬롯 정보 업데이트
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public void UpdateSkillData(UserSkillData skillData, System.Action onComplete = null)
 | 
			
		||||
        {
 | 
			
		||||
            Param param = new Param();
 | 
			
		||||
            param.Add("slot_1", skillData.slot_1 ?? string.Empty);
 | 
			
		||||
            param.Add("slot_2", skillData.slot_2 ?? string.Empty);
 | 
			
		||||
            param.Add("slot_3", skillData.slot_3 ?? string.Empty);
 | 
			
		||||
 | 
			
		||||
            Backend.PlayerData.UpdateMyLatestData(SKILL_TABLE, param, callback =>
 | 
			
		||||
            {
 | 
			
		||||
                if (callback.IsSuccess())
 | 
			
		||||
                {
 | 
			
		||||
                    Debug.Log("스킬 정보 업데이트 성공");
 | 
			
		||||
                    onComplete?.Invoke();
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    Debug.LogError("스킬 정보 업데이트 실패: " + callback.ToString());
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,11 @@
 | 
			
		||||
fileFormatVersion: 2
 | 
			
		||||
guid: 04490730ace91bd4bb4659c90cebc8b3
 | 
			
		||||
MonoImporter:
 | 
			
		||||
  externalObjects: {}
 | 
			
		||||
  serializedVersion: 2
 | 
			
		||||
  defaultReferences: []
 | 
			
		||||
  executionOrder: 0
 | 
			
		||||
  icon: {instanceID: 0}
 | 
			
		||||
  userData: 
 | 
			
		||||
  assetBundleName: 
 | 
			
		||||
  assetBundleVariant: 
 | 
			
		||||
							
								
								
									
										22
									
								
								Gameton-06/Assets/Gameton/Scripts/GameData/UserSkillData.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								Gameton-06/Assets/Gameton/Scripts/GameData/UserSkillData.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
using System.Collections;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using UnityEngine;
 | 
			
		||||
 | 
			
		||||
namespace TON
 | 
			
		||||
{
 | 
			
		||||
    [System.Serializable]
 | 
			
		||||
    public class UserSkillData
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        public string slot_1;
 | 
			
		||||
        public string slot_2;
 | 
			
		||||
        public string slot_3;
 | 
			
		||||
 | 
			
		||||
        public UserSkillData()
 | 
			
		||||
        {
 | 
			
		||||
            slot_1 = "K0001";
 | 
			
		||||
            slot_2 = string.Empty;
 | 
			
		||||
            slot_3 = string.Empty;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,11 @@
 | 
			
		||||
fileFormatVersion: 2
 | 
			
		||||
guid: f73cb0db91f6ba244869f551e8091e79
 | 
			
		||||
MonoImporter:
 | 
			
		||||
  externalObjects: {}
 | 
			
		||||
  serializedVersion: 2
 | 
			
		||||
  defaultReferences: []
 | 
			
		||||
  executionOrder: 0
 | 
			
		||||
  icon: {instanceID: 0}
 | 
			
		||||
  userData: 
 | 
			
		||||
  assetBundleName: 
 | 
			
		||||
  assetBundleVariant: 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
using System.Collections;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using UnityEngine;
 | 
			
		||||
using UnityEngine.Assertions;
 | 
			
		||||
 | 
			
		||||
@@ -7,21 +8,48 @@ namespace TON
 | 
			
		||||
{
 | 
			
		||||
    public class SkillDataManager : SingletonBase<SkillDataManager>
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        public List<SkillData> skillDatas { get; private set; }
 | 
			
		||||
        public SerializableDictionary<string, SkillBase> skillInstances { get; private set; }
 | 
			
		||||
 | 
			
		||||
        private List<SkillBase> equippedSkills = new List<SkillBase>();
 | 
			
		||||
        private BackendSkillDataManager skillDataManager;
 | 
			
		||||
 | 
			
		||||
        // 각 단계별 이벤트 정의
 | 
			
		||||
        private event System.Action OnDataLoadComplete;
 | 
			
		||||
        private event System.Action OnSetupComplete;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        public void Initalize(System.Action onComplete = null)
 | 
			
		||||
 | 
			
		||||
        public void Initalize()
 | 
			
		||||
        {
 | 
			
		||||
            skillDataManager = new BackendSkillDataManager();
 | 
			
		||||
 | 
			
		||||
            // 각 단계별 이벤트 등록
 | 
			
		||||
            OnDataLoadComplete = () =>
 | 
			
		||||
            {
 | 
			
		||||
                SetSkillInstances();
 | 
			
		||||
                OnSetupComplete?.Invoke();
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            OnSetupComplete = () =>
 | 
			
		||||
            {
 | 
			
		||||
                GetActiveSkillInstance();
 | 
			
		||||
                // 장착된 스킬이 변경된 경우, UI 업데이트 실행할 수 있도록 onComplete 이벤트 등록
 | 
			
		||||
                onComplete?.Invoke();
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            // 첫 단계 시작
 | 
			
		||||
            LoadSkillData();
 | 
			
		||||
            SetSkillInstances();
 | 
			
		||||
            GetActiveSkillInstance();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void Update()
 | 
			
		||||
        {
 | 
			
		||||
            // 씬이 인게임일때만 돌게 조건 추가 (stage 이름을 가지고 잇을대?)
 | 
			
		||||
            SceneType activeScene = Main.Singleton.currentSceneType;
 | 
			
		||||
            // 씬이 인게임일 때만 스킬 쿨타임 업데이트 되도록 적용
 | 
			
		||||
            if (activeScene != SceneType.Stage)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            foreach (var skill in equippedSkills)
 | 
			
		||||
            {
 | 
			
		||||
                UpdateSkillCoolDown(skill.SkillData.id);
 | 
			
		||||
@@ -35,8 +63,9 @@ namespace TON
 | 
			
		||||
                skillDatas.Clear();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            JSONLoader.SaveJsonToPersistentData("skill");
 | 
			
		||||
            skillDatas = JSONLoader.LoadJsonFromPersistentData<List<SkillData>>("skill");
 | 
			
		||||
            // gamedata 폴더에 있는 skill.json 파일을 불러옴
 | 
			
		||||
            skillDatas = JSONLoader.LoadFromResources<List<SkillData>>("skill");
 | 
			
		||||
            GetSkillDataList();
 | 
			
		||||
 | 
			
		||||
            if (skillDatas == null)
 | 
			
		||||
            {
 | 
			
		||||
@@ -44,8 +73,33 @@ namespace TON
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void UpdateSkillData(string skillId, int slotNumber)
 | 
			
		||||
        private void GetSkillDataList()
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            // 서버에 저장된 사용자의 스킬 슬롯 데이터를 가져옴
 | 
			
		||||
            skillDataManager.LoadMySkillData(userSkillData =>
 | 
			
		||||
            {
 | 
			
		||||
                // 스킬 슬롯 데이터가 없는 경우
 | 
			
		||||
                if (userSkillData == null)
 | 
			
		||||
                {
 | 
			
		||||
                    Debug.LogError("스킬 슬롯 데이터가 없습니다");
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // 스킬 슬롯 데이터가 있는 경우
 | 
			
		||||
                UpdateSkillData(userSkillData.slot_1, 1);
 | 
			
		||||
                UpdateSkillData(userSkillData.slot_2, 2);
 | 
			
		||||
                UpdateSkillData(userSkillData.slot_3, 3);
 | 
			
		||||
 | 
			
		||||
                // 다음 단계로 진행
 | 
			
		||||
                OnDataLoadComplete?.Invoke();
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void UpdateSkillData(string skillId, int slotNumber, System.Action onComplete = null)
 | 
			
		||||
        {
 | 
			
		||||
            // 현재 슬롯에 스킬이 있는지 확인
 | 
			
		||||
            foreach (var skill in skillDatas)
 | 
			
		||||
            {
 | 
			
		||||
                if (skill.id == skillId)
 | 
			
		||||
@@ -58,8 +112,29 @@ namespace TON
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Assert.IsTrue(JSONLoader.SaveUpdatedJsonToPersistentData(skillDatas, "skill"));
 | 
			
		||||
            Initalize();
 | 
			
		||||
            // 스킬 슬롯 데이터를 서버에 저장
 | 
			
		||||
            if (onComplete != null)
 | 
			
		||||
            {
 | 
			
		||||
                UpdateSkillSlotDataToServer(onComplete);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void UpdateSkillSlotDataToServer(System.Action onComplete)
 | 
			
		||||
        {
 | 
			
		||||
            UserSkillData userSkillData = new()
 | 
			
		||||
            {
 | 
			
		||||
                slot_1 = skillDatas.Find(skill => skill.slotNumber == 1)?.id,
 | 
			
		||||
                slot_2 = skillDatas.Find(skill => skill.slotNumber == 2)?.id,
 | 
			
		||||
                slot_3 = skillDatas.Find(skill => skill.slotNumber == 3)?.id
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            Debug.Log($"UpdateSkillSlotDataToServer() : {userSkillData.slot_1}, {userSkillData.slot_2}, {userSkillData.slot_3}");
 | 
			
		||||
 | 
			
		||||
            skillDataManager.UpdateSkillData(userSkillData, () =>
 | 
			
		||||
            {
 | 
			
		||||
                Initalize(onComplete);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void SetSkillInstances()
 | 
			
		||||
@@ -72,7 +147,7 @@ namespace TON
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 스킬 슬롯에 배치할 수 있는 스킬 수 리턴하는 메소드 
 | 
			
		||||
        // 스킬 슬롯에 배치할 수 있는 스킬 수 리턴하는 메소드
 | 
			
		||||
        public int GetActiveSkillCount()
 | 
			
		||||
        {
 | 
			
		||||
            int characterLevel = PlayerDataManager.Singleton.player.level;
 | 
			
		||||
 
 | 
			
		||||
@@ -174,17 +174,19 @@ namespace TON
 | 
			
		||||
        public void OnClickSettingButton()
 | 
			
		||||
        {
 | 
			
		||||
            // 스킬 데이터 업데이트 할때 selectedSlotIndex +1 해서 넘겨줘야함
 | 
			
		||||
            SkillDataManager.Singleton.UpdateSkillData(selectedSkillId, selectedSlotIndex + 1);
 | 
			
		||||
            SkillDataManager.Singleton.UpdateSkillData(selectedSkillId, selectedSlotIndex + 1, () =>
 | 
			
		||||
            {
 | 
			
		||||
                // 스킬 업데이트 후 UI 갱신
 | 
			
		||||
                var unselectedSkill = createSkillInfo.Find(skill => skill.skillId == selectedSkillId);
 | 
			
		||||
                unselectedSkill?.UnselectedSkillInfo();
 | 
			
		||||
                createSkillSlots[selectedSlotIndex].UnselectedSlot();
 | 
			
		||||
 | 
			
		||||
            // 스킬 업데이트 후 UI 갱신
 | 
			
		||||
            var unselectedSkill = createSkillInfo.Find(skill => skill.skillId == selectedSkillId);
 | 
			
		||||
            unselectedSkill?.UnselectedSkillInfo();
 | 
			
		||||
            createSkillSlots[selectedSlotIndex].UnselectedSlot();
 | 
			
		||||
                selectedSkillId = null;
 | 
			
		||||
                selectedSlotIndex = -1;
 | 
			
		||||
 | 
			
		||||
            selectedSkillId = null;
 | 
			
		||||
            selectedSlotIndex = -1;
 | 
			
		||||
                RefreshUI();
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            RefreshUI();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void RefreshUI()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user