C#中async和await的一种使用方式

故事源于Unity中游戏开发的异步加载资源功能需求,在微信小游戏中需要使用异步或者callback的方式加载资源,微信小游戏的运行逻辑是所有的资源都是在资源服务器上的,加载是通过微信插件远程下载保存到本地(微信自行处理),然后实例化的,那么在加载没有资源例如UI面板的时候,吧prefab和美术资源分开加载来保证快速进入游戏(某些图片资源、特效可以通过异步、或者后台的方式后加载)

需要用到的类包括:Task,TaskCompletionSource

using System.Threading.Tasks;
public Dictionary objs = new();
private List assetNameList = new();
public List> sourceList = new();
/// 
/// 异步获取GameObject
/// 
/// 
/// 
public async Task GetObject(string objName)
{
    if (objs.TryGetValue(objName, out Object go))
    {
        return await Task.FromResult(go);
    }
    else
    {
        TaskCompletionSource source = new TaskCompletionSource();
        LoadAsset(objName, source);
        return await source.Task;
    }
}
/// 
/// 异步加载Object
/// 
/// 
/// 
public void LoadAsset(string name, TaskCompletionSource source)
{
    assetNameList.Add(name);
    sourceList.Add(source);
    //远程下载资源:assetbundle=>GameObject TODO
}
public void Update()
{
    ///遍历异步加载的资源是否到位
    for (int i = 0; i < assetNameList.Count; i++)
    {
        //查看异步要加载的资源是否已经存在
        if (objs.TryGetValue(assetNameList[i], out Object obj))
        {
            sourceList[i].SetResult(obj);
            assetNameList.RemoveAt(i);
            sourceList.RemoveAt(i);
        }
    }
} 
  

                            
                        
                    
                    
                    

你可能感兴趣的:(c#,开发语言,Unity)