从AssetBundle获取Hash128以获取Caching.IsVersionCached函数

时间:2018-01-10 02:01:16

标签: c# unity3d assetbundle

我想知道AssetBundle已经在缓存中。这通常使用Caching.IsVersionCached函数完成。

Unity 2017.1 不再支持Caching.IsVersionCached(string url, int version)函数重载。

Unity 2017.3 建议我使用Caching.IsVersionCached(string url, Hash128 hash)重载。

我不知道Hash128是什么以及如何获取和使用它。什么是Hash128用于如何从AssetBundle获取它?

感谢您的回答。

但我无法解决我的问题。

这是我的代码

for(int i = 0; i< assetInfoList.Count; i ++) {

while (!Caching.ready)
    yield return null;


string url = GetUrl(assetInfoList[i].assetbundle_name);
string keyName = url + assetInfoList[i].version_no.ToString(); 

using (UnityWebRequest request = UnityWebRequest.GetAssetBundle(url,(uint)assetInfoList[i].version_no, 0))
{
    if (Caching.IsVersionCached(url, assetInfoList[i].version_no) == true)
        continue;

    if (i == 0)
    {
        string wifiConnectRecommend = Message.Ins.WIFI_ONLY;
        PopUpManager.Instance.PopUp_YesORNoForAssetBundle(wifiConnectRecommend.ToString(), ClickWifi, availableBytes, totalBytes);

        while (!SceneManager.Ins.isWifiUseConfirm)
            yield return null;

    }
    request.SendWebRequest();                

    while (request.isDone == false)
    {
        progressbar.value = request.downloadProgress;
        currentCount.text = countString + " (" + (request.downloadProgress * 100).ToString("N2") + "%)";
        yield return null;
    }

    if (request.error != null)
    {
        Debug.Log("www.error");
    }
    else
    {
        AssetBundleRef abRef = new AssetBundleRef(url, assetInfoList[i].version_no);
        abRef.assetBundle = DownloadHandlerAssetBundle.GetContent(request);

        dictAssetBundleRefs.Add(keyName, abRef);
    }
}

} 我的目的是当assetbundle已经在缓存中,继续并需要下载,在PopUp_YesORNoForAssetBundle上设置。

检查assetbundle下载或版本检查时需要

hash128。

但是在你的解释中,hash128只能在上次加载资产包或在资源文件夹中保存manifestfile之后才能获得。

我想知道如何检查assetbunle是否在缓存中。

如果你建议的话,我真的很感谢你。

1 个答案:

答案 0 :(得分:3)

  

但我不知道hash128是什么

Hash128表示AssetBundle文件的哈希值,可以在下载时更轻松地比较AssetBundle文件版本。

  

我找不到如何使用hash128

没有关于如何从文档中执行此操作的示例。以下是三种获取Hash128的方法。使用哪一个取决于AssetBundle所在位置的条件以及是否要下载它以检查Hash128。在您的情况下,#1 很可能是您正在寻找的。

<强> 1 即可。 在编辑器中从AssetBundle构建期间获取Hash128,然后保存到Resources文件夹

使用AssetBundle功能构建BuildPipeline.BuildAssetBundles时,此函数会返回AssetBundleManifest。您可以使用Hash128功能获取AssetBundleManifest.GetAssetBundleHash。将Hash128转换为包含Hash128.ToString()的字符串,然后将其保存到Resources文件夹,以便可以在运行时中访问它。

构建AssetBundle并将Hash128保存到Resources文件夹的编辑器构建脚本示例:

[MenuItem("Assets/Build AssetBundle")]
static void ExportResource()
{
    string folderName = "AssetBundles";
    string filePath = Path.Combine(Application.streamingAssetsPath, folderName);

    AssetBundleManifest assetMf = BuildPipeline.BuildAssetBundles(filePath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);

    //Get Hash128 from the AssetBundleManifest
    Hash128 hash128 = assetMf.GetAssetBundleHash("AssetBundles");

    //Get the Hash128 as string
    string data = hash128.ToString();
    string path = "Assets/Resources/AssetInfo/AssetBundleInfo.txt";

    //Save the Hash128 to the Resources folder
    using (FileStream fileStream = new FileStream(path, FileMode.Create))
    {
        using (StreamWriter writer = new StreamWriter(fileStream))
        {
            writer.Write(data);
        }
    }
    UnityEditor.AssetDatabase.Refresh();
}

在运行时加载Hash128的简单函数:

Hash128 getHash128(string path)
{
    //Load from the Resources folder
    TextAsset txtAsset = (TextAsset)Resources.Load(path, typeof(TextAsset));
    string hash128 = txtAsset.text;

    return Hash128.Parse(hash128);
}

使用方法:

//Load Hash128 from the Resources folder
Hash128 tempHash128 = getHash128("AssetInfo/AssetBundleInfo");

//Pass to the IsVersionCached function 
Caching.IsVersionCached("yourUrl", tempHash128);

您还可以根据需要使用json表示并保存多个Hash128

<强> 2 即可。 从服务器下载AssetBundle,然后在没有Resources文件夹的运行时获取Hash128。不幸的是,您必须首先使用此方法下载AssetBundle,然后才能获得Hash128。下载后,将数据加载为AssetBundleManifest,然后使用Hash128功能从中获取AssetBundleManifest.GetAssetBundleHash。然后,您可以保存此Hash128以供日后使用。

以下示例应从AssetBundle网址下载并解压缩Hash128。没有涉及编辑器代码。

IEnumerator downloadAssetBundle(string url)
{
    UnityWebRequest www = UnityWebRequest.GetAssetBundle(url);
    yield return www.SendWebRequest();

    if (www.isNetworkError || www.isHttpError)
    {
        Debug.Log(www.error);
    }
    else
    {
        //Get the AssetBundle
        AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(www);

        AssetBundleRequest asset = bundle.LoadAssetAsync<AssetBundleManifest>("assetManifestName");
        yield return asset;

        //Get the AssetBundleManifest
        AssetBundleManifest loadedAssetMf = asset.asset as AssetBundleManifest;
        //Get Hash128 from the AssetBundleManifest
        Hash128 tempHash128 = loadedAssetMf.GetAssetBundleHash("");

        //Pass to the IsVersionCached function 
        Caching.IsVersionCached("yourUrl", tempHash128);
    }
}

第3 即可。 从文件系统中的AssetBundle获取Hash128如果您已经knew AssetBundle的路径,请从该路径加载AssetBundle,然后将数据加载为{{1}最后使用AssetBundleManifest函数从中获取Hash128。然后,您可以保存此AssetBundleManifest.GetAssetBundleHash以供日后使用。

这显示了如何从StreamingAsset路径加载AssetBundle并获取其Hash128

Hash128