Caching.IsVersionCached(url, hash) ってどういう挙動?
概要
Caching.IsVersionCached(url, hash) の挙動がよくわからない。
ドキュメントにも書いてないし。
https://docs.unity3d.com/jp/current/ScriptReference/Caching.IsVersionCached.html
でも実装はされてて、Unity5.5p4とかだと使える。(もっと前から使える。)
で、この関数のどんな挙動が悩ましいのか、書いていく。
hashを使ったAssetBundleのDLについて
5.x系だと、こんな感じのメソッドを使ってAssetBundleをDLできるようになってる。
public static Networking.UnityWebRequest GetAssetBundle(string uri, Hash128 hash, uint crc);
ドキュメントはこれ。
https://docs.unity3d.com/ScriptReference/Networking.UnityWebRequest.GetAssetBundle.html
とあるurlに紐づいてDLされているAssetBundleについて、このメソッドに渡したhash値がDL時のhash値と一致しなかったら、DLが発生する。
そうでない場合はAssetBundleがストレージにキャッシュされてるので、そこから取得する、みたいな。
で、だ。この関数には良いところがいっぱいあって。
・キャッシュに含まれていたら + hashが合致していたら、AssetBundleが取得できる
・キャッシュに含まれていなかったらAssetBundleをDL、取得できる
・キャッシュに含まれていなかったらAssetBundleをDL、キャッシュもする
・キャッシュに含まれていたら + hash合致しなかったら、やはり取得しに行く
・キャッシュに含まれていたら + hash合致しなかった場合、古いファイルは消える(消えますよね? 消えますよね?? 明文化されてない気がするけど!!
・crcで正しいファイルかチェックできる
などなど。hashが本当にいい仕事してる。versionのようなヘタレとは違うのだ。違うのだ。
で、次は、「AssetBundleむかしDLした気がするんだけど、このAssetBundleってあるんですか?」って確認したいだけの場合。
まあ、、、この機会を「実際に使用しないならいいじゃん!実際に使用するときはRequest使えばいいじゃん!」みたいな話で没シュートしたい場合、
かつ、そのためCaching.IsVersionCached(url, hash)がドキュメントに書いてないという事情な場合、話はシンプルにまとまりそう。
hashを使ったAssetBundleがキャッシュされているかどうかのチェックについて
本題。
ざっくりいうと、hashを使ったIsVersionCheckedは、どんなhashを渡してもtrueが返ってくるときがあるようだ。
サンプルを用意した。