제가 서버시간을 저장하고 받아오는 방식이 잘못된걸까요?
public void SaveResetTimeData()
{
if (!BackendManager.IsLoggedIn) return;
string inDate = InDateManager.Get("ResetTimeData");
if (string.IsNullOrEmpty(inDate))
{
Debug.LogWarning("ResetTimeData 저장 실패: inDate 없음");
return;
}
//서버 시간 요청
SendQueue.Enqueue(Backend.Utils.GetServerTime, serverTimeCallback =>
{
if (!serverTimeCallback.IsSuccess())
{
Debug.LogError("서버 시간 가져오기 실패: " + serverTimeCallback);
return;
}
string serverTimeString = serverTimeCallback.GetReturnValuetoJSON()["utcTime"].ToString();
DateTime serverTime = DateTime.Parse(serverTimeString);
Debug.Log(serverTime.ToString("o"));
Param data = new Param
{
{ "lastAccessTime", serverTime.ToString("o") }, // 서버 UTC 시간 저장
{ "resetToday", resetToday }
};
// 최종 데이터 저장
SendQueue.Enqueue(Backend.GameData.UpdateV2, "ResetTimeData", inDate, Backend.UserInDate, data, callback =>
{
if (!callback.IsSuccess())
{
Debug.LogError("ResetTimeData 저장 실패: " + callback);
}
});
});
}
public void LoadResetTimeData()
{
if (!BackendManager.IsLoggedIn) return;
SendQueue.Enqueue(Backend.GameData.GetMyData, "ResetTimeData", new Where(), callback =>
{
if (callback.IsSuccess())
{
var jsonData = callback.FlattenRows();
if (jsonData.Count > 0)
{
// inDate 캐싱
var row = jsonData[0];
InDateManager.Set("ResetTimeData", row["inDate"].ToString());
string rawTime = row["lastAccessTime"].ToString();
lastAccessTime = DateTime.Parse(rawTime); // 시간대 포함된 문자열 → 정확히 파싱됨
//lastAccessTime = parsedTime.ToUniversalTime(); // UTC 기준 고정
//Debug.Log($"[LoadResetTimeData] 로드된 lastAccessTime(KST): {lastAccessTime:yyyy-MM-dd HH:mm:ss}");
resetToday = bool.Parse(row["resetToday"].ToString());
GoNextProcess(LoadProcess.LOAD_IDLETIME);
}
else
{
// 서버 시간 가져오기 (비동기)
SendQueue.Enqueue(Backend.Utils.GetServerTime, serverTimeCallback =>
{
if (!serverTimeCallback.IsSuccess())
{
Debug.LogError("서버 시간 가져오기 실패 (초기화 중)");
return;
}
string serverTimeString = serverTimeCallback.GetReturnValuetoJSON()["utcTime"].ToString();
DateTime serverTime = DateTime.Parse(serverTimeString);
lastAccessTime = serverTime;
resetToday = false;
Param initData = new Param
{
{ "lastAccessTime", serverTime.ToString("o") },
{ "resetToday", resetToday }
};
//데이터 저장
SendQueue.Enqueue(Backend.GameData.Insert, "ResetTimeData", initData, insertCallback =>
{
if (insertCallback.IsSuccess())
{
string inDate = insertCallback.GetInDate();
InDateManager.Set("ResetTimeData", inDate);
}
else
{
Debug.LogError("초기 데이터 삽입 실패: " + insertCallback);
}
GoNextProcess(LoadProcess.LOAD_IDLETIME);
});
});
}
}
else
{
Debug.LogError("ResetTimeData 불러오기 실패: " + callback);
}
});
}
이렇게 보상받은 시간을 저장하고 다음 접속때 불러오게해놨는데 왜 초기화가안되는 유저가 발생하는지 이유를 모르겠습니다.
보상은 9시에 받게 하기위해 업데이트문에서 체크하고있으며,
private void Update(){
DateTime serverTime = GetCurrentServerTime(); // 서버 시간 기준 계산
DateTime todayResetTime = new DateTime(serverTime.Year, serverTime.Month, serverTime.Day, 9, 0, 0); //오늘 9시로 고정해주는 코드 ex) 25-07-14 오전09:00
if (serverTime >= todayResetTime && lastAccessTime < todayResetTime)
{
resetToday = false;
}
}
public void InitializeServerTime()
{
if (!Backend.IsInitialized) return;
var bro = Backend.Utils.GetServerTime();
if (bro.IsSuccess())
{
string time = bro.GetReturnValuetoJSON()["utcTime"].ToString();
baseServerTime = DateTime.Parse(time); //한국시간 KTS
//baseServerTime = DateTime.Parse(time, null, System.Globalization.DateTimeStyles.AdjustToUniversal); //세계시간
baseRealtime = Time.unscaledTime;
Debug.Log("서버 시간 초기화 완료: " + baseServerTime + "\n 리얼타임 : "+ baseRealtime); // 한국 시간으로 출력
}
else
{
DebugHelper.LogError("서버 시간 초기화 실패: " + bro.GetMessage());
}
}
public DateTime GetCurrentServerTime()
{
float elapsed = Time.unscaledTime - baseRealtime;
return baseServerTime.AddSeconds(elapsed);
}
시간체크는 이렇게하고있으며 resetToday 이게 false가 되는순간 초기화가 진행됩니다.
한달넘게 초기화 관련으로 문제가 있는데 방식이틀렸다면 뒤끝에서 어떤기능을 사용해야하는지 알려주시면 감사하겠습니다.