いろいろガンガンいこうぜ。体も大事に

普段はJavaでAndroidアプリ開発しているプログラマーのブログです。

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