优化好友邀请倒计时问题:从多协程到时间戳

Posted by JohnWayne on May 31, 2023

需求背景

邀请好友组队,需要倒计时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日