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;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Assertions;
|
using UnityEngine.Assertions;
|
||||||
|
|
||||||
@@ -7,21 +8,48 @@ namespace TON
|
|||||||
{
|
{
|
||||||
public class SkillDataManager : SingletonBase<SkillDataManager>
|
public class SkillDataManager : SingletonBase<SkillDataManager>
|
||||||
{
|
{
|
||||||
|
|
||||||
public List<SkillData> skillDatas { get; private set; }
|
public List<SkillData> skillDatas { get; private set; }
|
||||||
public SerializableDictionary<string, SkillBase> skillInstances { get; private set; }
|
public SerializableDictionary<string, SkillBase> skillInstances { get; private set; }
|
||||||
|
|
||||||
private List<SkillBase> equippedSkills = new List<SkillBase>();
|
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();
|
LoadSkillData();
|
||||||
SetSkillInstances();
|
|
||||||
GetActiveSkillInstance();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Update()
|
private void Update()
|
||||||
{
|
{
|
||||||
// 씬이 인게임일때만 돌게 조건 추가 (stage 이름을 가지고 잇을대?)
|
SceneType activeScene = Main.Singleton.currentSceneType;
|
||||||
|
// 씬이 인게임일 때만 스킬 쿨타임 업데이트 되도록 적용
|
||||||
|
if (activeScene != SceneType.Stage)
|
||||||
|
return;
|
||||||
|
|
||||||
foreach (var skill in equippedSkills)
|
foreach (var skill in equippedSkills)
|
||||||
{
|
{
|
||||||
UpdateSkillCoolDown(skill.SkillData.id);
|
UpdateSkillCoolDown(skill.SkillData.id);
|
||||||
@@ -35,8 +63,9 @@ namespace TON
|
|||||||
skillDatas.Clear();
|
skillDatas.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONLoader.SaveJsonToPersistentData("skill");
|
// gamedata 폴더에 있는 skill.json 파일을 불러옴
|
||||||
skillDatas = JSONLoader.LoadJsonFromPersistentData<List<SkillData>>("skill");
|
skillDatas = JSONLoader.LoadFromResources<List<SkillData>>("skill");
|
||||||
|
GetSkillDataList();
|
||||||
|
|
||||||
if (skillDatas == null)
|
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)
|
foreach (var skill in skillDatas)
|
||||||
{
|
{
|
||||||
if (skill.id == skillId)
|
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()
|
public void SetSkillInstances()
|
||||||
@@ -72,7 +147,7 @@ namespace TON
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 스킬 슬롯에 배치할 수 있는 스킬 수 리턴하는 메소드
|
// 스킬 슬롯에 배치할 수 있는 스킬 수 리턴하는 메소드
|
||||||
public int GetActiveSkillCount()
|
public int GetActiveSkillCount()
|
||||||
{
|
{
|
||||||
int characterLevel = PlayerDataManager.Singleton.player.level;
|
int characterLevel = PlayerDataManager.Singleton.player.level;
|
||||||
|
|||||||
@@ -174,17 +174,19 @@ namespace TON
|
|||||||
public void OnClickSettingButton()
|
public void OnClickSettingButton()
|
||||||
{
|
{
|
||||||
// 스킬 데이터 업데이트 할때 selectedSlotIndex +1 해서 넘겨줘야함
|
// 스킬 데이터 업데이트 할때 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 갱신
|
selectedSkillId = null;
|
||||||
var unselectedSkill = createSkillInfo.Find(skill => skill.skillId == selectedSkillId);
|
selectedSlotIndex = -1;
|
||||||
unselectedSkill?.UnselectedSkillInfo();
|
|
||||||
createSkillSlots[selectedSlotIndex].UnselectedSlot();
|
|
||||||
|
|
||||||
selectedSkillId = null;
|
RefreshUI();
|
||||||
selectedSlotIndex = -1;
|
});
|
||||||
|
|
||||||
RefreshUI();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RefreshUI()
|
private void RefreshUI()
|
||||||
|
|||||||
Reference in New Issue
Block a user