topazの遊び場

いろいろやってみる

シーファイル「 .unity」 ~ 最小構成を求めて ~

Unityのシーンファイルは.unity拡張子で作られています。YAML形式のテキストで書かれているので、作ろうと思えば自分で書くことができます。 シーンのコンフリクトを自力で直したことがある人は見たことがあるのではないでしょうか?

初めに言っておきますが今回の内容は

Unityで開発する上でほとんど知らなくていい内容です。

.unityファイルを見ていじってみた。

興味あるかたは、適当なプロジェクトを作って.unityファイルを覗いてやってみましょう。 ざーっとながめてみると、意外と単なるyamlファイルで、馴染みにある単語がたくさん出てきたのではないでしょうか。

全く怖いファイルではないので、しっかり向き合ってあげると仲良くなることができます。

では、最初の二行を見てみましょう

%YAML 1.1
%TAG !u! tag:unity3d.com,2011:

Unityの公式ドキュメントによると、以下のように言われています。

必ず 次の 2 行で始まる必要があることに注意してください。 これがないと Unity に拒否されます。

おまじないだと思ってもらって必ず書いておきましょう。
と、言いたいところですが。。
一行目の%YAML 1.1を書かなかったりバージョンを1.1から他のものに変えると動かなくなるので書かなきゃいけないのですが、 下の%TAG !u! tag:unity3d.com,2011:は書かなくてもエラーが出ず、エディタ上では動作することが確認できました。(普段は書いておきましょう)

その下にはコンポーネント情報など「.unity」にいろいろ書いてあるんですが、Unityの公式にはこうも書いてありました。

不足しているプロパティのデータについて、デフォルトの値が可能なかぎり使用されます。

これはつまり、デフォルトの値を使う場合には、.unityファイルから消しても問題ないということです。

例えば、Transformコンポーネントを一部抜粋してみてると、RotationやPositionがプロパティとして書かれていることがわかります。

Transform:
       ~~~~
  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
  m_LocalPosition: {x: 0, y: 1, z: -10}
  m_LocalScale: {x: 1, y: 1, z: 1}
       ~~~~

しかし、これらの座標プロパティのデフォルト値は 原点になっているようで、これらは消しても問題ありませんでした。

今回はこのように省略可能なプロパティや不必要な記述を減らして、最小構成にしてみました。

結果は15行で構築することができました。

%YAML 1.1
--- !u!1 &1111
GameObject:
  serializedVersion: 6
  m_Component:
  - component: {fileID: 2222}
  - component: {fileID: 3333}
  m_Name: Po Camera
  m_IsActive: 1
--- !u!20 &2222
Camera:
  m_GameObject: {fileID: 1111}
--- !u!4 &3333
Transform:
  m_GameObject: {fileID: 1111}

シーンにカメラは必要なので、カメラコンポーネントをつける元のGameObjectだけを用意しました。

感想

経緯としては、サークルのハッカソンで、コンフリクト起きたのでmetaファイル手動でいじって直していた時、新入生から「このfileIDって勝手に割り振っていいの」と聞かれた。
勝手に割り振っていいかは知らなかったから、実験してみたら自由に割り振れるっぽかった。 そこからIDいじったりmetaファイルからコンポーネント追加したいり、すごい遊んでいた。。。そしたらこの内容をやっていた。

いろいろ手探りでやってわかったことがあるので、今後また何か書くかも