うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】シリアライズされたフィールド名を変更する

例えば以下のようにシリアライズしたフィールド名を変えると参照が外れてしまう

f:id:hacchi_man:20210129002557p:plain:w250

   [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

.prefabyaml を書き換える

先程の 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}