c#、unity异步调用实际应用

  • 使用TaskCompletionSource将委托回调形式的异步调用封装为await调用

以UGF的资源加载为例

https://github.com/EllanJiang/UnityGameFramework/blob/f42f4bf78290b552376709547ab8554376b427db/Scripts/Runtime/Resource/ResourceComponent.cs#L730

调用这个接口

LoadAssetCallbacks loadAssetCallbacks = new LoadAssetCallbacks(
    (string assetName, object asset, float duration, object userData) =>
    {

    }, 
    (string assetName, LoadResourceStatus status, string errorMessage, object userData) =>
    {

    });

resourceComponent.LoadAsset(assetName, loadAssetCallbacks);

需要在LoadAssetCallbacks的LoadAssetSuccessCallback、LoadAssetFailureCallback编写加载成功、失败的代码

封装为await调用

https://github.com/xin0205/StarForce/blob/8da830907bf0714f84d3d7b0ba969e3671734845/Assets/UGFExtensions/Scripts/Runtime/Resource/AsyncLoadExtensions/AsyncLoadAssetExtensions.cs#L43

public static Task<object> LoadAssetAsync2(this ResourceComponent resourceComponent, string assetName)
        {
            TaskCompletionSource<object> loadAssetTcs = new TaskCompletionSource<object>();

            LoadAssetCallbacks loadAssetCallbacks = new LoadAssetCallbacks((string _assetName, object asset, float duration, object userData) =>
            {
                loadAssetTcs.SetResult(asset);

            }, (string _assetName, LoadResourceStatus status, string errorMessage, object userData) =>
            {

                loadAssetTcs.SetException(new Exception(errorMessage));

            });

            resourceComponent.LoadAsset(assetName, null, 0, loadAssetCallbacks, null);


            return loadAssetTcs.Task;
        }
object asset = await GameEntry.Resource.LoadAssetAsync2("XXX/XXX.png");

使用TaskCompleti

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值