PONOS Advent Calendar 2025 9日目の記事です。
はじめに
Unityには様々なアセットが存在します。
画像ファイルであるjpg・pngの様な一般的な物も用いますが、独自形式であるanim・prefab・unityなども使われています。
また一つのシーンには大量にオブジェクトが存在し、オブジェクトのテンプレートであるプレハブも保存されています。
それらが相互に参照し合いアプリが成り立っている訳ですが……。
どの様に参照を保っているのでしょうか?
UnityYAMLについて
画像ファイルなどをインポートすると必ずmetaファイルが生成されます。
他のファイルも大体そうですが中身はYAMLファイルとなっています。
なおこれはUnityYAMLと呼ばれる独自のライブラリです。
※ Asset Serializationの設定によってシリアライズ方法が変わります。
例として一つpngファイルを入れてみました。そのmetaファイルを覗いてみます。

fileFormatVersion: 2
guid: 170c01bc5484b431bab2ea1e3099bf57
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
...
画像ファイルのInspectorから各項目を変えるとこのmetaファイルに反映されます。
アセットのImport Settingsはこの中に入っているという事です。
少し見慣れないのが上部にあるguidという表記。
こちらには「guid: 170c01bc5484b431bab2ea1e3099bf57」と記載されています。
これは他のアセットから参照される際に使われるIDとなります。
Scene/Prefabの場合
SceneやPrefabで配置されるオブジェクトについて。
今回は例としてPrefabファイルを用います。
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &9221625932692647199
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1214693456788996309}
- component: {fileID: 413595454833780411}
m_Layer: 0
m_Name: SamplePrefab
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1214693456788996309
Transform:
m_ObjectHideFlags: 0
...
概ね先ほどのmetaファイルと似た感じですが、guidの記載はありません。
代わりに!u!1 &9221625932692647199など、!u!{CLASS ID} {File ID}の形式で記載されている箇所があります。
これはPrefab内の各オブジェクトに対して割り振られているIDです。
この内のCLASS IDはクラスの種類に応じて決められています。
この内のFile IDの方はローカルからの参照に使われます。(後述します)
GUIDの場合
PrefabにSpriteRendererを追加しました。
最初にインポートしたpngファイルを指定して参照してみます。
...
--- !u!212 &709893915352227899
SpriteRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4869250137261929876}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_Sprite: {fileID: 21300000, guid: 170c01bc5484b431bab2ea1e3099bf5a, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 0.16, y: 0.16}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_MaskInteraction: 0
m_SpriteSortPoint: 0
色んな記載がありますが「m_Sprite」の項目を確認します。
m_Sprite: {fileID: 21300000, guid: 170c01bc5484b431bab2ea1e3099bf57, type: 3}
こちらにも最初の画像ファイルと同じGUIDである「170c01bc5484b431bab2ea1e3099bf57」が記載されていました。
つまり画像ファイルへの参照はGUIDによって行っているという事です。
このIDがあるので画像ファイルの階層や命名を変えても参照が切れません。
逆に言うと、このGUIDが変わってしまうと同じ画像ファイルでも参照が切れてしまう事になります。
metaのGUIDをテキストエディタで書き換えればPrefabの参照が切れますが、Prefab側も書き換えてやればまた参照が元に戻ります。
File IDの場合
GUIDはProjectフォルダ内のファイルに対する参照でした。
では同じPrefab内の別のオブジェクトを参照している場合はどうなるのでしょうか?
別のオブジェクトを作成し、適当なスクリプトをアタッチして先ほどのSprite Rendererへの参照を持たせてみます。
...
--- !u!114 &4912621128435083478
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2064406553332643044}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c93354202176f4f97ba69dec3ea90da6, type: 3}
m_Name:
m_EditorClassIdentifier:
tileSpriteRenderer: {fileID: 709893915352227899}
するとtileSpriteRenderer: {fileID: 709893915352227899}という記載が現れました。
GUIDの項目で記載した箇所には--- !u!212 &709893915352227899と記載されていました。
つまりこちらはFileIDによってSpriteRendererへの参照を持っている事が分かります。
なお参照先をGameObjectとした場合とSpriteRendererとした場合で、同じゲームオブジェクトを対象とした場合でも異なるFileIDが記載される事を確認出来ます。これはコンポーネント単位でFileIDが割り振られている為です。
ちなみにこの参照先をローカルのオブジェクトでは無く、Projectフォルダ内にある別のプレハブにするとどうなるのでしょうか?
...
--- !u!114 &4912621128435083478
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2064406553332643044}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c93354202176f4f97ba69dec3ea90da6, type: 3}
m_Name:
m_EditorClassIdentifier:
tileSpriteRenderer: {fileID: 8102565873751623480, guid: 8aa571684aeb748bc8a797db8f2b7b66,
type: 3}
こうするとtileSpriteRenderer: {fileID: 8102565873751623480, guid: 8aa571684aeb748bc8a797db8f2b7b66, type: 3}という記載に変わりました。
最初のGUIDによる参照になったという事ですね。
またtype:3という記載が増えましたが、これは読み込み先を表しています。
2の場合はAssetsフォルダから、3の場合はLibraryフォルダから読み込まれます。(アセットの種類によって異なります)
Animationの場合
Animationで使用するanimファイルの場合。
Animationで使用しているオブジェクトの階層を変えたり、名称を変えると「Missing!」と表示され再生されなくなってしまいます。
これはオブジェクトのパスをそのまま指定しているが故に起こります。
animファイルを開くと、オブジェクトのパスがそのまま記載されています。
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!74 &7400000
AnimationClip:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Idle
serializedVersion: 7
m_Legacy: 0
m_Compressed: 0
m_UseHighQualityCurve: 1
m_RotationCurves: []
m_CompressedRotationCurves: []
m_EulerCurves: []
m_PositionCurves:
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: {x: 2.84, y: 0, z: 0}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
- serializedVersion: 3
time: 0.16666667
value: {x: 2.5261, y: 0, z: 0}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
path: GameObject/SpriteRenderer(Tile)
...
各キーにpath: GameObject/SpriteRenderer(Tile)とパスがそのまま記載されています。
なのでパスを正しく書き換えてやれば正しく再生される様になります。
またAnimationウィンドウ上でパスをそのまま記載して修正する事も出来ます。
こちらはanimファイルを複数のオブジェクトで使い回す事ができる為、一つのIDに固定化出来ない事からこの様な形となっている…のかもしれないです。多分。
少し手間ですがAnimationを導入する際はパスが外れない様に注意しましょう。
まとめ
ローカルのオブジェクトに対する参照はFile IDで持っており、ファイル外のオブジェクトに対する参照はGUIDで持っている事が分かりました。
GUIDの値はアセットに対応するmetaファイルによって定められています。特にチーム内で作業する時にこのmetaファイルをコミットしていないと、他の人の環境で別のGUIDが割り振られてしまう可能性があります。
こうなるとアセットが認識出来ず参照切れを起こしてしまう為、共有漏れがない様に注意すべきです。
次回は@mon3612さんの記事です。



