unity3d 调度异步方法执行

vshtjzan  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(136)

我有一个在远程系统上计算玩家动作的游戏。为了便于讨论,我们假设这个系统一次只能处理一个动作,但是玩家应该能够根据自己的喜好来排队。
每当播放器执行一个动作时,客户端向remote发送一个请求:

async void ActionAsync(){

string id = await ActionRequestToRemote();
CharacterActions.Add(new CharacterAction(id, currentlySelectedGameobject));      
}

获取id已经足够快了,但之后需要远程大约6秒才能返回一个新的游戏状态,在此期间,所有进一步的await请求都会被遗忘(比如玩家在一秒钟内点击3次)。
什么是最好的方式让玩家保持排队动作,同时停止/调度await ActionARequestToRemote(id)的执行,直到前一个完成运行?
每当远程处理完成时,调用以下方法以开始播放动画等。

void UpdateLocalGameState(string Type, bool success)
    {
        if (success)
        {
            switch (type)
            {
                case "ActionA":
                    LocallyDoActionA(CharacterActions[0]);
                    break;
                case "ActionB":
                    LocallyDoActionB(CharacterActions[0]);
                    break;
                case "ActionC":
                    LocallyDoActionC(CharacterActions[0]);
                    break;
            }
        }
    }

我目前的工作通过列表recusrively出队本身,忽略请求的时候,球员点击,只是重新发送后,所有任务的执行已经完成。但这看起来很不雅,好像还有更好的办法?

wljmcqd8

wljmcqd81#

在我看来,你似乎想使用某种ConcurrentQueue,并允许操作堆积在那里。
就像E。g的。

public readonly struct ActionResult
{
    public string Type { get; }
    public bool Success { get; }

    public ActionResult(string type, bool success)
    {
        Type = type;
        Success = success;
    }
}

private readonly ConcurrentQueue<CharacterAction> CharacterActions = new ();
private bool isHandlingQueuedActions;

public event Action<ActionResult> onActionResult;

public void SendActionQueued(CharacterAction action)
{
    CharacterActions.Enqueue(action);

    if(!isHandlingQueuedActions)
    {
        Task.Run(async ()=> await HandleQueuedActions());
    }
}

private async Task HandleQueuedActions()
{
    isHandlingQueuedActions = true;

    while(CharacterActions.TryDequeue(out var action)) 
    {
        ActionResult result = await HoweverYouSubmitTheAction(action);
        onActionResult?.Invoke(result);
    }

    isHandlingQueuedActions = false;
}

相关问题