UnityのSceneやPrefabやScriptableObjectはYAMLで書かれています。
この記事ではこれらのYAMLの中身を見て簡単な編集もしてみます。
Unity2018.3.6
PrefabのYAMLを見る
まず空のGameObjectをPrefab化したものをテキストエディタで開いてみます。
%YAML 1.1 %TAG !u! tag:unity3d.com,2011: --- !u!1 &4903041867623032639 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - component: {fileID: 4433608277066839807} m_Layer: 0 m_Name: GameObject (1) m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 --- !u!4 &4433608277066839807 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4903041867623032639} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: -0.21204466, y: 0.30996525, z: -0.86567664} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
最初の二行はこのように書く決まりです。
%YAML 1.1 %TAG !u! tag:unity3d.com,2011:
Prefabを構成する各クラス(GameObjectやコンポーネント)の情報は---
で区切られます。
--- !u!1 &4903041867623032639 GameObject:
この!u!の後の数字はクラスのIDです。その次の行の文字列はクラス名です。
これらは下記で定義されています。ちなみに自作クラスはすべて114 : MonoBehaviourです。
また、&の後の数字はこのPrefab内でこのGameObjectやコンポーネントを表す任意のIDです。
フィールドを書き換える
ある程度フォーマットが理解できたところで色々変更を加えてみます。
前節のPrefabのTransformのScaleを書き換えます。
書き換え前はこんな感じです。
m_LocalScale: {x: 1, y: 1, z: 1}
PrefabのインスタンスのInspectorを見ても(1, 1, 1)になっています。
これを次のように書き前ます。
m_LocalScale: {x: 2, y: 2, z: 2}
Inspectorを見るとPrefabが更新されたことが確認できました。
コンポーネントをアタッチする
次にこのPrefabにコンポーネントをアタッチしてみます。
まず適当なコンポーネントを作成します。
using UnityEngine; public class Example : MonoBehaviour { [SerializeField] private int _example; }
これをPrefabにアタッチすると、YAMLは以下のように変わります。
%YAML 1.1 %TAG !u! tag:unity3d.com,2011: --- !u!1 &4903041867623032639 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - component: {fileID: 4433608277066839807} - component: {fileID: 5697825174949230319} m_Layer: 0 m_Name: GameObject m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 --- !u!4 &4433608277066839807 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4903041867623032639} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: -0.21204466, y: 0.30996525, z: -0.86567664} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &5697825174949230319 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4903041867623032639} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 041e1384a28babc438abff5eaa04bfe5, type: 3} m_Name: m_EditorClassIdentifier: _example: 0
変更された点としては、まず最下部にコンポーネントが追加されています。
--- !u!114 &5697825174949230319 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4903041867623032639} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 041e1384a28babc438abff5eaa04bfe5, type: 3} m_Name: m_EditorClassIdentifier: _example: 0
また、このコンポーネントのIDがGameObjectのm_Componentの要素として追加されています。
- component: {fileID: 5697825174949230319}
つまりこの処理をすればコンポーネントをアタッチできそうです。
というわけで試しに同じコンポーネントをアタッチしてみます。
まず、先ほど追加されたコンポーネントの部分を最下部にコピペします。IDだけ変更します。
--- !u!114 &5697825174949230320 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4903041867623032639} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 041e1384a28babc438abff5eaa04bfe5, type: 3} m_Name: m_EditorClassIdentifier: _example: 0
そしてGameObjectのm_Componentにこれを追加します。
- component: {fileID: 5697825174949230320}
これでコンポーネントがアタッチできました。
コンポーネントをデタッチする
コンポーネントのデタッチは簡単です。
まずコンポーネント部分のYAMLを削除します。
--- !u!114 &5697825174949230320 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4903041867623032639} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 041e1384a28babc438abff5eaa04bfe5, type: 3} m_Name: m_EditorClassIdentifier: _example: 0
そしてGameObjectのm_Componentから要素を削除するだけです。
- component: {fileID: 5697825174949230320}
これで前節でアタッチしたコンポーネントがデタッチできました。
SceneのYAML
ついでにPrefab以外のYAMLも見てみます。
以下はSceneのYAMLです。
%YAML 1.1 %TAG !u! tag:unity3d.com,2011: --- !u!29 &1 OcclusionCullingSettings: m_ObjectHideFlags: 0 serializedVersion: 2 m_OcclusionBakeSettings: smallestOccluder: 5 smallestHole: 0.25 backfaceThreshold: 100 m_SceneGUID: 00000000000000000000000000000000 m_OcclusionCullingData: {fileID: 0} --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 serializedVersion: 9 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 m_FogDensity: 0.01 m_LinearFogStart: 0 m_LinearFogEnd: 300 m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} m_AmbientIntensity: 1 m_AmbientMode: 0 m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} m_HaloStrength: 0.5 m_FlareStrength: 1 m_FlareFadeSpeed: 3 m_HaloTexture: {fileID: 0} m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} m_DefaultReflectionMode: 0 m_DefaultReflectionResolution: 128 m_ReflectionBounces: 1 m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} m_IndirectSpecularColor: {r: 0.37311953, g: 0.38074014, b: 0.3587274, a: 1} m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 serializedVersion: 11 m_GIWorkflowMode: 0 m_GISettings: serializedVersion: 2 m_BounceScale: 1 m_IndirectOutputScale: 1 m_AlbedoBoost: 1 m_EnvironmentLightingMode: 0 m_EnableBakedLightmaps: 1 m_EnableRealtimeLightmaps: 1 m_LightmapEditorSettings: serializedVersion: 10 m_Resolution: 2 m_BakeResolution: 40 m_AtlasSize: 1024 m_AO: 0 m_AOMaxDistance: 1 m_CompAOExponent: 1 m_CompAOExponentDirect: 0 m_Padding: 2 m_LightmapParameters: {fileID: 0} m_LightmapsBakeMode: 1 m_TextureCompression: 1 m_FinalGather: 0 m_FinalGatherFiltering: 1 m_FinalGatherRayCount: 256 m_ReflectionCompression: 2 m_MixedBakeMode: 2 m_BakeBackend: 1 m_PVRSampling: 1 m_PVRDirectSampleCount: 32 m_PVRSampleCount: 500 m_PVRBounces: 2 m_PVRFilterTypeDirect: 0 m_PVRFilterTypeIndirect: 0 m_PVRFilterTypeAO: 0 m_PVRFilteringMode: 1 m_PVRCulling: 1 m_PVRFilteringGaussRadiusDirect: 1 m_PVRFilteringGaussRadiusIndirect: 5 m_PVRFilteringGaussRadiusAO: 2 m_PVRFilteringAtrousPositionSigmaDirect: 0.5 m_PVRFilteringAtrousPositionSigmaIndirect: 2 m_PVRFilteringAtrousPositionSigmaAO: 1 m_ShowResolutionOverlay: 1 m_LightingDataAsset: {fileID: 0} m_UseShadowmask: 1 --- !u!196 &4 NavMeshSettings: serializedVersion: 2 m_ObjectHideFlags: 0 m_BuildSettings: serializedVersion: 2 agentTypeID: 0 agentRadius: 0.5 agentHeight: 2 agentSlope: 45 agentClimb: 0.4 ledgeDropHeight: 0 maxJumpAcrossDistance: 0 minRegionArea: 2 manualCellSize: 0 cellSize: 0.16666667 manualTileSize: 0 tileSize: 256 accuratePlacement: 0 debug: m_Flags: 0 m_NavMeshData: {fileID: 0} --- !u!1 &1595060117 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - component: {fileID: 1595060118} m_Layer: 0 m_Name: GameObject m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 --- !u!4 &1595060118 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1595060117} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: -0.21204466, y: 0.30996525, z: -0.86567664} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &4079073836631085844 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: m_TransformParent: {fileID: 0} m_Modifications: - target: {fileID: 4903041867623032639, guid: 2d37ada14074af148bcbd1bc6631f685, type: 3} propertyPath: m_Name value: GameObject objectReference: {fileID: 0} - target: {fileID: 4433608277066839807, guid: 2d37ada14074af148bcbd1bc6631f685, type: 3} propertyPath: m_LocalPosition.x value: -0.21204466 objectReference: {fileID: 0} - target: {fileID: 4433608277066839807, guid: 2d37ada14074af148bcbd1bc6631f685, type: 3} propertyPath: m_LocalPosition.y value: 0.30996525 objectReference: {fileID: 0} - target: {fileID: 4433608277066839807, guid: 2d37ada14074af148bcbd1bc6631f685, type: 3} propertyPath: m_LocalPosition.z value: -0.86567664 objectReference: {fileID: 0} - target: {fileID: 4433608277066839807, guid: 2d37ada14074af148bcbd1bc6631f685, type: 3} propertyPath: m_LocalRotation.x value: 0 objectReference: {fileID: 0} - target: {fileID: 4433608277066839807, guid: 2d37ada14074af148bcbd1bc6631f685, type: 3} propertyPath: m_LocalRotation.y value: 0 objectReference: {fileID: 0} - target: {fileID: 4433608277066839807, guid: 2d37ada14074af148bcbd1bc6631f685, type: 3} propertyPath: m_LocalRotation.z value: 0 objectReference: {fileID: 0} - target: {fileID: 4433608277066839807, guid: 2d37ada14074af148bcbd1bc6631f685, type: 3} propertyPath: m_LocalRotation.w value: 1 objectReference: {fileID: 0} - target: {fileID: 4433608277066839807, guid: 2d37ada14074af148bcbd1bc6631f685, type: 3} propertyPath: m_RootOrder value: 1 objectReference: {fileID: 0} - target: {fileID: 4433608277066839807, guid: 2d37ada14074af148bcbd1bc6631f685, type: 3} propertyPath: m_LocalEulerAnglesHint.x value: 0 objectReference: {fileID: 0} - target: {fileID: 4433608277066839807, guid: 2d37ada14074af148bcbd1bc6631f685, type: 3} propertyPath: m_LocalEulerAnglesHint.y value: 0 objectReference: {fileID: 0} - target: {fileID: 4433608277066839807, guid: 2d37ada14074af148bcbd1bc6631f685, type: 3} propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 2d37ada14074af148bcbd1bc6631f685, type: 3}
設定項目が多いので複雑そうに見えますが、フォーマットはPrefabと変わりません。
ScriptableObjectのYAML
次にScriptableObjectのYAMLを見てみます。
%YAML 1.1 %TAG !u! tag:unity3d.com,2011: --- !u!114 &11400000 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 37c88262b3fdee44da78122d1afd7476, type: 3} m_Name: ScriptableObject m_EditorClassIdentifier: _example: 0
こちらはGameObjectじゃない分Prefabよりもシンプルです。
フォーマットはPrefabと変わりません。