WebGL AssetBundleロードキャッシュ


U 3 DのAssetBundleは本当に博(坑)大精(坑)深さですね
AndroidではまずStreamingAssetPathにパッケージ化し、インストール後初めて実行し、persistentディレクトリは一度実行してから作成されるので、StreamingのPersistentDataPathに自動的に解凍します.
これで、後でリソースを更新してpersistentディレクトリに直接ダウンロードしました
でも、WebGLプロジェクトは
ローカルパスをロードできないのでstreamingやpersistentは存在しません
だからキャッシュだけで、パッケージをロードするときに使います.
WWW.LoadFromDownloadOrCache(url, version)

これにより、リソースがキャッシュディレクトリにダウンロードされ、ロードされるたびにバージョンが判断され、同じようにローカルディスクから直接ロードされます.そうしないと、ネットワークからダウンロードされ、ローカルディスクのキャッシュが更新されます.
ここに穴が来ました.このバージョン番号です.最初のロードはまあまあで、勝手に数を設定して、ローカルにはないので、直接ダウンロードしました.これから、ローカルのバージョンとサーバーのバージョンをどう判断しますか?
この問題があるのは、このバージョン番号がロード時にプログラムに書かれているためです.例えば、最初のダウンロード後、各パッケージがロードされたときのこのバージョン番号もローカルキャッシュに記録され、次回の再ロード時にプログラムで設定されたバージョン番号はローカルキャッシュに記録された前のバージョン番号と比較され、異なる場合は更新があることを説明し、ダウンロードパッケージはローカルキャッシュを上書きします.再ロードし、同じ場合は更新せず、ダウンロードせずにローカルキャッシュを直接ロードします.
多くの例を見て、0か1を簡単に書いて、サーバー側のリソースが更新されても、このバージョン番号が前回と同じであれば、更新されていないと思って、ネットからダウンロードしません.
では、パッケージのこのバージョンを動的に取得する方法を考えなければなりません.
WWW.LoadFromDownloadOrCache(url, version)

このリロード方法は適切ではありません.このバージョンは入手できませんから......ドキュメントでは、このバージョンが自増する、つまり新しいバージョンが古いものより大きいと更新されますが、ネット上でバージョン番号が異なる限り、更新すると言われています.大きいにしても小さいにしても、これは試したことがありませんが、どうでもいいです.
一目見て、このロード方法のもう一つのリロードは:
public static WWW LoadFromCacheOrDownload(string url, Hash128 hash, uint crc);

説明:以下は現在の構想にすぎず、実践していない.
まず、最後のパラメータcrcについて説明します.ドキュメントで言うように、この値が0でない場合はcrcと比較します.現在はこれに関心を持っていません.0で最も重要なのは、2番目のパラメータhashドキュメントの解釈です.
hash    Hash128 which is used as the version of the AssetBundle.

これと比較するとversionバージョンに相当します.じゃあ、何とかして各assetbundleバッグのHash 128を手に入れます
manifestファイルから始めると、パッケージ化後に総manifestファイルがあり、あなたのパッケージのルートディレクトリ名と同じ名前です.たとえば、StreamingAssetsの下にパッケージ化すると、そのディレクトリの下にStreamingAssets.manifestファイルがあります.
using(WWW www=WWW.LoadFromDownloadOrCache("..../StreamingAssets/StreamingAssets"))
{
        yield return www;
        AssetBundle ab=www.assetBundle;
        AssetBundleManifest abm=ab.loadAsset("AssetBundleManifest");
        string[] bundleNames=abm.GetAllAssetBundles();
        foreach(string item in bundleNames)
        {
                Hash128 hash = abm.GetAssetBundleHash(item);
        }
}

以上のように、GetAllAssetBundles()は、すべてのパケットのパケット名を得ることができ、GetAssetBundleHash(パケット名)でパケットに対応するhash 128を得ることができる
では、リソースをロードする前に、パッケージのHash 128を取得してから
public static WWW LoadFromCacheOrDownload(string url, Hash128 hash, uint crc);

これにより、このHash 128の値がロードされるたびに比較され、これはバージョンに相当します.
試してみましたが、開発環境では、リソースに何の修正もなく、繰り返しパッケージ化されていて、出てきたこのHash 128は変わらず、修正があれば、例えば材質の色が変わったり、prefabのscaleが変わったりして、また出てきたバッグは、Hash 128が変わりました.
理論的には、これでLoadFromDownloadOrCacheが更新されたかどうかを判断することができます.
したがって、プログラムを開くたびに、まず総manifestをロードし、パケットと対応するHash 128を辞書などの場所に保存します.
Dictionary bundleHashDict = new Dictionary();
using(WWW www=WWW.LoadFromDownloadOrCache("..../StreamingAssets/StreamingAssets"))
{
        yield return www;
        AssetBundle ab=www.assetBundle;
        AssetBundleManifest abm=ab.loadAsset("AssetBundleManifest");
        string[] bundleNames=abm.GetAllAssetBundles();
        foreach(string item in bundleNames)
        {
                Hash128 hash = abm.GetAssetBundleHash(item);
                bundleHashDict.Add(item, hash);
        }
}

「a.assetbundle」というパッケージをロードするには
string path = "...../a.assetbundle";
Hash128 hash=bundleHashDict["a.assetbundle"];
using(WWW www = WWW.LoadFromDownloadOrCache(path, hash, 0))
{
        yield return www;
        .........
}

以上のように、パケット名が辞書で取得される前に取得されて辞書に格納されているHash 128に基づいて、LoadFromDownloadOrCacheメソッドの第2のパラメータとして、最後の更新ダウンロード時に格納されたパケットをローカルキャッシュしたHash 128(前回このメソッドを呼び出したときにキャッシュに書き込まれたもの)と比較し、同じであれば更新せず、異なるであれば更新する.
理論的にはそうであるが,実践を待たなければならない.