Edited at

Unityの.metaファイルとは何なのか?

More than 1 year has passed since last update.


.metaファイルとは何なのか?


metaファイルとは

Assetファイルと対になった、メタ情報が書かれたファイルのこと。Assetを一意に識別することができるguidや、画像の圧縮フォーマット、またAsset同士の関係も保存されている。

Unity上での振る舞い方がmetaに保存されることによって元のAssetを変更することなく振る舞いを変えることができる。metaファイルが見つからないときは初期値が書かれた状態で自動生成されるため、1つのAssetには必ず1つmetaファイルがある


metaファイル削除しちゃったら?

metaを削除すると設定項目が消えてしまうのでデフォルトの状態に戻る。自動生成の場合、スクリプトPrefabのときはメタ情報にはguid程度しか書かれていないため、バージョン管理する際はこの.metaファイルも一緒に追加する。ここでmetaをコミットせずプッシュを行うと他の人全員がmetaを自動生成する惨事に成る。また、Assetファイルを操作したい時はUnity上のprojectウィンドウから操作するべき。


Finderから操作を行なったら?

Unity管理外(Finder等)から操作をすると、.metaファイルが更新されず、設定値が壊れてしまう場合がある。(例えばFinderからリネームした場合、.metaファイルが作り直されるため、guidが再生成されたためにInspectorのPrefab参照が外れたり、音、画像の設定値が初期化されるなど)


全てがmetaで設定が行われているのか?

全てのAssetの設定がmetaファイルで保存されているわけではなく、

Prefabやシーンファイル(.unityファイル)などは直接ファイル側に保存される。

(完全に外からImportされたAsset(fbxなど)の設定はmetaに書き込まれ、

Unity自身が生成したAsset(Prefabなど)は直接ファイルに書き込まれる)


metaのフォーマット?

metaのフォーマットをforce textに設定しておくと、prefabやsceneといったバイナリフォーマットのファイルをテキストで確認することができる。シーンのマージは難しいが、prefabのマージはなんとかなる可能性がある。


メタファイルに対応するファイルがないと?

メタファイルの参照元のファイルがない場合、メタファイルは削除される。そのため、Finderでメタファイルだけ残してファイルを更新することでファイルの上書きが可能。この用途以外ではprojectビューからファイルを操作するべきである(Projectビューではファイルを上書きできない)。例えばアセットの移動、名前変更、削除など。


gitでバージョン管理?

gitでバージョンコントロールを設定する際に複数人のメタファイルに対する設定が異なる場合、pull毎に違う内容が返ってくることがある。例えばForceTextにしている人とBinaryで設定している人がいた場合、メタファイルが自動的に変化してしまう。またVersion Controllの設定がmetaの人とasset serverを設定している人やUnityエディタのバージョンが異なる人も変化してしまうので注意が必要。

Unityはフォルダに対しても一つのmetaファイルを生成する。しかしGitでは中身が空のフォルダは管理の対象外とみなされる。そのためGitでコミットする際にフォルダは変更対象に入っていないけどmetaファイル変更対象に入っているという事態が発生する。空のフォルダのmetaファイルはコミットしないよう気をつけるべき。


メタファイルの保存タイミング?

メタファイルはシーンの保存やプロジェクトの保存、Unity Editor終了のタイミングで上書き保存される。なのでこれらを行っていない状態でエディタがクラッシュして落ちると.metaデータが古いままの可能性がある(場合によってはprefabの中身がなくなる(業務で体験しました))。エディタ拡張で自動セーブ機能など実装すれば解決が可能。


ちなみにGUIDについてもっと詳しく?

GUIDとは何なのか?


参考資料