안녕하세요 개발자님.
먼저 뒤끝 서버타임의 경우 5분에 한번씩 호출하는 주기를 추천하고 있습니다.
만약 게임의 시간 체크가 빈번하게 발생할 경우, 서버타임을 로컬에서 시간을 더하는 식으로 구현하여 사용하시는 것을 추천드립니다.
로직은 다음과 같습니다.
- 로그인 이후 서버타임 1회 호출
- 해당 서버타임을 FixedUpdate에서 업데이트하면서 실시간처럼 사용(백그라운드 및 동기에도 영향 받지 않음)
- 5분마다 서버에서 시간을 불러와 현재 시간과 맞춤(InvokeRepeating)
코드의 경우, cs 전체를 제공하였습니다. TimeManager.cs를 생성 후, TimeManager.Instance.currentTime을 이용하시면 되겠습니다.
// Copyright 2013-2022 AFI, Inc. All Rights Reserved.
using System;
using System.Threading;
using UnityEngine;
using BackEnd;
public class TimeManager : MonoBehaviour
{
float oldTime;
private DateTime utcTime;
public DateTime currentTime;
DateTime serverTime;
bool isChangeServerTime = false;
bool isServerTimeUpdate = false;
int initTimeCount = 3;
private static TimeManager instance = null;
public static TimeManager Instance
{
get => instance;
}
void Awake()
{
if (instance == null)
{
instance = this;
}
}
void Start()
{
Backend.Initialize(true);
Backend.BMember.CustomLogin("a1", "a1");
InvokeRepeating("PrintTime", 1.0f, 1.0f);
InvokeRepeating("GetServerTimeFor5minutes", 300f, 300f); // 300초 뒤에 실행 300초마다 반복
InitTime();
}
void InitTime() // 로그인 이후 서버 타임을 가져오는 함수. 최대 3번 실행
{
if (initTimeCount > 3)
{
Debug.LogError("시간을 3번 이상 불러올 수 없었습니다");
return;
}
Backend.Utils.GetServerTime(callback =>
{
if (callback.IsSuccess())
{
string time = callback.GetReturnValuetoJSON()["utcTime"].ToString();
serverTime = TimeZoneInfo.ConvertTimeToUtc(System.DateTime.Parse(time)).AddHours(9); // 현재 시간을 utc+0로 저장
isChangeServerTime = true;
isServerTimeUpdate = true;
}
else
{
initTimeCount++;
InitTime();
}
});
}
void Update()
{
Backend.AsyncPoll();
}
private void FixedUpdate()
{
if (isServerTimeUpdate)
{
TimeUpdate();
}
}
void TimeUpdate() // 시간을 업데이트 해주는 함수(FixedUpdate에서 실행해야함)
{
if (isChangeServerTime)
{
oldTime = Time.fixedUnscaledTime;
currentTime = serverTime;
isChangeServerTime = false;
}
var delta = Time.fixedUnscaledTime - oldTime;
oldTime = Time.fixedUnscaledTime;
currentTime = currentTime.AddMilliseconds(delta * 1000.0f);
}
private void PrintTime() // 시간 차이를 비교해주는 테스트를 위한 함수
{
Backend.Utils.GetServerTime(callback =>
{
if (callback.IsSuccess())
{
string time = callback.GetReturnValuetoJSON()["utcTime"].ToString();
utcTime = TimeZoneInfo.ConvertTimeToUtc(System.DateTime.Parse(time)).AddHours(9); // 현재 시간을 utc+0로 저장
Debug.Log($"Now: {utcTime}, myTime: {currentTime}");
}
});
}
private void GetServerTimeFor5minutes() // 5분마다 호출하는 함수
{
Backend.Utils.GetServerTime(callback =>
{
if (callback.IsSuccess())
{
string time = callback.GetReturnValuetoJSON()["utcTime"].ToString();
serverTime = TimeZoneInfo.ConvertTimeToUtc(System.DateTime.Parse(time)).AddHours(9); // 현재 시간을 utc+0로 저장
isChangeServerTime = true;
}
});
}
}