Unity YAML フォーマット¶
基本構造¶
Unity の .prefab、.mat、.asset、.unity などのテキスト形式アセットは独自拡張 YAML を使う。
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &123456789
MonoBehaviour:
m_ObjectHideFlags: 0
--- !u!{typeID} &{fileID} でドキュメントを区切る。
typeIDは Unity 内部のオブジェクト型 ID(114 は MonoBehaviour)fileIDはファイル内のローカル ID
アセット GUID¶
各アセットファイルに対応する .meta ファイルが存在し、 guid フィールドに 32 桁の 16 進数が記録される。
# SomeTexture.png.meta
guid: 9a8f2e4b1c3d5e6f7a8b9c0d1e2f3a4b
.prefab 等から他アセットを参照する際は以下の形式を使う。
- {fileID: 2100000, guid: 9a8f2e4b1c3d5e6f7a8b9c0d1e2f3a4b, type: 2}
fileID: 2100000はマテリアルを指す Unity 内部の固定値type: 2はアセット参照を意味する
.meta ファイルから GUID を取得する¶
def get_guid(meta_path: str) -> str | None:
with open(meta_path, encoding="utf-8") as f:
for line in f:
if line.startswith("guid:"):
return line.split(":")[1].strip()
return None
ruamel.yaml で Unity YAML をパースする¶
PyYAML などの一般的な YAML パーサーは !u! タグで失敗する。ruamel.yaml を使う場合は、パース前にドキュメント開始行を正規化する。
import re
from ruamel.yaml import YAML
def normalize_unity_yaml(text: str) -> str:
# `--- !u!114 &123` を `---` に置き換える(行数は変えない)
return re.sub(r"^---\s+!u!\d+\s+&\d+\s*$", "---", text, flags=re.MULTILINE)
yaml = YAML(typ="rt")
yaml.allow_duplicate_keys = True # Unity YAML は重複キーを持つ場合がある
yaml.preserve_quotes = True
docs = list(yaml.load_all(normalize_unity_yaml(text)))
allow_duplicate_keys = True を設定しないと、Unity の YAML 出力に含まれる重複キーでパースが失敗する。
typ="rt" はラウンドトリップモードで、各フィールドの行番号情報(lc 属性)を保持する。特定フィールドだけを書き換えたい場合に使う。
GUID を参照するファイル形式¶
以下の拡張子のファイルが GUID による参照を含む。
| 拡張子 | 用途 |
|---|---|
.prefab |
プレハブ |
.unity |
シーン |
.mat |
マテリアル |
.asset |
ScriptableObject 等 |
.anim |
アニメーションクリップ |
.controller |
Animator Controller |
.overridecontroller |
Animator Override Controller |
.shadergraph |
Shader Graph |
.timeline |
Timeline |
.mixer |
Audio Mixer |
.playable |
Playable |