FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »Unity
カテゴリー「Unity」の記事一覧

【Unity】PlayerPrefs / persistentDataPath / temporaryCachePath の保存場所(パス)一覧表  


 ただのチートシート。公式マニュアルにも書いてあるのだが、ちょっと見づらいので、表にして楽に確認したかっただけ(笑)。

 ただし、iOS, Mac についてはマニュアルや資料からの抜粋のみ。また、iOS, Mac はバージョンによって結構変わるみたいなので、最新情報をググった方が良いかも知れない。


(※) 掲載時点:Unity 2018.4.1f1 / Windows10 / Android 8.0 / iOS, Mac はマニュアル・資料から抜粋



■PlayerPrefs の保存場所(パス)

(マニュアル)
PlayerPrefs

●PlayerPrefs 保存場所 一覧
Android/data/data/[pkg-name]/shared_prefs/[pkg-name].xml
iOS~/Library/Preferences/[bundle identifier].plist
Windows[レジストリ]
(ランタイム) HKCU/Software/[company name]/[product name]
(エディタ) HKCU/Software /Unity/UnityEditor /[company name]/[product name]
Mac~/Library/Preferences/unity.[company name].[product name].plist
Windows Store App%userprofile%/AppData/Local/Packages/[product name]/LocalState/playerprefs.dat
Windows Phone 8(ランタイム) <main drive>:/Users/<user name>/AppData/Local/Packages/<package id>/LocalState
(エディタ) <your project path>/LocalState
Linux~/.config unity3d[CompanyName]/[ProductName]
WebGLブラウザーの IndexedDB API

※[company name], [product name], [bundle identifier], [pkg-name](パッケージ名:bundle identifier) は Build Setting のもの。
※iOS, Mac はバージョンによって結構変わるみたいなので、最新情報をググった方が良いかも知れない。



■Application.persistentDataPath の保存場所(パス)

(マニュアル)
Application.persistentDataPath

●Application.persistentDataPath 保存場所 一覧
Android/data/data/[pkg-name]/files
iOS/Application/<guid>/Documents
Windows<main drive>:/Users/<user name>/AppData/LocalLow/[company name]/[product name]
Mac~/Library/Application Support/[company name]/[product name]
Windows Store App%userprofile%/AppData/Local/Packages/[ProductPackageId]/LocalState

※[company name], [product name], [bundle identifier], [pkg-name](パッケージ名:bundle identifier) は Build Setting のもの。
※iOS, Mac はバージョンによって結構変わるみたいなので、最新情報をググった方が良いかも知れない。



■Application.temporaryCachePath の保存場所(パス)

(マニュアル)
Application.temporaryCachePath

●Application.temporaryCachePath 保存場所 一覧
Android/data/data/[pkg-name]/cache
iOS~/Application/<guid>/Library/Caches
Windows<main drive>:/Users/<user name>/AppData/Local/Temp/[company name]/[product name]
Mac/var/folders/<id>/<guid>/T/[company name]/[product name]

※[company name], [product name], [bundle identifier], [pkg-name](パッケージ名:bundle identifier) は Build Setting のもの。
※iOS, Mac はバージョンによって結構変わるみたいなので、最新情報をググった方が良いかも知れない。



(マニュアル)
PlayerPrefs
Application.persistentDataPath
Application.temporaryCachePath

(参考)
Unityのリソース保存パス
unityのプラットフォームによるデータの保存パス
unityでplatformによって取得できるパス





(関連記事)
【Unity】オブジェクト(クラス・構造体)、配列、リスト、辞書をJSONでPlayerPrefsに保存する
【Unity】【C#】テキストファイルの読み書きをする(リソース/ストレージ)
【Android】【Java】Preference 機能を使って設定データを読み込み・保存する
【Android】【Applet】【Java】テキストファイルの読み込み・保存 まとめ


スポンサーサイト

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityリファレンス 
tb: 0   cm: --

【Unity】Unity2019.3 で Android / iOS ネイティブの構成が変わるらしい  


 Unity Asset Store にプラグインを出していることもあって、デベロッパーのメルマガで Unity2019.3 の大きな変更点が送られてきた。




 どうやら今までの Unity での Android / iOS ビルドの際のネイティブの構成が変わるらしい。

 まぁ、自分でプラグインなど作ったりしない場合はあまり関係ないと思うが、Unity2018.2 からは Android も Java コードをそのままビルドできるようになったので、ネイティブを使う人なら知っておいた方が良いだろう。

 詳細は公式のフォーラムを見た方が良いと思うが、例えば Android では 2019.3 で以下のような構成になるようだ。


Using Unity as a library in native iOS/Android apps


 また、Unity2019.3 からは今までと違って、ランチャーを挟んで本体の起動できるようだ。複数のアクティビティを使わないなら、あまり必要もないかもだが、例えば通常のアプリでの画面と Unity での 3Dモードで開くなど、今までより簡単にできるかも知れない。ただし『アンロードボタンは、単にアクティビティを破棄するのではなく、実際にアプリを終了します』とあるね。これも公式のフォーラムを見た方が良いだろう。


Integration Unity as a library in native Android app


 まぁ、見た感じ私の提供しているプラグインはそのまま動きそうな気がするが、確認が取れるまで、Unity2019.3 以降ではフィルタされるようだ(メルマガに書いてあった)。


 Unity の GUI も Flutter ライクのワークフローで開発できるパッケージも提供され始めたしね。UIWidgets は UIを1ドローコールで60fps以上の高効率でレンダリングできるらしいし、ネイティブのような画面遷移できるらしい。動画観てみると Unity とは思えない画面だね(笑)。


UIWidgets (Asset Store)
UIWidgets (github)
【Unity提供アセット】FlutterライクのワークフローをUnityで実現!強力なUIプラグインパッケージが新登場。60fps以上のレンダリング効率、クロスプラットフォーム対応。1ドローコールで描画する「UIWidgets」


 以上の情報からもネイティブ統合は今後強化されるかもね。





(関連記事)
【Unity】Unity2019 の StandardShader の処理が少し変わったらしいよ
【Unity】Unity2018.3.2 にアップグレードすると見た目がおかしくなることがある
【Unity】Android アプリでパーミッション(権限)要求をする
【Unity】IncrementalCompiler でのエラー:Unloading broken assembly Packages/com.unity.incrementalcompiler/Editor/Plugins/Unity.PureCSharpTests.dll, this assembly can cause crashes in the runtime
【Unity】Unity2018 でビルドエラー「CommandInvokationFailure: Gradle build failed.」が出る



category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityプラグイン  Unityオープンソースライブラリ 
tb: 0   cm: --

【Unity】【VRMLiveViewer】GLBで背景モデルを自作する  


 今回は、VRM Live Viewer で背景を自作したい人のために、GLB を使った簡単な素材作成法を書いておこう。これは実際にデモで使った素材の作り方そのものなので、同じようにやれば、そっくりそのままの背景モデルを作ることもできるだろう。



 GLB は汎用的な3Dモデルフォーマット GLTF と内部的に同じフォーマットである。簡単に言えば GLTF のアーカイブ方式が GLB と考えても良い。専用フォーマットではないため、VRM Live Viewer とは関係なく、色々なもので使える利点がある(例えば、Windows10のペイント3Dでも読み込める)。最近では「Vキャス背景」などにも大量にアップロードされているように、割と誰でも作れることもわかるだろう。

 実の所、VRMGLB と同じ GLTF を拡張したフォーマットだったりする。なので、.vrm を .glb に拡張子を変えるだけで使えるものもある。

 幸いにも Unity では UniVRM というオープンソースライブラリも無料で提供されているので、それを使えば誰でも簡単に GLB ファイルも作れる。公式にも GLB の説明は書いてあるので、一読しておくと良いだろう。今回はそれを実際にやってみたという内容だ。自作するときの参考にでもして貰えると嬉しい

glbファイルの作り方


(※) Unity 2018.4.0f1 / UniVRM 0.51.0 / Windows10(x64) で確認



■UniVRM のインポート

 今回は最終的に GLB でファイルを出力するために UniVRM というライブラリを利用しよう。Release ページへ行って、.unitypackage をダウンロードしよう。ここでは「UniVRM-0.51.0_1b36.unitypackage」と「UniVRM-samples-0.51.0_1b36.unitypackage」の2つ(※バージョンは掲載時点なので、置き換えて下さい)をダウンロードして欲しい。これはライブラリ本体とその利用サンプルだが、-samples の方に GLB エクスポートなどの機能も含まれているので、どちらも必要になる。インポートする順は本体→サンプル(-samples)の順の方が良いだろう(逆だとエラーが出る)。

UniVRM (Release)

 Unity 自体が初めての人は「Unity Hub」をダウンロードして、「インストール」から最新のバージョンをダウンロードすると良い。

Unity ダウンロード



 メニューに「VRM」が追加されていれば完了だ。実際にこれだけで、例えばシーンに1個 Cube を置いて、それをヒエラルキーで選択したまま、メニューから Export すれば glb ファイルが作れる。



 まぁ、今回は背景を作ってみるというテーマなので、アセットストアから無料素材を落として、それを glb にすることを練習にやってみよう。試してみたら、少しばかり注意すべき点もあったので、その辺りも書いておこう。



■アセットストアから素材のインポート

 今回は「Grass Road Race」という無料素材をアセットストアからダウンロードして使ってみよう。

 使う素材は何でも良いが、注意点としては Terrain の地形より、なるべく単体のメッシュで構成された素材の方が良いだろう。理由は編集しやすい事もあるが、Terrain だとそのままエクスポートできず、変換が必要となるからだ。またその変換されたメッシュはポリゴン数などが大きくなってしまうため(ツールによっては間引きできるが、感じが変わってしまう)、アプリなどに利用すると重くなってしまう傾向がある。その辺りの工夫も後述しておこう。


 Unity をあまり使ったことない人に説明しておくと、アセットストアとは Unity で直接使える素材(3Dモデルだけでなく、アニメーションやスクリプトなども含む)を購入できる専用ストアで、また自分で販売することもできる(私も Android のプラグインを無料で配布している)。無料のものも結構あるので(検索で $0 にすれば無料だけを検索できる)、色々試してみるのにも良いだろう(Unity 上からは Ctrl + 9 で検索すると良い)。


 インポートしたら準備は完了だ。次は素材を GLB 用に編集してみよう。



■GLB 用に素材を編集する(島を作る)

 まずはインポートした「GrassRoadRace」フォルダ以下のサンプルシーン「Scene_GrassRoadRace」を開いてみよう。元のシーンを残しておきたいなら、Ctrl + D で複製を作って編集しても良い。



 地形は自由に作っても良いが、私が実際にやった方法と、ちょっとした注意点を書いておこう。

 先に概略を挙げておくと、使うシェーダとアニメーション、メッシュの結合などである。特にシェーダに関しては公式にもあるように『Standard もしくは Unlit/Color, Unlit/Texture, Unlit/Transparent, Unlit/Transparent Coutout, UniGLTF/UniUnlit』となっている(掲載時点:UniVRM0.51.0)。ここでは基本的に Standard シェーダのみを使う

 完成形は1つの孤島を作ってみた。大きさは 10x10 m くらいだろうか。Unity の Scene ビューでは薄いグリッド線が見えると思うが、これが 1m となっている(拡大してるとき)。わかりずらければ Cube が 1x1x1 m なので1つ置いて基準にするのもいいだろう。最終的に VRM Live Viewer で使うなら、Capsule(高さ[Height]を 1.5m [身長]にしておく)を人型として目安にするのも良い。




 島を構成するオブジェクトは「Ground02」「Ground03」「Ground04」の3つだ。検索すればいくつか出てくるが、1つずつ取り出して、空の GameObject(ここでは「island_base」としている)に入れよう。Position は一旦 (0, 0, 0) にしてから、ぐるりと周りからみて穴が開かないように、Position を配置して欲しい。参考に値を書いておくと、Ground02: (0, 0, 0), Ground03: (0, 0, -3.809998), Ground04: (0, 0, 3.809998) となっている。調整中は邪魔なので Track は非表示にした方が良いだろう。




 また今回は島にフェンスを付けないので、ここで削除してしまおう。Unity 2018 以降を使ってるなら、各素材を選択して、「Unpack Prefab」(Unity2017 以前は「Break Prefab」だった気がする)した後で、「Fence」を削除しよう。




 次にシェーダの設定を変更しておこう。初期の状態では「Mobile/Diffuse」になってると思うが、これを全て「Standard」にしておいて欲しい。すると見た目が暗くなると思うが、「Albedo」を完全な白に、「Smoothness」を0にすれば、少し明るくなる。使えるシェーダについては公式に書いてあるので、参照して欲しい。





 最後に島全体の大きさと位置を決めておこう。親オブジェクト(island_base)をヒエラルキーで選択して、Transform を適当に調整すれば良い。




 木の配置も基本的には同じやり方だ。非表示にしている Track の中から「GroundIsland」を取り出し(Scale が (1, 1, 1) のものを選ぶと良い)、空のオブジェクト(tree_base としている)の中に入れよう。一旦全ての Position を (0, 0, 0) にした方が良い。



 島のときと同じように、「Unpack Prefab」をした後で、「Grass」と「PalmTree」を選択し、シェーダを設定して欲しい。シェーダはマテリアルごとの設定となるので、面倒ならマテリアルの方をプロジェクトビューで全て設定しても良いだろう。




 シェーダを設定したら、木を複製(ヒエラルキー上で Ctrl + D)して3つにしよう。Position は適当で良いが、参考値としては、(0, -1.108, -4), (3.4, -1.108, -4), (-3.4, -1.108, -4) となっている。



 3つ適当に並べたら、親オブジェクトである「tree_base」を複製(Ctrl + D)して、180度回転しよう。これで簡単に6つになった。少しだけ Z の値を調整している。値は適当で良い。




 後は両サイドに1つずつ木を足しておこう。空のオブジェクト(tree_base_side としている)を作って、tree_base, tree_base (1) の中の GroundIsland (2) をそれぞれ複製して(Ctrl + D)、tree_base_side 内に移動し、位置と回転を調整している。値は適当で良い。回転は木の根本にある草が島の内側に向くように調整すると良いだろう(裏からだと見えなくなるため)。




 最後にこれら全部の素材を1つにまとめる空オブジェクトを作り、その中に移動しよう。Z を動かしたのは原点から見て中心あたりにしたかったからだ。他のアプリなどで読み込むときのためにも、なるべく中心がワールド座標の原点となるように配置しておくと良い

 これで一応、島は完成だ。






■メッシュを結合する

 この操作は必須というわけではないのだが、特に今回のような複数の素材を組み合わせて作るものなどは、メッシュを結合をやっておくと良いだろう。その理由はテラシュールさんのブログを見て貰えばわかると思うが、単純に動かない物体などはなるべくまとめてしまう方が、利用時に軽くなるからだ。

Unityのシーン上に配置したモデルを結合する

 ここでは簡単にやり方を書いておこう。記事を読んでいくとソースコードが掲載されているが、github にも公開されているので、こちらから zip で落とすのが楽だろう(「Download ZIP」ボタンを押す)。

MeshCombiner.cs

 「MeshCombiner.cs」をダウンロードしたら、適当にフォルダでも作って、プロジェクトにインポートして欲しい。

 たぶん現在の Unity のバージョンではエラーが出ると思うが、エラーが出たら Console でダブルクリックし、エディタを立ち上げて欲しい。エラーの箇所は古い書き方なだけなので、今の書き方に修正するだけで良い。具体的には以下のように修正する。



●25行目(エラーが出てる行)を以下のように修正する
var mat = mesh.GetComponent<Renderer>().sharedMaterial ;


 修正してエラーが出なくなったら、MeshCombiner を完成した背景モデル(ここでは Island)にアタッチして欲しい。アタッチしたら、生成先となる空のオブジェクトをヒエラルキーで作成し、それを MeshCombiner の Generated Object にドラッグ&ドロップして設定する。



 Generated Object を設定したら、MeshCombiner の 右端にある歯車アイコンを押して、メニューから「Export」しよう。しばらくすると、元オブジェクト(Island)が無効化され、代わりにメッシュが結合されたオブジェクトが生成される。名前は後でわかり易いように変えておくと良い。




 特に見た目が変わってないので、わかりずらいかも知れないが、プロジェクトビューで見てみると、結合された新しいメッシュが生成されていることがわかる(物によっては少しテクスチャが元と違う感じになることもある。マテリアルごとにまとめられるらしい)。



 ここまででも、出来上がった背景オブジェクトをヒエラルキーで選択して、メニューから「VRM>UniGLTF-1.28>Export」すれば glb
出力できる。試しに VRM Live Viewer で読み込んで見ても良いだろう(ウィンドウに出力ファイルをドロップすれば良い)。





■海を作る

 まずは、海(Wave)を非表示にした Track の中から取り出そう。そしたら、一旦 Position を (0, 0, 0) にし、ヒエラルキーで Wave を選択した状態で「Unpack Prefab」をし、シェーダを Standard にして値を設定する。これらは今までと同じやり方だ。




 海を配置すると、原点から Z 方向に伸びていることがわかる。今後アニメーションで利用するためにも、ここでちょっと工夫しておこう。島を作るときに使った MeshCombiner を Wave にアタッチし、Position Z を -188 にして欲しい。また、MeshCombiner の出力先となる空のオブジェクト(Sea としている)を作り、設定する。そしたら歯車アイコンから Export してメッシュ結合しよう。




 実はここで MeshCombiner を使ったのはメッシュの基準を原点にしたかっただけだったりする(笑)。なので、自分で Plane を作ってマテリアルを貼り付けるのもアリだと思う。また、スケールを1にする目的もある。こういう使い方もあると覚えておくと、素材作りに役に立つかも知れない。

 あと、結合すると static(静的オブジェクト=動かないオブジェクト)となるので、チェックを外して欲しい。外そうとするとダイアログが出るが、これは「子要素も外すか?」という質問なので、「Yes」の方を選択して欲しい。これは後でアニメーションさせたいので、そのための準備だ




 最後に全体を1つにまとめる空オブジェクト(root としている)を作って、島(Island)と海(Sea)をその中に入れよう。また、少し海の Y 座標を -1.5 下げて、島が浮いている感じを出してみる。




 これで背景モデルの全体像は完成だ(カメラは少し近づけている)。もちろん、ヒエラルキーで root を選択したまま、メニューから Export すれば glb ファイルが作れる。





■アニメーションをする

 ここまでで、GLB が一応できたと思うが、ちょっと工夫して海の水の流れっぽいアニメーションを作ってみよう。と言っても、ここでやる方法はあくまで GLB 仕様のための方法で、アニメーションの例としては良い使い方というわけではない(大抵はテクスチャの UV 座標を移動する方が多いと思うが、スクリプトが必要なため)。しかし基本は同じなので、実際には自由にアニメーションを付けてみると良いだろう。

 ここで GLB の仕様を確認してみると『一番親のオブジェクトに付けてください。回転はQuaternionのキーフレームを打ってください。移動・回転・拡縮に対応しています。BlendShapeは未対応』とあるので、この場合、アニメーションは「root」にアタッチすれば良いことがわかる。

 まずはヒエラルキーの「root」を選択し、Ctrl + 6 からアニメーションビューを表示しよう。後述の「Create」でファイルが作成され、必要な Animator が自動でアタッチされる。




 アニメーションの使い方・作り方などの詳細は公式のマニュアルを読んで欲しいが、ここでは概要だけを簡単に書いておこう。あくまでも大雑把にそれっぽく作る例なので、クオリティ云々は度外視して欲しい(笑)。

アニメーション
新しいアニメーションクリップの作成

 アニメーションビューが開いたら、まずは「Create」ボタンでアニメーションクリップのファイルを作ろう(sea_move としている)。ファイル名は適当で良い。



 ビューでは「Add Property」を押し、海の Transform:「Sea>Transform>Position」を開き、(+)ボタンを押す。



 初期状態では1秒後にキーフレームが打ってあるので、それを削除しておく。



 海の移動では Z 方向だけを使うので、最初のフレーム(0)には Z:100 を、フレーム:18000(5分後)には Z:-100 を、フレーム:36000(10分後)には Z:100 にキーフレームを打っておく。一番簡単な方法は、ビューのプレイボタンの右にあるテキストボックスにフレーム数を入れ、そのすぐ左下にあるキーフレーム追加ボタン(菱形に+があるアイコン)を押して、プロパティの Position.z に直接値を入力することだ。

 ちなみにこれは、海が前後にゆっくり5分かけて移動することを意味する。



 また、プレビューで再生してみるとわかるが、初期状態ではイージングが入っているので、だんだん早く移動するようになっている。このままでも別に構わないが、動きが確認しずらいので、とりあえずビュー下にある「Curves」を押して、動きを直線的にしてみよう。



 編集方法は各ポイントを右クリックし、すべての Tangent を「Linear」にしておく。まぁ、往復する瞬間は急激なターンとなるが、その辺が気に入らなければ、カーブを付けても良いだろう(※だが、GLB では効いてない気がする)。



 最後に、作ったアニメーションクリップ(ここでは sea_move)をプロジェクトビューで選択し、「Loop Time」のチェックをオンにし、アニメーションをループ再生にしておこう。



 試しにエディタで再生してみるのも良いだろう。ただ、デモのカメラをそのまま使ってるなら、「Camera Move」はオフにし、カメラの Transform を島の近くに移動した方が良いだろう。上手く行ってれば、海が流れるように見えるハズだ(ただ移動してるだけだが(笑))。





■GLB ファイルを出力する

 ここまでで本当に完成だ。後は冒頭にも書いたように、ファイルをエクスポートするだけだ。本当にお疲れさま(笑)。

※他者の素材を利用した場合は、あくまで学習用途に限定しておき、配布などはしない方が良いでしょう。



 VRM Live Viewer で見てみるにはウィンドウにドロップするのが簡単だろう。あとは色々工夫して素材作りを楽しむのも良いと思う。Unity2018 以降を使うなら、ProBuilder で1から作っても良いかも。観た人があっと驚くようなシーンを作ってみたいね(笑)。

ProBuilderでモデリング入門







(関連記事)
【Unity】VRM(VRoid)をライブステージで踊らせるアプリを作ってみた
【Unity】VRoid(VRM)をインポートして動かす
【Unity】【C#】Android で VRM(VRoid)を動的に読み込む
【Unity】AssetStore版 FantomPlugin のセットアップ
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた


category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityオープンソースライブラリ  VRM  VRoid  VRMLiveViewer 
tb: 0   cm: --

【Unity】Unity2019 の StandardShader の処理が少し変わったらしいよ  


 ちょっと試しに Unity2019 にプロジェクトをアップグレードする実験をしてみたら、何か半透明なゴーストが現れた(笑)。


 そしたら VRoid 開発のしげぽんさんから有益な情報を頂いた。


 いずれ何ら対応しなくてはならないので、備忘録として残しておこう。情報共有しておけば、同じ問題にぶつかった人にも役に立つしね。

 Unity 本体や関連ライブラリのバージョンアップで色々な問題が出るのは、もう慣れっこだが(笑)、初期の頃は情報が少ないので、良い解決法が見つからないこともあるんだよね。けれど多くの人の目に入れば、色々な解決法も提示されやすくなる。

 Unity2019 には ShaderGraph や LWRP も導入されたし、今後こういった表現系の仕様はより複雑になりそう。私はこの辺りはあまり詳しくないので、少しは勉強して置かなければな…。有用な情報があったら教えてくれると嬉しい(笑)。






(関連記事)
【Unity】Unity2018.3.2 にアップグレードすると見た目がおかしくなることがある
【Unity】Android アプリでパーミッション(権限)要求をする
【Unity】IncrementalCompiler でのエラー:Unloading broken assembly Packages/com.unity.incrementalcompiler/Editor/Plugins/Unity.PureCSharpTests.dll, this assembly can cause crashes in the runtime
【Unity】Unity2018 でビルドエラー「CommandInvokationFailure: Gradle build failed.」が出る


category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityトラブルシューティング  VRM  VRoid 
tb: 0   cm: --

【Unity】【C#】アセットバンドルのキャッシュを調べて不要なものを消す  


 もう随分 AssetBundle Manager を触ってなかったのだが、ちょっと利用する機会があったのでメモ。

 どうやら Unity2017 以降にはキャッシュの操作もできるようになったみたいなので、キャッシュの存在確認や不要なキャッシュを簡単に削除できると良いと思った。

 この AssetBundle Manager はUnity5 時代のもので、もうアセットストアからは落とせないみたいだが、まだお世話になってる人のためにも機能追加案を書いておこう。他のツール使ってるなら必要ないかもだが、同じような考え方なら流用もできるだろう。


(※) Unity2018.3.9f1 / Windows10(x64) で確認



●マニフェストからハッシュを取得
//マニフェストからハッシュを取得
static public Hash128 GetAssetBundleHash(string assetBundleName)
{
return m_AssetBundleManifest.GetAssetBundleHash(assetBundleName); //※先にマニフェストをロードしておく必要あり
}

 この関数はレガシーな AssetBundle Manager を基にしてるので注意(スコープや書き方も合わせている)。

 これは元からある AssetBundleManifest.GetAssetBundleHash を少し簡単にしただけのものなので、あまり説明はいらないだろう。このハッシュは実際にマニフェストに書かれているもので、テキストエディタなどで「~.manifest」を開けば、それぞれの「AssetFileHash」に対応していることがわかる。もう結構古い記事になるがテラシュールさんの記事に詳しく書いてあるので、参考資料として載せておこう。

AssetFileHashとTypeTreeHashは、AssetBundleの更新判定
AssetBundleManifest.GetAssetBundleHash



●アセットバンドルがキャッシュに存在しているか?(url と hash を用いる)
//アセットバンドルがキャッシュに存在しているか?
static public bool IsExistCaching(string assetBundleName)
{
var url = BaseDownloadingURL + assetBundleName;
var hash = GetAssetBundleHash(assetBundleName);
return Caching.IsVersionCached(url, hash);
}

 この関数もレガシーな AssetBundle Manager を基にしてるので注意(スコープや書き方も合わせている)。GetAssetBundleHash は前述したものだ。

 なぜだかわからないが、この関数はわりと昔からあって(Unity5 の時代からあったらしい?)、マニュアルにも載ってるバージョンとそうでないバージョンがある。

 IsVersionCached(string url, int version) の方は Obsolute(廃止予定)だし、version の指定はどちらかというと、アセットバンドル全体のバージョンという感じで、個々のアセットバンドルの差分としては使いづらいんだよね(この version は WWW.LoadFromCacheOrDownload [obsolute] や UnityWebRequestAssetBundle.GetAssetBundle などの引数に当たる)。なので、ハッシュの方を使いたいことが多い。まぁ、url 指定なので少し使いづらいが…。

 また、ハッシュと任意の名前を用いることもできる。ここでは名前をアセットバンドル名としておくと、以下のようなものも作れる。

●アセットバンドルがキャッシュに存在しているか?(url と name を用いる)
//アセットバンドルがキャッシュに存在しているか?
static public bool IsExistCaching(string assetBundleName)
{
var hash = GetAssetBundleHash(assetBundleName);
var cab = new CachedAssetBundle()
{
hash = hash,
name = assetBundleName,
};
return Caching.IsVersionCached(url, hash);
}

 こちらの方が使いやすいかも知れない。url をキーとしてないので、移動しても使える。

 ついでに色々資料も載せておこう。

キャッシュの存在確認
Caching.IsVersionCached
WWW.LoadFromCacheOrDownload [obsolute]
UnityWebRequestAssetBundle.GetAssetBundle



●現在のハッシュ以外のキャッシュを消す
//現在のハッシュ以外のキャッシュを消す(※使うタイミングに注意)
static public bool ClearOtherCaching(string assetBundleName)
{
var hash = GetAssetBundleHash(assetBundleName);
return Caching.ClearOtherCachedVersions(assetBundleName, hash);
}

 この関数もレガシーな AssetBundle Manager を基にしてるので注意(スコープや書き方も合わせている)。GetAssetBundleHash は前述したものだ。

 これは割と最近(Unity2017.1 以降?)にできてたらしい。調べていたら出てきたので、試してみたら上手く行った。実行は同期的なのでタイミングには気をつける必要があるが(まだ古い使用中アセットがあった場合、途中破棄されるわけで)、他にも削除する方法はあるみたいなので、色々やってみるのも良いかも知れない。また、資料には「デフォルトで150日間で期限切れ」ともあるね。以下に記事も載せておこう。

[Unity 2018.2] AssetBundleのキャッシュを完全に理解する
期限切れによる削除
Caching.GetCachedVersions



 まぁ、この AssetBundle Manager 自体は旧時代のものなので、これからも使うなら少し書き直した方が良いかも知れない。WWW よりも UnityWebRequest の方がパフォーマンス良いと聞いたこともあるし、実際に書き換え例なんかもあるので、自分でやってみると良いかも(Unity2019 には Addressable Assets というものも出てくるらしいしので今更だが(笑))。

AssetBundleManagerのwwwをUnityWebRequestに変えて、さらにキャッシュの古いバージョンを削除してみる






(関連記事)
【Unity】【C#】AssetBundleManager を WebGL で使う・エラー対処法
【Unity】【C#】Addressable Assets でキー(アドレス)の存在(登録)を調べる


category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityライブラリ  Unityオープンソースライブラリ 
tb: 0   cm: --


プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop