feat: 하트 시스템 서버로 이관

This commit is contained in:
aube.lee
2025-03-10 00:47:25 +09:00
parent 61aad8885e
commit 573eb2f1e1
6 changed files with 170 additions and 50 deletions

View File

@@ -0,0 +1,97 @@
using System.Collections;
using System.Collections.Generic;
using BackEnd;
using UnityEngine;
namespace TON
{
/// <summary>
/// 뒤끝 서버 유저 입장권(하트) 데이터 관리 담당 클래스
/// </summary>
public class BackendHeartDataManager
{
private const string HEART_TABLE = "HEART_DATA";
public void LoadMyHeartData(System.Action<HeartData> 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); // 성공 시 데이터 반환
}
});
}
/// <summary>
/// 캐릭터 초기 생성 시 row 삽입
/// </summary>
public void CreateNewPlayerHeart(HeartData heartData, System.Action<bool> 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<bool> 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);
}
});
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 017508e8e83a9f24b9af7526937a4693
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -8,9 +8,7 @@ namespace TON
{ {
public class HeartDataManager : SingletonBase<HeartDataManager> public class HeartDataManager : SingletonBase<HeartDataManager>
{ {
public List<HeartData> heartDatas { get; private set; }
public HeartData currentHeartData { get; private set; } public HeartData currentHeartData { get; private set; }
private int characterId;
public int maxHearts = 5; public int maxHearts = 5;
public int heartRechargeTime = 360; // 하트 충전 시간 6분 public int heartRechargeTime = 360; // 하트 충전 시간 6분
@@ -18,66 +16,80 @@ namespace TON
public int GetCurrentHearts() => currentHeartData.currentHearts; public int GetCurrentHearts() => currentHeartData.currentHearts;
public DateTime GetLastHeartTime() => DateTime.Parse(currentHeartData.lastHeartTime); public DateTime GetLastHeartTime() => DateTime.Parse(currentHeartData.lastHeartTime);
private int limitRetryCount = 0;
private BackendHeartDataManager heartDataManager;
protected override void Awake() private void OnEnable()
{ {
base.Awake(); heartDataManager = new BackendHeartDataManager();
LoadHeartData();
} }
private void LoadHeartData() public void Initalize(System.Action onComplete)
{ {
if (heartDatas != null) LoadHeartData(onComplete);
{ }
heartDatas.Clear();
}
JSONLoader.SaveJsonToPersistentData("heart"); private void LoadHeartData(System.Action onComplete)
heartDatas = JSONLoader.LoadJsonFromPersistentData<List<HeartData>>("Heart"); {
if (heartDatas == null) // * 사용자 정보 서버에서 조회
heartDataManager.LoadMyHeartData(heartData =>
{ {
heartDatas = new List<HeartData>(); SetCurrentUserHeart(heartData, onComplete);
} });
} }
// 캐릭터 생성 시 하트 초기값 생성 // 캐릭터 생성 시 하트 초기값 생성
public void CreateNewHeartSystem(int characterId) public void CreateNewHeartSystem(System.Action onComplete = null)
{ {
HeartData heartData = new HeartData(characterId); HeartData heartData = new HeartData();
heartDatas.Add(heartData);
Assert.IsTrue(JSONLoader.SaveUpdatedJsonToPersistentData(heartDatas, "heart")); heartDataManager.CreateNewPlayerHeart(heartData, isSuccess =>
LoadHeartData(); {
if (isSuccess)
{
Debug.Log("캐릭터 생성 시 하트 초기값 생성 성공");
SetCurrentUserHeart(heartData, onComplete);
}
});
} }
public void SetCurrentUserHeart() public void SetCurrentUserHeart(HeartData heartData, System.Action onComplete = null)
{ {
characterId = 0; currentHeartData = heartData;
if (characterId > -1 && heartDatas.Count > 0) if (currentHeartData != null)
{ {
currentHeartData = heartDatas[characterId]; RechargeHearts();
if (currentHeartData != null) onComplete?.Invoke();
{
RechargeHearts();
}
else
{
Debug.Log("하트 정보 불러오기 중 오류 발생 ::: 초기값으로 재정의 합니다.");
CreateNewHeartSystem(characterId);
}
} }
else else
{ {
Debug.LogError("유효하지 않은 캐릭터 정보입니다."); if (limitRetryCount > 3)
} {
Debug.LogError($"하트 정보를 정상적으로 불러올 수 없어 초기값을 강제 적용합니다.");
currentHeartData = new HeartData();
onComplete?.Invoke();
}
limitRetryCount++;
Debug.LogError($"하트 불러오기 중 오류 발생 ::: 재시도 {limitRetryCount}");
CreateNewHeartSystem(onComplete);
}
} }
// 하트 데이터 저장 // 하트 데이터 저장
public void SaveHeartData() public void SaveHeartData()
{ {
heartDatas[characterId] = currentHeartData; heartDataManager.UpdatePlayerHeartData(currentHeartData, isSuccess =>
Assert.IsTrue(JSONLoader.SaveUpdatedJsonToPersistentData(heartDatas, "heart")); {
LoadHeartData(); if (isSuccess)
{
Debug.Log("하트 데이터 업데이트 성공");
}
else
{
Debug.LogError("하트 데이터 업데이트 성공");
}
});
} }
// 게임이 다시 실행될때 마지막 하트 소모 시간과 현재 시간을 계산해서 하트 충전량을 반영 // 게임이 다시 실행될때 마지막 하트 소모 시간과 현재 시간을 계산해서 하트 충전량을 반영
@@ -143,7 +155,6 @@ namespace TON
if (heartSystem != null) if (heartSystem != null)
{ {
heartSystem.UpdateHeartUI(); // UI 업데이트 heartSystem.UpdateHeartUI(); // UI 업데이트
} }
} }

View File

@@ -8,16 +8,13 @@ namespace TON
[System.Serializable] [System.Serializable]
public class HeartData public class HeartData
{ {
// 캐릭터 아이디
public int characterId;
// 현재 하트 개수 // 현재 하트 개수
public int currentHearts; public int currentHearts;
public string lastHeartTime; public string lastHeartTime;
// 캐릭터 생성시 하트 데이터 생성자 // 캐릭터 생성시 하트 데이터 생성자
public HeartData(int characterId) public HeartData()
{ {
this.characterId = characterId;
currentHearts = 5; currentHearts = 5;
lastHeartTime = null; lastHeartTime = null;
} }

View File

@@ -123,12 +123,14 @@ namespace TON
if (isSuccess) if (isSuccess)
{ {
// 하트 시스템을 생성한다 // 하트 시스템을 생성한다
HeartDataManager.Singleton.CreateNewHeartSystem(0); HeartDataManager.Singleton.CreateNewHeartSystem();
HeartDataManager.Singleton.SetCurrentUserHeart(); HeartDataManager.Singleton.Initalize(() =>
{
// 씬 변경
UIManager.Hide<CharaterCreateUI>(UIList.CharaterCreateUI);
Main.Singleton.ChangeScene(SceneType.Intro);
});
// 씬 변경
UIManager.Hide<CharaterCreateUI>(UIList.CharaterCreateUI);
Main.Singleton.ChangeScene(SceneType.Intro);
} }
}); });

View File

@@ -28,8 +28,10 @@ namespace TON
} }
else else
{ {
HeartDataManager.Singleton.SetCurrentUserHeart(); HeartDataManager.Singleton.Initalize(() =>
Main.Singleton.ChangeScene(SceneType.Lobby); {
Main.Singleton.ChangeScene(SceneType.Lobby);
});
} }
} }