我想知道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是否在缓存中。
如果你建议的话,我真的很感谢你。
答案 0 :(得分:3)
但我不知道hash128是什么
Hash128
表示AssetBundle文件的哈希值,可以在下载时更轻松地比较AssetBundle文件版本。
我找不到如何使用hash128
没有关于如何从文档中执行此操作的示例。以下是三种获取Hash128
的方法。使用哪一个取决于AssetBundle
所在位置的条件以及是否要下载它以检查Hash128
。在您的情况下,#1 很可能是您正在寻找的。 p>
<强> 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