【VRChat】.metaという"荷札"の話【Unity】
今北産業
・metaデータとは"荷札"である。
・Unity上にドラッグアンドドロップするとファイルがインポートされるが、それと同時にmetaデータが生成される。
・ファイルだけ置き換えることによって、Unity上での紐づけを維持したままファイルを差し替えることが可能である
イントロダクション
今回は最初に書いた下記記事の補足になります。
上に書いた記事の"アバターごとのCustomフォルダをつくる"の部分について、読み返してみると乱文過ぎて何がしたいのか分かりづらい部分があるので、今回細かく解説するのが主題です。
前提知識
・UnityやWindowsの基本的な操作ができる
・インスペクター、ヒエラルキー、シーン、アセット、インポートなどの用語を理解している
・分からない単語が出てきたり困ったときに挫けない意欲
あとこの2つの記事を読んでる前提で進めていくので、記事内で解説していること(Unityの日本語化、画面レイアウトが違う点)などは端折っていきます。
そもそもUnityは如何にしてファイルを識別しているのか
例えば今まで、こういう経験や疑問はありませんでしたか?
Unity上でマテリアルのメインカラーに指定されているテクスチャの名前を変えたが、マテリアルから見るとちゃんと紐付けが維持されている。
テクスチャを圧縮するためにUnity上で解像度を変えたけど、画像自体の解像度は変わっていない。この情報(4Kを2Kに圧縮してビルドする)って、どこに保存されてるの?
Unityのプロジェクトフォルダを見てみたら".meta"って拡張子のファイルがあるけど、これって何のためにあるの?
実はUnityの場合、アセットフォルダの中にあるすべてのファイルに.metaという拡張子のファイルが付いています。そして「じゃあコイツって何のためにいるのよ?」ってのを解説するのが今回の記事です。
メタデータ及び.metaとは何なのか
この.metaという拡張子は元々「メタデータ」という単語から来ています。
メタデータとはデータについてのデータを意味する単語です。
例えば、デジカメで撮った写真などには使ったカメラのモデルや、露出時間、ISO感度などが記録されています。
元となる画像データにはこういった文字情報を直接記録できないので、データを入れる箱を作って、そこに荷札のような形で情報を記録して貼り付けています。
Unityにおいては.metaファイルの中にテクスチャの解像度などを記録しており、この中では"GUID"と呼ばれる一意の識別子も割り当てています。
このGUIDを使ってUnityはファイル管理をしています。
こうすることによって、例えばUnity上でファイル名を変えてもGUIDは保持されるので、ファイルの関連付けが維持されます。
".metaファイルは段ボールについている荷札のようなもので、Unityは荷札を見ている"と覚えてください。
イメージとしてはこんな感じです。
ここでポイントなのは、"Unity(下記イラストだと配送業者)はあくまで荷札しか見ていない=中身を見て判断しているわけではない"という点です。
以前書いた記事で「テクスチャファイルを直接上書きしろ」と書いた理由
ここで以前の記事を思い出してほしいのですが、「テクスチャを変える時はファイルを上書きしろ」と書いていました。
Unityのアセットフォルダにファイルをドラッグアンドドロップすれば良さそうなものですが、これはどうしてでしょうか?
先に結論を書いてしまうと、変え損ねた時に余計なテクスチャをビルドさせないためです。
Unity画面にドラッグアンドドロップしてテクスチャを追加をした場合
では、物は試しでやってみましょう。Unityのプロジェクト画面(アセットフォルダ)にテクスチャをドラッグアンドドロップしてみます。
ファイル名が同じなので上書きされると思いきや、勝手にリネームして別のものとして扱われました。
ここで、インポートしたテクスチャ(Hair 1.png)と、元のテクスチャ(Hair.png)についている.metaデータを見てみましょう。
Unityくんが気を利かせて別のGUIDを割り当ててくれました。ごらんの通りUnityのアセットフォルダにファイルをドラッグアンドドロップすると、ファイル名や使う用途が同じでも、GUIDは別になってしまいます。
この方法でUnityに改変済みのテクスチャを入れた場合、これまで古いテクスチャを使っていた場所に手動で割り当てる必要があるのですが、ここで変え損ねると問題が発生します。
例えば、liltoonだと輪郭線の部分にメインカラーと同じテクスチャを割り当てられていることが多いですが、ここを変え忘れるとメインカラーのテクスチャが2枚分ビルドされることになります。単純にテクスチャの容量が2倍になるわけですね。
テクスチャファイルを上書きした場合
では今度は、テクスチャファイルをUnityの外、つまりエクスプローラーを用いて上書きしてみましょう。
まずはエクスプローラーでそれぞれのフォルダを開きます。
上がコピー元となる作業用のフォルダ、下がコピー先となるプロジェクト内のアセットフォルダ(テクスチャが置いてあるフォルダ)となります。
上のフォルダでファイルをコピーし、下のフォルダに貼り付けてファイルを置き換えます。
ここで試しに「コピー先」のファイルを確認してみましょう。
Hair.png(置き換えたテクスチャファイル)は更新日時が更新されていますが、.metaファイルの方は更新されていません。つまりGUIDや解像度の設定はそのまま保持しています。
ここでUnityに戻りましょう。Unityの画面をアクティブにするとテクスチャが綺麗に入れ替わっています。先ほどのように、輪郭線の方だけ変わっていないということもありません。
またいらすとやを使って解説すると、今回やった事は"荷札はそのまま、段ボール箱の中身だけ入れ替えた"ということです。
Unityを介さずに(つまりエクスプローラーなどで)ファイルを直接更新すると.metaファイルは更新されません。よって、元々のテクスチャが割り当てられていた場所は、例外なく新しいテクスチャに置き換わります。
まとめ
まとめるとこうです。
Unityの画面にドラッグアンドドロップした場合、元のファイルをは別のファイルとして扱われるので、再設定の手間がかかる。また、再設定箇所に漏れがあると、アバターの容量が余計にかさむ。
エクスプローラー等でファイルを直接上書きすると、元のファイルが紐づけられていた箇所は全て新しいファイルに置き換わる。これによって、再設定の手間や、変更漏れによる容量増加を防ぐことが出来る。
今日はここまでです。それでは、また。
この記事が気に入ったらサポートをしてみませんか?