feat: 하트 시스템 서버로 이관
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 017508e8e83a9f24b9af7526937a4693
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -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 업데이트
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -28,8 +28,10 @@ namespace TON
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
HeartDataManager.Singleton.SetCurrentUserHeart();
|
HeartDataManager.Singleton.Initalize(() =>
|
||||||
Main.Singleton.ChangeScene(SceneType.Lobby);
|
{
|
||||||
|
Main.Singleton.ChangeScene(SceneType.Lobby);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user