feat: 게임 플레이 종료 후 클리어 정보 저장 및 랭킹 정보 저장 로직 추가
This commit is contained in:
@@ -0,0 +1,42 @@
|
|||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using BackEnd;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace TON
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 뒤끝 서버 게임 클리어 데이터 관리 담당 클래스
|
||||||
|
/// </summary>
|
||||||
|
public class BackendClearDataManager
|
||||||
|
{
|
||||||
|
// 테이블 이름 상수
|
||||||
|
private const string CLEAR_TABLE = "CLEAR_DATA";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 캐릭터 게임 클리어 시 row 삽입
|
||||||
|
/// </summary>
|
||||||
|
public void InsertInitData(ClearData clearData)
|
||||||
|
{
|
||||||
|
Param param = new Param();
|
||||||
|
param.Add("score", clearData.score);
|
||||||
|
param.Add("wave", clearData.wave);
|
||||||
|
param.Add("play_time", clearData.playTime);
|
||||||
|
param.Add("nickname", PlayerDataManager.Singleton.player.name);
|
||||||
|
|
||||||
|
Backend.PlayerData.InsertData(CLEAR_TABLE, param, callback =>
|
||||||
|
{
|
||||||
|
if (callback.IsSuccess())
|
||||||
|
{
|
||||||
|
Debug.Log("BackendClearDataManager 데이터 삽입 성공");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.LogError("BackendClearDataManager 데이터 삽입 실패: " + callback.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 54ac7e52b096e94489086a4bd8431f38
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,187 @@
|
|||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using BackEnd;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace TON
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 뒤끝 서버 게임 클리어 데이터 관리 담당 클래스
|
||||||
|
/// </summary>
|
||||||
|
public class BackendRankDataManager
|
||||||
|
{
|
||||||
|
// 테이블 이름 상수
|
||||||
|
private const string RANK_TABLE = "RANK_DATA";
|
||||||
|
|
||||||
|
|
||||||
|
// 내 게임 클리어 데이터 조회
|
||||||
|
public void LoadMyRankData(System.Action<ClearData> onComplete)
|
||||||
|
{
|
||||||
|
ClearData clearData = new ClearData();
|
||||||
|
|
||||||
|
Backend.PlayerData.GetMyData(RANK_TABLE, callback =>
|
||||||
|
{
|
||||||
|
if (callback.IsSuccess() == false)
|
||||||
|
{
|
||||||
|
Debug.Log("데이터 읽기 중에 문제가 발생했습니다 : " + callback.ToString());
|
||||||
|
onComplete?.Invoke(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 불러오기에는 성공했으나 데이터가 존재하지 않는 경우
|
||||||
|
if (callback.IsSuccess() && callback.FlattenRows().Count <= 0)
|
||||||
|
{
|
||||||
|
Debug.Log("데이터가 존재하지 않습니다");
|
||||||
|
InsertInitData(clearData, () =>
|
||||||
|
{
|
||||||
|
// 초기 데이터 삽입 후 다시 데이터를 불러옴
|
||||||
|
LoadDataAfterInsert(onComplete);
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1개 이상 데이터를 불러온 경우
|
||||||
|
if (callback.FlattenRows().Count > 0)
|
||||||
|
{
|
||||||
|
clearData.nickname = callback.FlattenRows()[0]["nickname"].ToString();
|
||||||
|
clearData.score = int.Parse(callback.FlattenRows()[0]["score"].ToString());
|
||||||
|
clearData.wave = int.Parse(callback.FlattenRows()[0]["wave"].ToString());
|
||||||
|
clearData.playTime = float.Parse(callback.FlattenRows()[0]["play_time"].ToString());
|
||||||
|
|
||||||
|
onComplete?.Invoke(clearData); // 성공 시 데이터 반환
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 데이터 삽입 후 다시 불러오는 메소드
|
||||||
|
private void LoadDataAfterInsert(System.Action<ClearData> onComplete)
|
||||||
|
{
|
||||||
|
Backend.PlayerData.GetMyData(RANK_TABLE, callback =>
|
||||||
|
{
|
||||||
|
ClearData clearData = new ClearData();
|
||||||
|
|
||||||
|
if (callback.IsSuccess() && callback.FlattenRows().Count > 0)
|
||||||
|
{
|
||||||
|
clearData.nickname = callback.FlattenRows()[0]["nickname"].ToString();
|
||||||
|
clearData.score = int.Parse(callback.FlattenRows()[0]["score"].ToString());
|
||||||
|
clearData.wave = int.Parse(callback.FlattenRows()[0]["wave"].ToString());
|
||||||
|
clearData.playTime = float.Parse(callback.FlattenRows()[0]["play_time"].ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
onComplete?.Invoke(clearData);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 캐릭터 초기 생성 시 row 삽입
|
||||||
|
/// </summary>
|
||||||
|
private void InsertInitData(ClearData clearData, System.Action onComplete = null)
|
||||||
|
{
|
||||||
|
Param param = new Param();
|
||||||
|
param.Add("score", clearData.score);
|
||||||
|
param.Add("wave", clearData.wave);
|
||||||
|
param.Add("play_time", clearData.playTime);
|
||||||
|
param.Add("nickname", PlayerDataManager.Singleton.player.name);
|
||||||
|
|
||||||
|
Backend.PlayerData.InsertData(RANK_TABLE, param, callback =>
|
||||||
|
{
|
||||||
|
if (callback.IsSuccess())
|
||||||
|
{
|
||||||
|
Debug.Log("초기 랭크 데이터 삽입 성공");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.LogError("초기 랭크 데이터 삽입 실패: " + callback.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
onComplete?.Invoke();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 플레이 랭크 정보 업데이트
|
||||||
|
/// </summary>
|
||||||
|
private void UpdateRankData(ClearData clearData, System.Action onComplete = null)
|
||||||
|
{
|
||||||
|
Param param = new Param();
|
||||||
|
param.Add("score", clearData.score);
|
||||||
|
param.Add("wave", clearData.wave);
|
||||||
|
param.Add("play_time", clearData.playTime);
|
||||||
|
param.Add("nickname", clearData.nickname);
|
||||||
|
|
||||||
|
Backend.PlayerData.UpdateMyLatestData(RANK_TABLE, param, callback =>
|
||||||
|
{
|
||||||
|
if (callback.IsSuccess())
|
||||||
|
{
|
||||||
|
Debug.Log("랭크 정보 업데이트 성공");
|
||||||
|
onComplete?.Invoke();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.LogError("랭크 정보 업데이트 실패: " + callback.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 캐릭터 플레이 랭크 정보 비교 후 업데이트 메소드 실행
|
||||||
|
/// </summary>
|
||||||
|
public void CheckUpdateRankData(ClearData clearData, System.Action onComplete = null)
|
||||||
|
{
|
||||||
|
// 먼저 현재 테이블에서 최근 데이터를 가져옵니다
|
||||||
|
Backend.GameData.GetMyData(RANK_TABLE, new Where(), 1, callback =>
|
||||||
|
{
|
||||||
|
if (callback.IsSuccess())
|
||||||
|
{
|
||||||
|
// 기존 데이터가 있는지 확인
|
||||||
|
if (callback.FlattenRows().Count > 0)
|
||||||
|
{
|
||||||
|
// 최근 데이터 추출
|
||||||
|
var latestData = callback.FlattenRows()[0];
|
||||||
|
int latestWave = int.Parse(latestData["wave"].ToString());
|
||||||
|
long latestScore = long.Parse(latestData["score"].ToString());
|
||||||
|
float latestPlayTime = float.Parse(latestData["play_time"].ToString());
|
||||||
|
|
||||||
|
// 신규 데이터와 비교하여 업데이트 여부 결정
|
||||||
|
bool shouldUpdate = false;
|
||||||
|
|
||||||
|
// 업데이트 조건 설정 (예: 웨이브가 높거나, 웨이브가 같으면서 점수가 높거나, 웨이브와 점수가 같으면서 플레이 시간이 짧을 때)
|
||||||
|
if (clearData.wave > latestWave)
|
||||||
|
{
|
||||||
|
shouldUpdate = true;
|
||||||
|
}
|
||||||
|
else if (clearData.wave == latestWave && clearData.score > latestScore)
|
||||||
|
{
|
||||||
|
shouldUpdate = true;
|
||||||
|
}
|
||||||
|
else if (clearData.wave == latestWave && clearData.score == latestScore && clearData.playTime < latestPlayTime)
|
||||||
|
{
|
||||||
|
shouldUpdate = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shouldUpdate)
|
||||||
|
{
|
||||||
|
UpdateRankData(clearData, onComplete);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Log("기존 기록이 더 좋아 업데이트하지 않음");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 기존 데이터가 없으면 무조건 삽입
|
||||||
|
InsertInitData(clearData, onComplete);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.LogError("기존 데이터 조회 실패: " + callback.ToString());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 8d3822a94a615414a8ca1cf53985f8c4
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -72,6 +72,19 @@ namespace TON
|
|||||||
// UpdateUI();
|
// UpdateUI();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 플레이어가 사망했을때 호출
|
||||||
|
public void PlayerDeadEvent()
|
||||||
|
{
|
||||||
|
Invoke(nameof(ShowGameEndUI), 3f);
|
||||||
|
|
||||||
|
}
|
||||||
|
private void ShowGameEndUI()
|
||||||
|
{
|
||||||
|
UIManager.Show<GameWinUI>(UIList.GameWinUI);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// 공격력과 방어력 업데이트
|
// 공격력과 방어력 업데이트
|
||||||
private void UpdateStats(int currentLevel)
|
private void UpdateStats(int currentLevel)
|
||||||
{
|
{
|
||||||
|
|||||||
35
Gameton-06/Assets/Gameton/Scripts/GameData/ClearData.cs
Normal file
35
Gameton-06/Assets/Gameton/Scripts/GameData/ClearData.cs
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace TON
|
||||||
|
{
|
||||||
|
[System.Serializable]
|
||||||
|
public class ClearData
|
||||||
|
{
|
||||||
|
public string nickname;
|
||||||
|
// 클리어한 웨이브 넘버
|
||||||
|
public int wave;
|
||||||
|
// 클리어에 소요된 시간
|
||||||
|
public float playTime;
|
||||||
|
// 획득 점수
|
||||||
|
public int score;
|
||||||
|
|
||||||
|
public ClearData()
|
||||||
|
{
|
||||||
|
nickname = "";
|
||||||
|
wave = 0;
|
||||||
|
playTime = 0f;
|
||||||
|
score = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateClearData(string nickname, int wave, float playTime, int score)
|
||||||
|
{
|
||||||
|
this.nickname = nickname;
|
||||||
|
this.wave = wave;
|
||||||
|
this.playTime = playTime;
|
||||||
|
this.score = score;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using UnityEngine;
|
|
||||||
|
|
||||||
namespace TON
|
|
||||||
{
|
|
||||||
[System.Serializable]
|
|
||||||
public class StageClearData
|
|
||||||
{
|
|
||||||
// 스테이지 클리어 데이터의 고유 id
|
|
||||||
public string id;
|
|
||||||
// 클리어한 캐릭터 아이디
|
|
||||||
public string characterId;
|
|
||||||
// 클리어한 스테이지 아이디
|
|
||||||
public string stageId;
|
|
||||||
// 클리어에 소요된 시간
|
|
||||||
public float clearTime;
|
|
||||||
// 클리어 시간에 따른 별점
|
|
||||||
public int starRating;
|
|
||||||
// 클리어한 날짜와 시간 정보
|
|
||||||
public string dateTime;
|
|
||||||
|
|
||||||
public StageClearData(string characterId, string stageId, float clearTime, int starRating)
|
|
||||||
{
|
|
||||||
id = $"SC{DateTime.UtcNow:yyyyMMddHHmmss}-{characterId}-{stageId}";
|
|
||||||
this.characterId = characterId;
|
|
||||||
this.stageId = stageId;
|
|
||||||
this.clearTime = Mathf.Round(clearTime * 100f) / 100f; ;
|
|
||||||
this.starRating = starRating;
|
|
||||||
dateTime = DateTime.UtcNow.ToString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -7,10 +7,6 @@ namespace TON
|
|||||||
{
|
{
|
||||||
public class StageManager : SingletonBase<StageManager>
|
public class StageManager : SingletonBase<StageManager>
|
||||||
{
|
{
|
||||||
public List<StageClearData> stageClearDatas { get; private set; }
|
|
||||||
[SerializeField]
|
|
||||||
public SerializableDictionary<string, StageClearData> bestStageClearDict = new SerializableDictionary<string, StageClearData>();
|
|
||||||
|
|
||||||
|
|
||||||
// 현재 플레이 시간을 초 단위로 반환하는 프로퍼티
|
// 현재 플레이 시간을 초 단위로 반환하는 프로퍼티
|
||||||
public float PlayTime => Time.time - stageStartTime;
|
public float PlayTime => Time.time - stageStartTime;
|
||||||
@@ -21,12 +17,28 @@ namespace TON
|
|||||||
|
|
||||||
private float stageStartTime; // 스테이지 시작 시간
|
private float stageStartTime; // 스테이지 시작 시간
|
||||||
|
|
||||||
|
public ClearData TOP_RECORD { get; private set; } // lobby 화면에 기록 세팅할때 사용할 변수
|
||||||
|
public List<ClearData> RankList { get; private set; } // 전체 랭킹 적용할 리스트
|
||||||
|
|
||||||
|
private BackendClearDataManager clearDataManager;
|
||||||
|
private BackendRankDataManager rankDataManager;
|
||||||
|
|
||||||
public void Initialize()
|
public void Initialize()
|
||||||
{
|
{
|
||||||
|
clearDataManager = new BackendClearDataManager();
|
||||||
|
rankDataManager = new BackendRankDataManager();
|
||||||
|
|
||||||
|
GetRankData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void GetRankData()
|
||||||
|
{
|
||||||
|
// 서버에서 내 클리어 데이터를 가져오고 가장 기록이 높은 정보를 세팅
|
||||||
|
rankDataManager.LoadMyRankData(rankData =>
|
||||||
|
{
|
||||||
|
TOP_RECORD.UpdateClearData(rankData.nickname, rankData.wave, rankData.playTime, rankData.score);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// 스테이지 시작 시 시작 정보 저장
|
// 스테이지 시작 시 시작 정보 저장
|
||||||
public void StartStage()
|
public void StartStage()
|
||||||
@@ -48,15 +60,23 @@ namespace TON
|
|||||||
waveCount = wave;
|
waveCount = wave;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 게임 플레이 종료 시 클리어 정보 저장 로직 수행
|
||||||
|
/// </summary>
|
||||||
public void StageClear()
|
public void StageClear()
|
||||||
{
|
{
|
||||||
string characterId = PlayerPrefs.GetString("BackendCustomID", string.Empty);
|
float clearTime = PlayTime;
|
||||||
float clearTime = Time.time - stageStartTime;
|
|
||||||
|
|
||||||
// TODO: UI 업데이트, 데이터 저장 로직 추가
|
ClearData clearData = new ClearData();
|
||||||
// StageClearData stageClearData = new StageClearData(characterId, stageId, clearTime, starCount);
|
clearData.UpdateClearData(PlayerDataManager.Singleton.player.name, waveCount, clearTime, gameScore);
|
||||||
// stageClearDatas.Add(stageClearData);
|
// clearData 저장
|
||||||
// SaveStageClearData();
|
clearDataManager.InsertInitData(clearData);
|
||||||
|
|
||||||
|
// rankData 조회 후 비교 하여 저장
|
||||||
|
rankDataManager.CheckUpdateRankData(clearData, () =>
|
||||||
|
{
|
||||||
|
TOP_RECORD.UpdateClearData(clearData.nickname, clearData.wave, clearData.playTime, clearData.score);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user