見出し画像

【VRChat】.metaという"荷札"の話【Unity】

今北産業

・metaデータとは"荷札"である。
・Unity上にドラッグアンドドロップするとファイルがインポートされるが、それと同時にmetaデータが生成される。
・ファイルだけ置き換えることによって、Unity上での紐づけを維持したままファイルを差し替えることが可能である


イントロダクション

今回は最初に書いた下記記事の補足になります。
上に書いた記事の"アバターごとのCustomフォルダをつくる"の部分について、読み返してみると乱文過ぎて何がしたいのか分かりづらい部分があるので、今回細かく解説するのが主題です。

前提知識

・UnityやWindowsの基本的な操作ができる
・インスペクター、ヒエラルキー、シーン、アセット、インポートなどの用語を理解している
・分からない単語が出てきたり困ったときに挫けない意欲
あとこの2つの記事を読んでる前提で進めていくので、記事内で解説していること(Unityの日本語化、画面レイアウトが違う点)などは端折っていきます。

そもそもUnityは如何にしてファイルを識別しているのか

例えば今まで、こういう経験や疑問はありませんでしたか?

  • Unity上でマテリアルのメインカラーに指定されているテクスチャの名前を変えたが、マテリアルから見るとちゃんと紐付けが維持されている。

  • テクスチャを圧縮するためにUnity上で解像度を変えたけど、画像自体の解像度は変わっていない。この情報(4Kを2Kに圧縮してビルドする)って、どこに保存されてるの?

  • Unityのプロジェクトフォルダを見てみたら".meta"って拡張子のファイルがあるけど、これって何のためにあるの?

実はUnityの場合、アセットフォルダの中にあるすべてのファイルに.metaという拡張子のファイルが付いています。そして「じゃあコイツって何のためにいるのよ?」ってのを解説するのが今回の記事です。

赤枠が.metaファイル。ファイル名の末尾に".meta"という拡張子が付いていて、すべてのファイルについていることが分かる。

メタデータ及び.metaとは何なのか

この.metaという拡張子は元々「メタデータ」という単語から来ています。
メタデータとはデータについてのデータを意味する単語です。
例えば、デジカメで撮った写真などには使ったカメラのモデルや、露出時間、ISO感度などが記録されています。

Wikipediaにてボーイング777の記事に掲載されている画像のメタデータ。
Nikon D200というデジタル一眼レフで撮影されたことが分かる。

元となる画像データにはこういった文字情報を直接記録できないので、データを入れる箱を作って、そこに荷札のような形で情報を記録して貼り付けています。

Unityにおいては.metaファイルの中にテクスチャの解像度などを記録しており、この中では"GUID"と呼ばれる一意の識別子も割り当てています。
このGUIDを使ってUnityはファイル管理をしています。

こうすることによって、例えばUnity上でファイル名を変えてもGUIDは保持されるので、ファイルの関連付けが維持されます。
".metaファイルは段ボールについている荷札のようなもので、Unityは荷札を見ている"と覚えてください。

Face.png.metaを開いた例。Face.pngのGUIDは58ae<中略>a307であることが分かる。
Unityはファイル名ではなく、このGUIDを見てマテリアルなどに紐づけている。
因みに、これより下にスクロールすると解像度の設定値などが記録されている。

イメージとしてはこんな感じです。
ここでポイントなのは、"Unity(下記イラストだと配送業者)はあくまで荷札しか見ていない=中身を見て判断しているわけではない"という点です。

今回初めていらすとやを使いました

以前書いた記事で「テクスチャファイルを直接上書きしろ」と書いた理由

ここで以前の記事を思い出してほしいのですが、「テクスチャを変える時はファイルを上書きしろ」と書いていました。
Unityのアセットフォルダにファイルをドラッグアンドドロップすれば良さそうなものですが、これはどうしてでしょうか?

以前の記事。プロジェクト内のテクスチャフォルダまで飛べるショートカットを事前に作って、ファイルを上書きしろと書いてある

先に結論を書いてしまうと、変え損ねた時に余計なテクスチャをビルドさせないためです。

Unity画面にドラッグアンドドロップしてテクスチャを追加をした場合

では、物は試しでやってみましょう。Unityのプロジェクト画面(アセットフォルダ)にテクスチャをドラッグアンドドロップしてみます。
ファイル名が同じなので上書きされると思いきや、勝手にリネームして別のものとして扱われました。

Hair.pngをHair.pngのフォルダにドラッグアンドドロップしてみます。
そうするとHari 1.pngとしてインポートされました。
同じ拡張子なので、重複しないように自動で末尾に数字が付きます。

ここで、インポートしたテクスチャ(Hair 1.png)と、元のテクスチャ(Hair.png)についている.metaデータを見てみましょう。

赤枠の部分に注目。pngファイルの中身は寸分違わぬ物なのに、ファイルとしては別としてカウントされてしまっている。

Unityくんが気を利かせて別のGUIDを割り当ててくれました。ごらんの通りUnityのアセットフォルダにファイルをドラッグアンドドロップすると、ファイル名や使う用途が同じでも、GUIDは別になってしまいます。

この方法でUnityに改変済みのテクスチャを入れた場合、これまで古いテクスチャを使っていた場所に手動で割り当てる必要があるのですが、ここで変え損ねると問題が発生します。

赤枠の部分を両方変更しないといけないが、ここで下の方にある"輪郭線"に割り当てられたテクスチャを変え忘れたとします。するとどうなるか。

例えば、liltoonだと輪郭線の部分にメインカラーと同じテクスチャを割り当てられていることが多いですが、ここを変え忘れるとメインカラーのテクスチャが2枚分ビルドされることになります。単純にテクスチャの容量が2倍になるわけですね。

Unityくんからすると命令に従ったつもり。
マテリアルさんも命令に従って2つのテクスチャをキッチリビルドする。

テクスチャファイルを上書きした場合

では今度は、テクスチャファイルをUnityの外、つまりエクスプローラーを用いて上書きしてみましょう。

まずはエクスプローラーでそれぞれのフォルダを開きます。
上がコピー元となる作業用のフォルダ、下がコピー先となるプロジェクト内のアセットフォルダ(テクスチャが置いてあるフォルダ)となります。

上から下にコピーします

上のフォルダでファイルをコピーし、下のフォルダに貼り付けてファイルを置き換えます。

ここでは「ファイルを置き換える」をクリック

ここで試しに「コピー先」のファイルを確認してみましょう。
Hair.png(置き換えたテクスチャファイル)は更新日時が更新されていますが、.metaファイルの方は更新されていません。つまりGUIDや解像度の設定はそのまま保持しています。

プロパティでタイムスタンプ確認
テクスチャのタイムスタンプは更新されているが、metaファイルはタイムスタンプが更新されていない。

ここでUnityに戻りましょう。Unityの画面をアクティブにするとテクスチャが綺麗に入れ替わっています。先ほどのように、輪郭線の方だけ変わっていないということもありません。

テクスチャの紐づけが維持されたまま、入れ替えることが出来た。

またいらすとやを使って解説すると、今回やった事は"荷札はそのまま、段ボール箱の中身だけ入れ替えた"ということです。
Unityを介さずに(つまりエクスプローラーなどで)ファイルを直接更新すると.metaファイルは更新されません。よって、元々のテクスチャが割り当てられていた場所は、例外なく新しいテクスチャに置き換わります。

段ボールの中身が入れ替わっていても、Unityくんは気にしません。
ちょっと考えた後、元の送り先にお届けします。

まとめ

まとめるとこうです。

  • Unityの画面にドラッグアンドドロップした場合、元のファイルをは別のファイルとして扱われるので、再設定の手間がかかる。また、再設定箇所に漏れがあると、アバターの容量が余計にかさむ。

  • エクスプローラー等でファイルを直接上書きすると、元のファイルが紐づけられていた箇所は全て新しいファイルに置き換わる。これによって、再設定の手間や、変更漏れによる容量増加を防ぐことが出来る。

今日はここまでです。それでは、また。


この記事が気に入ったらサポートをしてみませんか?