# 解决方案

### FairyGUI支持解决方案

注意：在FairyGUI的面板销毁的时候，将资源句柄列表释放，否则会造成资源泄漏。

````c#
// 资源句柄列表
private List<AssetOperationHandle> _handles = new List<AssetOperationHandle>(100);

// 加载方法
private object LoadFunc(string name, string extension, System.Type type, out DestroyMethod method)
{
    method = DestroyMethod.None; //注意：这里一定要设置为None
    string location = $"FairyRes/{name}{extension}";
    var handle = YooAssets.LoadAssetSync(location , type);
    _handles.Add(handle);
    return handle.AssetObject;
}

// 执行FairyGUI的添加包函数
UIPackage.AddPackage(name, LoadFunc);

// 释放资源句柄列表
private void ReleaseHandles()
{
    foreach(var handle in _handles)
    {
        handle.Release();
    }
    _handles.Clear();
}
````

### UniTask支持解决方案

[仓库链接](https://github.com/Cysharp/UniTask) 

- 请去下载对应的源码，并删除此目录最后的波浪线
- 在项目的 `asmdef` 文件中添加对 `UniTask.YooAsset` 的引用
- 在 UniTask `_InternalVisibleTo.cs` 文件中增加 `[assembly: InternalsVisibleTo("UniTask.YooAsset")]` 后即可使用

代码示例

```csharp
var handle = YooAssets.LoadAssetAsync<GameObject>("Assets/Res/Prefabs/TestImg.prefab");

await handle.ToUniTask();

var obj = handle.AssetObject as GameObject;
var go  = Instantiate(obj, transform);

go.transform.localPosition = Vector3.zero;
go.transform.localScale    = Vector3.one;
```

### 分布式构建解决方案

**1.3.0+版本升级指南**

在升级之前请导出AssetBundleCollector的配置为XML文件，然后升级YooAssets库。

首次需要打开AssetBundleCollector窗口，然后导入之前保存的XML文件。

在运行游戏之前，请保证资源包可以构建成功！

```c#
public static YooAssetPackage AssetPackage;

IEnumerator Start()
{
    // 初始化YooAssets资源系统（必须代码）
    YooAssets.Initialize();
    
    // 创建资源包实例
    AssetPackage = YooAssets.CreateAssetPackage("DefaultPackage");
    
    // 初始化资源包
    ......
    yield return AssetPackage.InitializeAsync(createParameters);
    
    // 更新资源包版本
    ......
    var operation = AssetPackage.UpdateManifestAsync(packageCRC);
    yield return operation;
    
    // 下载更新文件
    var downloader = AssetPackage.CreatePatchDownloader(downloadingMaxNum, failedTryAgain);
    downloader.BeginDownload();
    yield return downloader;
    
    // 加载资源对象
    var assetHandle = AssetPackage.LoadAssetAsync("Assets/GameRes/npc.prefab");
    yield return assetHandle;
    ......
}

```

