読者です 読者をやめる 読者になる 読者になる

エフアンダーバー

個人でのゲーム開発

uGUIによる謎のdiff

前回の記事で書いた「しろたま」のアップデート中に謎のdiffがあったのでメモ。

fspace.hatenablog.com

謎のdiff

アップデートのためにシーンファイル(.unity)を弄っていたところおかしなdiffが出てきました。

f:id:fspace:20150808200255p:plain
diff その1

f:id:fspace:20150808200302p:plain
diff その2

変更したうえで元に戻してる・・・!?
もちろん自分で変更したわけではなく、uGUIによる自動レイアウトの結果です。
さらにレイアウトを変えたわけでもありません。

無意味なdiffを大量につくられるのは厄介なので少し調べてみました。

発生条件

まずはどういう場所で発生しているのかについて。
同じようなdiffが出ている場所を調べてみると、 どうやら以下の条件で発生している模様。

  • Prefabのインスタンスである
  • 親のLayoutGroup(HorizontalLayout等)によってレイアウトされている

実験

というわけでHorizontalLayoutの中にPrefabインスタンスを突っ込んで シーンファイルの状態を確認してみます。

Prefab:
  m_ObjectHideFlags: 0
  serializedVersion: 2
  m_Modification:
    m_TransformParent: {fileID: 1915973137}
    m_Modifications:
    - target: {fileID: 22459688, guid: 5bcaac5fee929154e9d487cbefe75a9d, type: 2}
      propertyPath: m_AnchorMin.x
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 22459688, guid: 5bcaac5fee929154e9d487cbefe75a9d, type: 2}
      propertyPath: m_AnchorMin.y
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 22459688, guid: 5bcaac5fee929154e9d487cbefe75a9d, type: 2}
      propertyPath: m_AnchorMax.x
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 22459688, guid: 5bcaac5fee929154e9d487cbefe75a9d, type: 2}
      propertyPath: m_AnchorMax.y
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 22459688, guid: 5bcaac5fee929154e9d487cbefe75a9d, type: 2}
      propertyPath: m_SizeDelta.x
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 22459688, guid: 5bcaac5fee929154e9d487cbefe75a9d, type: 2}
      propertyPath: m_SizeDelta.y
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 22459688, guid: 5bcaac5fee929154e9d487cbefe75a9d, type: 2}
      propertyPath: m_AnchoredPosition.x
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 22459688, guid: 5bcaac5fee929154e9d487cbefe75a9d, type: 2}
      propertyPath: m_AnchoredPosition.y
      value: 0
      objectReference: {fileID: 0}
    m_RemovedComponents: []
  m_ParentPrefab: {fileID: 100100000, guid: 5bcaac5fee929154e9d487cbefe75a9d, type: 2}
  m_IsPrefabParent: 0

どうやらこれが正常状態みたいです。

LayoutGroupによって制御されるプロパティは、 内部にてDrivenRectTransformTrackerというものに登録され、 シーンファイルには記録されないようになっています(エディタ上で編集不可になるのもこれのおかげ)。 よってそれらの値が0として記録されるのは正しい動作と考えられます (本当ならm_Modificationsにも記録されないで欲しいのですが、 一度変更されたプロパティは記録され続けるようです・・・)。

値記録の謎

じゃあ値が記録されてしまうのは何故なのかという話。

結果からいうとよくわかりませんでした・・・。
ただ一点、LayoutGroup下のPrefabインスタンスを複製したときに値の記録が行われるという現象だけは確認できました。 もちろんそんな限定的な操作に対してのみ起こる現象ではないとは思いますが、 特定の操作後にDrivenRectTransformTrackerによる保護が一時的に効かなくなる状態があるようです。

結論

結論というかなんというか、まあバグっぽいのでそのうち修正されるでしょう。
再レイアウトすると0に戻るようなのでこまめに再レイアウトするとよさそうです。



使用したUnityのバージョン: 5.1.2f1