Unity2018.3から2018.2へのダウングレードで壊れたPrefabをなんとかする方法
こんにちは、プログラマーのnotargsです。
概要
さて、Unity開発をやっていると、「Unity2018.3に上げたは良いけど、やっぱりUnity2018.2にダウングレードしたい!!」というニーズが発生すること、あると思います。
Scriptのダウングレードはまあちまちまやれば良いのですが、Prefabは悲惨なことになります。
???なにこれ???😩😩😩
大きく下の3つの問題が発生してしまっています。
- ドラッグ&ドロップでシーンに配置できない
- インスペクタがなんかおかしい
- アセットの小要素もなんかおかしい
ということで、今回はこの「悲惨なPrefab」をなんとかする方法について調べてみました!
yamlを調べる
prefabをVSCodeなどのテキストエディタで開いてみると、こんな感じのyamlが書かれています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
%YAML 1.1 %TAG !u! tag:unity3d.com,2011: --- !u!1 &1869695702864676 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - component: {fileID: 4856651175927524} - component: {fileID: 33021930740467788} - component: {fileID: 23339876318642616} - component: {fileID: 65706782153609928} m_Layer: 0 m_Name: Cube m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 --- !u!4 &4856651175927524 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1869695702864676} 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} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!33 &33021930740467788 MeshFilter: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1869695702864676} m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!23 &23339876318642616 MeshRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1869695702864676} m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 m_DynamicOccludee: 1 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 m_RenderingLayerMask: 4294967295 m_RendererPriority: 0 m_Materials: - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 m_StaticBatchRoot: {fileID: 0} m_ProbeAnchor: {fileID: 0} m_LightProbeVolumeOverride: {fileID: 0} m_ScaleInLightmap: 1 m_PreserveUVs: 0 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 m_StitchLightmapSeams: 0 m_SelectedEditorRenderState: 3 m_MinimumChartSize: 4 m_AutoUVMaxDistance: 0.5 m_AutoUVMaxAngle: 89 m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 --- !u!65 &65706782153609928 BoxCollider: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1869695702864676} m_Material: {fileID: 0} m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 m_Size: {x: 1, y: 1, z: 1} m_Center: {x: 0, y: 0, z: 0} |
こちらをUnity2018.3のものとUnity2018.2のもので見比べてみて、違う部分を手作業で書き換えてあげれば直るはずです。
早速直していきます。
Prefab区を追記する
まず、Unity2018.3のprefabではUnity2018.2にあったPrefab区がありません。
これが存在しない場合、Unity2018.2ではPrefabとして認識されず、Sceneにドラッグ&ドロップしても何も起こらない、という現象が発生してしまいます。
Unity2018.2のときのログが残っていればそこからコピーしてくるのが安心ですが、基本的にidなどはこれで固定のようです。
1 2 3 4 5 6 7 8 9 10 11 |
--- !u!1001 &100100000 Prefab: m_ObjectHideFlags: 1 serializedVersion: 2 m_Modification: m_TransformParent: {fileID: 0} m_Modifications: [] m_RemovedComponents: [] m_SourcePrefab: {fileID: 0} m_RootGameObject: {fileID: 1217296277330720} # ここを書き換える m_IsPrefabAsset: 1 |
1 2 |
--- !u!1 &1217296277330720 GameObject: |
からIDをコピってきましょう。
m_PrefabInstance、m_PrefabAssetを消してm_PrefabInternalに戻す
続いて、各種Componentが持っている
1 2 |
m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} |
を消して、
1 |
m_PrefabInternal: {fileID: 100100000} |
に書き換えてあげます。
fileIDの100100000は、prefabに対する参照で、全prefabで共通のようです。
ここまでの作業で、ようやくドラッグ&ドロップでシーンに配置できるようになりました!
まだインスペクタとアセットの表記はおかしいので、引き続き修正していきます。
各ComponentのHideFlagsを書き換える
続いて、HideFlagsを書き換えてあげます。
HideFlagsはこんな感じで定義されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
--- !u!4 &4856651175927524 Transform: m_ObjectHideFlags: 0 #### ここ #### m_CorrespondingSourceObject: {fileID: 0} m_PrefabInternal: {fileID: 100100000} m_GameObject: {fileID: 1869695702864676} 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} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} |
このHideFlagsがUnity2018.2からUnity2018.3への移行時に1→0になってしまうので、ちまちまと1に戻してあげましょう。
1 |
m_ObjectHideFlags: 0 |
↑を↓のように書き換えていきます。
1 |
m_ObjectHideFlags: 1 |
「GameObject:」のセクションはHideFlags: 0のままで大丈夫なので、一緒にいじってしまわないように注意してください。
できあがり
ここまでの作業で、ようやくUnity2018.2でもPrefabが正しく動くようになりました!
おつかれさまです!!