콘텐츠로 이동

서버 노티 때문에 코인 이동 연출 타이밍이 어긋나는 버그

LOBBY 씬에서는 코인 이동 연출이 원하는 타이밍에 나오지만, GAME 씬에서는 연출 타이밍이 어긋났다.

GAME 씬은 Idle 상태일 때 ReceiveNotiMessage로 코인 변경 노티를 구독하고 있어, 노티가 오면 클라이언트에서 코인이 바로 갱신된다.

private void ReceiveNotiMessage(UpdateCoinMessage updateCoinMessage)
{
if (m_State == SlotState.IdleState || m_State == SlotState.EndResultState || m_State == SlotState.EnterState)
{
SetCoin(updateCoinMessage.afterCoin, updateCoinMessage.applyDt);
}
else
{
EarnCoin(updateCoinMessage.diffCoin);
PileUpCoin(updateCoinMessage.afterCoin, updateCoinMessage.applyDt);
}
}

서버로 요청하기 전 coin 값을 복사해 두고, 노티로 coin 변경이 와도 이전 값으로 바꿨다가 원하는 타이밍에 다시 되돌리는 방식으로 해결했다.

coinUI를 복제해 생성하는 시점의 값을 beforeMoney로 복사해 두었다. 코인 변경 노티가 와도 복제한 coinUI는 이전 값을 가지므로, 연출이 원하는 타이밍에 나오게 되었다.

bool isGameScene = SceneManager.GetActiveScene().name == "GameScene" ? true : false;
ulong beforeMoney = UserInfo.Instance.Coin;
SessionLobby.Instance.RequestStoreBonus((e) =>
{
if (e != null)
{
Error("Receive Bonus Error");
}
else
{
DateTime bonusTime = CommonTools.JavaTime(StoreInfo.Instance.StoreBonusData.bonusNextDate);
TimeSpan span = CommonTools.ToPSTTime(bonusTime) - CommonTools.ToPSTTime(ClientInfo.Instance.ServerTime);
double totalSeconds = span.TotalSeconds;
LocalNotification.Instance.AddPushMessage(LocalNotification.PushMessageType.Store, "APP_TITLE", "PUSH_MESSAGE", (long)totalSeconds);
if (coinController != null)
{
if (coinFX != null)
{
CommonTools.SetActive(coinFX.gameObject, true);
coinFX.Stop();
coinFX.Play();
}
if (soundCoin != null)
soundCoin.Play();
// UserCoinUI
UserCoinUI coinUI = null;
ulong coin = UserInfo.Instance.Coin;
if (TopUI.IsActive)
{
coinUI = TopUI.Instance.CloneUserCoinUI(coinController.transform);
UserInfo.Instance.Coin = coinUI.beforeMoney;
if (coinMoveDest != null && coinUI.CoinMoveTarget != null)
coinMoveDest.position = coinUI.CoinMoveTarget.position;
}
// CoinMoveEffect
coinController.StartCoinMoveDelay(() =>
{
if (coinUI != null)
Destroy(coinUI.gameObject);
SetBonusUI();
bonusButton.SetEnable(true);
},
// 첫번째 코인 도착시, 머니 갱신시작
() =>
{
if (isGameScene == true)
UserInfo.Instance.Coin = coin;
UserInfo.Instance.UpdateUserCoin(null);
});
}
}
});