Unityのシーンファイルの中身を見てみた (1)
Unity 4.2から今まで有料のPro版でしか使えなかった,マテリアル、プレハブ、シーンなどのテキストベースでのシリアルライズが無料版でも利用出来るようになりました。
(http://japan.unity3d.com/unity/whats-new/unity-4.2を参照)
無料版において,gitなどを用いたバージョン管理がしやすくなるかと思います。
今回は下記のページの内容を確認したり,シーン(.unityファイル)がどのようにシリアルライズされているかを確認してみました。(リンク先では,Pro専用機能とありますが(2013年7月31日時点),4.2ではしっかりと使えました。)
http://docs-jp.unity3d.com/Documentation/Manual/TextualSceneFormat.html
まず,シリアルライズ形式のYAML形式を非常に簡単に。
YAMLで配列は
- 1 - 2 - 3
という形式で表され,マップは,
a: 1 b: 2 c: 3
となります。
配列の配列は
- - a - b - - c - d - e
で,マップのマップは
U: a: 1 b: 2 V: c: 3 d: 4 e: 5
となるようです。
また,配列のマップは
U: - a - b V: - c - d - e
そして,マップの配列は次の用になります。
- a: 1 b: 2 - c: 3 d: 4 e: 5
フロー形式という記述方法もあるらしく
配列
[1, 2, 3]
マップ
{a: 1 , b: 2, c: 3}
配列の配列
- [a, b] - [c, d, e]
[[a, b], [c, d, e]]
マップのマップ
U: {a: 1, b: 2} V: {c: 3, d: 4, e: 5}
{U: {a: 1, b: 2}, V: {c: 3, d: 4, e: 5}}
配列のマップ
U: [a, b] V: [c, d, e]
{U: [a, b], V: [c, d, e]}
マップの配列
- {a: 1, b: 2} - {c: 3, d: 4, e: 5}
[{a: 1, b: 2}, {c: 3, d: 4, e: 5}]
だそうです。
また,---がYAMLドキュメントの区切りになっていて,これにより下記のように一つのテキストファイルに複数のYAMLドキュメントを含むことができるようです。
--- name: Taro age : 25 --- name: Jiro age : 22 --- name: Saburo age : 19
さて,やっと本題。
Unityのシーンファイル(.unityファイル)がどのようにYAMLで表されているかを見てみました。
先頭は以下の2行のようになっていました。
%YAML 1.1 %TAG !u! tag:unity3d.com,2011:
http://docs-jp.unity3d.com/Documentation/Manual/YAMLSceneExample.html
によるとシーンファイルはこの2行で始まらないといけないようです。
1行目は,YALMLディレクティブ,2行目は,タグディレクティブだそうです。
http://yaml.org/spec/1.2/spec.html#id2781553
http://yaml.org/spec/1.2/spec.html#id2782090
さて,シーン中のゲームオブジェクトそしてコンポーネントは一つのYAMLオブジェクトとして定義されるようです。
---の後に
!u!1 &6
だとか
!u!4 &8
等の文字列が含まれます。
この!u!のあとの最初の数字は下記のYAMLドキュメントのクラスを表し,そのあとの&のはシーンファイル中の一意のID番号だそうです。
下記は空のゲームオブジェクトをEmptyGameObjectという名前で,原点(0,0,0)に置いた際のシーンファイルの増分です。
--- !u!1 &1090478263 GameObject: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} serializedVersion: 4 m_Component: - 4: {fileID: 1090478264} m_Layer: 0 m_Name: EmptyGameObject m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 --- !u!4 &1090478264 Transform: m_ObjectHideFlags: 0 m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1090478263} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0}
GameObjectを表すYAMLドキュメントと,Transfrom表すYAMLドキュメントが確認できます。
それぞれのドキュメントはマップになっていてます。Transformを示すYAMLドキュメントでは,キーがTransformひとつ。そのバリューもマップになっていてTransformクラスのプロパティ名にm_をつけた物が並んでいます。
GameObjectも同じような感じです。
今回はこの辺で。
また次回があることを祈りつつ。
[参考リンク]
http://magazine.rubyist.net/?0009-YAML
http://yaml.org/spec/1.2/spec.html
http://yamllint.com/
http://d.hatena.ne.jp/tociyuki/20121130/1354278408