diff --git a/Gameton-06/Assets/Gameton/Scripts/Backend/BackendHeartDataManager.cs b/Gameton-06/Assets/Gameton/Scripts/Backend/BackendHeartDataManager.cs new file mode 100644 index 00000000..934d7b3b --- /dev/null +++ b/Gameton-06/Assets/Gameton/Scripts/Backend/BackendHeartDataManager.cs @@ -0,0 +1,97 @@ +using System.Collections; +using System.Collections.Generic; +using BackEnd; +using UnityEngine; + +namespace TON +{ + /// + /// 뒤끝 서버 유저 입장권(하트) 데이터 관리 담당 클래스 + /// + public class BackendHeartDataManager + { + private const string HEART_TABLE = "HEART_DATA"; + + public void LoadMyHeartData(System.Action onComplete) + { + HeartData heartData = new HeartData(); + + Backend.PlayerData.GetMyData(HEART_TABLE, callback => + { + if (callback.IsSuccess() == false) + { + Debug.Log("데이터 읽기 중에 문제가 발생했습니다 : " + callback.ToString()); + Main.Singleton.SystemQuit(); + return; + } + + // 불러오기에는 성공했으나 데이터가 존재하지 않는 경우 + if (callback.IsSuccess() && callback.FlattenRows().Count <= 0) + { + Debug.Log("데이터가 존재하지 않습니다"); + onComplete.Invoke(null); + return; + } + + // 정상적으로 플레이어 데이터를 불러온 경우 + if (callback.FlattenRows().Count > 0) + { + heartData.currentHearts = int.Parse(callback.FlattenRows()[0]["currentHearts"].ToString()); + + Debug.Log("test::: " + callback.FlattenRows()[0]["lastHeartTime"]); + heartData.lastHeartTime = callback.FlattenRows()[0]["lastHeartTime"].ToString(); + onComplete?.Invoke(heartData); // 성공 시 데이터 반환 + } + }); + } + + + /// + /// 캐릭터 초기 생성 시 row 삽입 + /// + public void CreateNewPlayerHeart(HeartData heartData, System.Action onComplete = null) + { + Param param = new Param(); + param.Add("currentHearts", heartData.currentHearts); + param.Add("lastHeartTime"); + + + Backend.PlayerData.InsertData(HEART_TABLE, param, callback => + { + if (callback.IsSuccess()) + { + Debug.Log("하트 입장권 생성 성공"); + onComplete?.Invoke(true); + } + else + { + Debug.LogError("하트 입장권 생성 실패: " + callback.ToString()); + onComplete?.Invoke(false); + } + + }); + } + + public void UpdatePlayerHeartData(HeartData heartData, System.Action onComplete = null) + { + Param param = new Param(); + param.Add("currentHearts", heartData.currentHearts); + param.Add("lastHeartTime", $"{heartData.lastHeartTime}"); + + Backend.PlayerData.UpdateMyLatestData(HEART_TABLE, param, (callback) => + { + if (callback.IsSuccess()) + { + Debug.Log("하트 입장권 업데이트 성공"); + onComplete?.Invoke(true); + } + else + { + Debug.LogError("하트 입장권 업데이트 실패: " + callback.ToString()); + onComplete?.Invoke(false); + } + }); + } + + } +} diff --git a/Gameton-06/Assets/Gameton/Scripts/Backend/BackendHeartDataManager.cs.meta b/Gameton-06/Assets/Gameton/Scripts/Backend/BackendHeartDataManager.cs.meta new file mode 100644 index 00000000..00903293 --- /dev/null +++ b/Gameton-06/Assets/Gameton/Scripts/Backend/BackendHeartDataManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 017508e8e83a9f24b9af7526937a4693 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartDataManager.cs b/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartDataManager.cs index 7840962d..ba7b13a5 100644 --- a/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartDataManager.cs +++ b/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartDataManager.cs @@ -8,9 +8,7 @@ namespace TON { public class HeartDataManager : SingletonBase { - public List heartDatas { get; private set; } public HeartData currentHeartData { get; private set; } - private int characterId; public int maxHearts = 5; public int heartRechargeTime = 360; // 하트 충전 시간 6분 @@ -18,66 +16,80 @@ namespace TON public int GetCurrentHearts() => currentHeartData.currentHearts; public DateTime GetLastHeartTime() => DateTime.Parse(currentHeartData.lastHeartTime); + private int limitRetryCount = 0; + private BackendHeartDataManager heartDataManager; - protected override void Awake() + private void OnEnable() { - base.Awake(); - LoadHeartData(); + heartDataManager = new BackendHeartDataManager(); } - private void LoadHeartData() + public void Initalize(System.Action onComplete) { - if (heartDatas != null) - { - heartDatas.Clear(); - } + LoadHeartData(onComplete); + } - JSONLoader.SaveJsonToPersistentData("heart"); - heartDatas = JSONLoader.LoadJsonFromPersistentData>("Heart"); - if (heartDatas == null) + private void LoadHeartData(System.Action onComplete) + { + // * 사용자 정보 서버에서 조회 + heartDataManager.LoadMyHeartData(heartData => { - heartDatas = new List(); - } + SetCurrentUserHeart(heartData, onComplete); + }); } // 캐릭터 생성 시 하트 초기값 생성 - public void CreateNewHeartSystem(int characterId) + public void CreateNewHeartSystem(System.Action onComplete = null) { - HeartData heartData = new HeartData(characterId); - heartDatas.Add(heartData); - Assert.IsTrue(JSONLoader.SaveUpdatedJsonToPersistentData(heartDatas, "heart")); - LoadHeartData(); + HeartData heartData = new HeartData(); + + heartDataManager.CreateNewPlayerHeart(heartData, isSuccess => + { + if (isSuccess) + { + Debug.Log("캐릭터 생성 시 하트 초기값 생성 성공"); + SetCurrentUserHeart(heartData, onComplete); + } + }); } - public void SetCurrentUserHeart() + public void SetCurrentUserHeart(HeartData heartData, System.Action onComplete = null) { - characterId = 0; - if (characterId > -1 && heartDatas.Count > 0) + currentHeartData = heartData; + if (currentHeartData != null) { - currentHeartData = heartDatas[characterId]; - if (currentHeartData != null) - { - RechargeHearts(); - } - else - { - Debug.Log("하트 정보 불러오기 중 오류 발생 ::: 초기값으로 재정의 합니다."); - CreateNewHeartSystem(characterId); - } + RechargeHearts(); + onComplete?.Invoke(); } else { - Debug.LogError("유효하지 않은 캐릭터 정보입니다."); - } + if (limitRetryCount > 3) + { + Debug.LogError($"하트 정보를 정상적으로 불러올 수 없어 초기값을 강제 적용합니다."); + currentHeartData = new HeartData(); + onComplete?.Invoke(); + } + limitRetryCount++; + Debug.LogError($"하트 불러오기 중 오류 발생 ::: 재시도 {limitRetryCount}"); + CreateNewHeartSystem(onComplete); + } } // 하트 데이터 저장 public void SaveHeartData() { - heartDatas[characterId] = currentHeartData; - Assert.IsTrue(JSONLoader.SaveUpdatedJsonToPersistentData(heartDatas, "heart")); - LoadHeartData(); + heartDataManager.UpdatePlayerHeartData(currentHeartData, isSuccess => + { + if (isSuccess) + { + Debug.Log("하트 데이터 업데이트 성공"); + } + else + { + Debug.LogError("하트 데이터 업데이트 성공"); + } + }); } // 게임이 다시 실행될때 마지막 하트 소모 시간과 현재 시간을 계산해서 하트 충전량을 반영 @@ -143,7 +155,6 @@ namespace TON if (heartSystem != null) { heartSystem.UpdateHeartUI(); // UI 업데이트 - } } diff --git a/Gameton-06/Assets/Gameton/Scripts/GameData/HeartData.cs b/Gameton-06/Assets/Gameton/Scripts/GameData/HeartData.cs index 9de1cf3b..d410b0f9 100644 --- a/Gameton-06/Assets/Gameton/Scripts/GameData/HeartData.cs +++ b/Gameton-06/Assets/Gameton/Scripts/GameData/HeartData.cs @@ -8,16 +8,13 @@ namespace TON [System.Serializable] public class HeartData { - // 캐릭터 아이디 - public int characterId; // 현재 하트 개수 public int currentHearts; public string lastHeartTime; // 캐릭터 생성시 하트 데이터 생성자 - public HeartData(int characterId) + public HeartData() { - this.characterId = characterId; currentHearts = 5; lastHeartTime = null; } diff --git a/Gameton-06/Assets/Gameton/Scripts/UI/CharaterCreateUI.cs b/Gameton-06/Assets/Gameton/Scripts/UI/CharaterCreateUI.cs index 9249497e..1a22acb7 100644 --- a/Gameton-06/Assets/Gameton/Scripts/UI/CharaterCreateUI.cs +++ b/Gameton-06/Assets/Gameton/Scripts/UI/CharaterCreateUI.cs @@ -123,12 +123,14 @@ namespace TON if (isSuccess) { // 하트 시스템을 생성한다 - HeartDataManager.Singleton.CreateNewHeartSystem(0); - HeartDataManager.Singleton.SetCurrentUserHeart(); + HeartDataManager.Singleton.CreateNewHeartSystem(); + HeartDataManager.Singleton.Initalize(() => + { + // 씬 변경 + UIManager.Hide(UIList.CharaterCreateUI); + Main.Singleton.ChangeScene(SceneType.Intro); + }); - // 씬 변경 - UIManager.Hide(UIList.CharaterCreateUI); - Main.Singleton.ChangeScene(SceneType.Intro); } }); diff --git a/Gameton-06/Assets/Gameton/Scripts/UI/TitleUI.cs b/Gameton-06/Assets/Gameton/Scripts/UI/TitleUI.cs index 14f1bf04..ed409345 100644 --- a/Gameton-06/Assets/Gameton/Scripts/UI/TitleUI.cs +++ b/Gameton-06/Assets/Gameton/Scripts/UI/TitleUI.cs @@ -28,8 +28,10 @@ namespace TON } else { - HeartDataManager.Singleton.SetCurrentUserHeart(); - Main.Singleton.ChangeScene(SceneType.Lobby); + HeartDataManager.Singleton.Initalize(() => + { + Main.Singleton.ChangeScene(SceneType.Lobby); + }); } }