需求背景
邀请好友组队,需要倒计时15s后才可再次邀请,数据只存本地。
定位原因
开始用了Dictionary<ulong,Coroutine>结构,邀请一个好友启动一个协程,存入字典。后来发现这样会有一个问题,就是隐藏节点后协程会被打断。
解决方案
于是改为用Dictionary<ulong, float>结构记下邀请好友的时间戳,再根据事件戳逻辑显示倒计时或者恢复邀请。倒计时还是用协程来做。
代码
public IEnumerator CountDown(ulong inputUid)
{
float elapsedTime;
float lastTickTime;
if (InviteeTimeStampDictionary.ContainsKey(inputUid))
{
if (Time.time - InviteeTimeStampDictionary[inputUid] > CountdownTime)
InviteeTimeStampDictionary[inputUid] = Time.time;
}
else
{
InviteeTimeStampDictionary[inputUid] = Time.time;
}
elapsedTime = Time.time - InviteeTimeStampDictionary[inputUid];
lastTickTime = (int) Math.Floor(InviteeTimeStampDictionary[inputUid] - 1);
while (elapsedTime < CountdownTime)
{
elapsedTime = Time.time - InviteeTimeStampDictionary[inputUid];
if (Time.time - lastTickTime >= 1)
{
lastTickTime = Time.time;
_eventManager.Raise(new InviteCdTickEvent
{ElapsedTime = elapsedTime, CountdownTime = CountdownTime});
}
yield return null;
}
InviteeTimeStampDictionary[inputUid] = 0;
_eventManager.Raise(new InviteAgainEvent{});
}
作者 [张巍]
2023 年 05月 31日