【Unity】PrefabやSceneのYAMLを開いて直接編集してみる

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です。

docs.unity3d.com

また、&の後の数字はこのPrefab内でこのGameObjectやコンポーネントを表す任意のIDです。

フィールドを書き換える

ある程度フォーマットが理解できたところで色々変更を加えてみます。
前節のPrefabのTransformのScaleを書き換えます。

書き換え前はこんな感じです。

  m_LocalScale: {x: 1, y: 1, z: 1}

PrefabのインスタンスのInspectorを見ても(1, 1, 1)になっています。

f:id:halya_11:20190320125708p:plain

これを次のように書き前ます。

  m_LocalScale: {x: 2, y: 2, z: 2}

Inspectorを見るとPrefabが更新されたことが確認できました。

f:id:halya_11:20190320125732p:plain

コンポーネントをアタッチする

次にこの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}

これでコンポーネントがアタッチできました。

f:id:halya_11:20190320131043p:plain

コンポーネントをデタッチする

コンポーネントのデタッチは簡単です。
まずコンポーネント部分の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}

これで前節でアタッチしたコンポーネントがデタッチできました。

f:id:halya_11:20190320131237p:plain

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と変わりません。

関連

light11.hatenadiary.com

参考

docs.unity3d.com

docs.unity3d.com

docs.unity3d.com