unity 使い始めのころ、各種ファイルと共に生成される .meta ファイルが邪魔だなと思っていました。
それをけすなんて、とんでもない!
meta ファイルは 人間界のパスポート
海外にいってパスポートを失くすと、大変なことになりますよね?
慣れない土地で現地の警察や公的機関に書類を発行してもらいます。もちろん言葉は通じません。
その後どこにあるかわからない大使館を探し、再発行をお願いしても「戸籍謄本がなければ無理です」とにべもなく断られ……無事日本に帰るまでに、想像を超える面倒が降りかかってくるのです。
meta ファイルは unity 界におけるパスポートです。
そして、これを失くした場合、元の自分であることを証明する手段が完全に失われます。
失われた maru_face.png には新しい meta ファイルが自動的に作成されますが、これは以前とは別人である証明です。
前の meta ファイルが「山田太郎」として存在を証明されていたとして、その meta を消した後自動生成される meta ファイルは「鈴木次郎」かもしれないし「三軒茶屋キラリンコ」かもしれません。
今まで山田太郎だから親しくしていた友達もそっぽを向き、あなたは完全に孤立します。
あなたは unity 界で新しい名前をつけられ「産まれたばかりの赤子」扱いされてしまうのです。
具体的にどういう事が起こるのか
実際の「人」でもないんだし、なにを大げさな
そう思われてしまうのも無理はありませんので、実例を出してみましょう。
なお、この説明はわかりやすくするため、一部のオペレーションを省いています。
maru_face(.png) という TextureType = Sprite を Image に貼り付け、Canvas に配置します。
結果として Game ビューに絵が配置されます。とても単純な構造です。
この Image を7つ並べるのが仕様のようです。ササッと並べてしまいましょう。
ここで、うっかりエクスプローラを使って、maru_face.png.meta を削除してしまいました……!
(maru_face を maru_face2 にリネームしてしまった、などでも OK。エクスプローラであることがポイント)
全てのキャラクターが消えてしまいました。
Image に登録された Source Image には Missing(Sprite) と表示されています。
maru_face は存在するのですが、Image には気づかれていない様子です。
よく見ると、maru_face の TextureType も Default になっています。
これが「山田太郎」が「冥王星アナスタシア」に変わってしまった瞬間です。
maru_face が前と同じであると理解しているのは人間界の人間だけ。
unity 界では完全に別人だと思われてしまったのです。
unity 界ではどうやって人(ファイル)を区別しているのか
それでは unity 界ではどのように区別しているのでしょうか。
maru_face.png.meta が消す前、消す後でどう変化したか確認してみることにします。
guid の値が異なっています。これが unity 界での名前です。
パスポート番号というより、マイナンバーでしょうか。そのファイルが唯一無二であることを示す大切な番号です。
Image はこの guid とリンクしています。
今度は Image の meta ファイルを覗いてみましょう。
シーン情報(SampleScene.unity)にその情報があります。Image は7つ配置したので、7つ削除前の guid を確認することができます。
と、いうことは理論上この SampleScene.unity の guid を変更後に書き換えれば、無事キャラクターは表示されるでしょうか。
書き換えたところ、確かに無事元に戻りました。
ただこれ、ここまで単純なサンプルですし、削除前の ID を取っておいたから出来る芸当です。
現実的には、Image を1つ1つ選んで絵をリンクしなおす作業が待っているでしょう。
使っている場所がハッキリしていればいいですが、大量のシーンや GameObject の中から全てを探し出すのは容易ではありません。
壊れてしまったジグゾーパズルを、また最初からやり直すような苦行が待っています。
そういう事にならないよう、meta ファイルは消さないようにするのが正しいアプローチです。
今回はエクスプローラで削除しましたが、その他にも Git でアップするときに meta ファイルを上げないと全員(全ファイル)別人に成り代わり、収拾のつかないプロジェクトが出来上がります。
データベース系の仕事をしている人は、この理屈は割とすんなり理解できると思います。
なぜファイル名ではなく guid なのか
ここまで聞いて思うことでしょう。なぜ guid なんて目に見えない値を使っているのか。
それを知らなかった俺は、そのお陰でひどい目にあったんだ、と。
でも、よく考えてみてください。
ファイル名でリンクした後、そのファイル名を変えたらリンクが全部外れてしまいます。
また、もしファイル名ではなくフルパス名だった場合は、ファイルを移動しただけでもリンクが外れてしまいます。
ファイル変更前と後の名前わかってたら、unity がなんとかしてくれてもいいじゃん
俺ならそう設計するけど。そんな声が聞こえてきそうです。
ただ、例えそこまで unity が頑張ったとしても、それは unity 上で名前を変更した時のみ許される動作です。
エクスプローラが勝手にファイル名を変更したものまで検知できませんので、かえって混乱を呼び起こすことでしょう。
それ以外にも、もし同名のファイルがあったら詰むなど、ファイル名ベースの方が問題が多いため、meta ファイルの中に guid という識別子を用意し、ファイルの証明書として使っているのだと思います。
meta ファイルは guid 以外にも色々な情報が入っています。インスペクタの設定値など。
meta は消さない、他人に渡す時も必要と思っておけば OK
ただでさえ大量なファイルを2倍にする meta ファイル。
ちょっと鬱陶しいですが、絶対死守が結論になります!
unity の仕様を知らないうちは「やらかす」可能性が高いので、注意しましょう!