例えば以下のようにシリアライズしたフィールド名を変えると参照が外れてしまう
[SerializeField]
private GameObject _target;
↓
[SerializeField]
private GameObject _targetObject;
これは prefab の yaml 内にフィールド名が記述されていて、それを参照しているからである
※13行目
そのため、フィールド名を変えると新しいフィールド名を参照するため参照が見つからなくなる
--- !u!114 &191013873567322482 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 191013873567322485} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: b61040c4486284ad0944bb9fd0408467, type: 3} m_Name: m_EditorClassIdentifier: _target: {fileID: 1982794815423442, guid: ce467225a50fe4d6f831c74165c7cdfa, type: 3}
対応方法1
FormerlySerializedAs
を利用する
[FormerlySerializedAs("_target")] [SerializeField] private GameObject _targetObject;
これを利用すると FormerlySerializedAs
で記述したフィールド名を yaml から探し出してくれる
これにより以前のフィールド名で参照を保ち続けることができる
そして、対象のオブジェクトにDirty フラグが立つと yaml 自体も修正され
FormerlySerializedAs
を外しても問題なく動作するようになる
MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 191013873567322485} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: b61040c4486284ad0944bb9fd0408467, type: 3} m_Name: m_EditorClassIdentifier: _target2: {fileID: 191013873567322485} _intValue: 19
対策方法2
.prefab
の yaml を書き換える
先程の yaml であれば最後の _target
を _targetObject
に書き換えることで参照を保ち続けることができる
そのコンポーネントを使っている箇所が少なければなんとかなりそうだが、多い場合は結構手間になる
--- !u!114 &191013873567322482 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 191013873567322485} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: b61040c4486284ad0944bb9fd0408467, type: 3} m_Name: m_EditorClassIdentifier: _targetObject: {fileID: 1982794815423442, guid: ce467225a50fe4d6f831c74165c7cdfa, type: 3}