[Unity] 如何重新命名 Serialized Fields,不遺失原始資料?


Overview

命名曾經被程式設計師們列為,寫程式時最困難的事
當有用到的 Serialized Fields 需要重新命名時
GameObject 或 ScriptableObject 中的資料會遺失

範例情境
1. 原始設計:private member with public getter
2. 需求變更:private member with public getter & setter
3. 重構問題:將 private member 改為 public member,並移除多餘的 public getter & setter

解決方案
1. 直接使用文字編輯器打開 Prefab 或 ScriptableObject
2. 使用 [FormerlySerializedAs] attribute


1. 原始設計

一開始我們使用 private member with SerializeField 來儲存資料
外部需要時頂多開放 public getter 或 function 來取得
比方說如下所示的 TestModel

RenameSerializeField - 1

RenameSerializeField - 2

RenameSerializeField - 3

2. 需求變更

但這時有個需求,我們要製作編輯器以達到快速編輯和優化瀏覽
此時除了 getter 之外,public setter 也將是必要的

RenameSerializeField - 4

RenameSerializeField - 5

3. 重構問題

這時很明顯可以看出我們看將程式進行重構
將 private member 改為 public member,並移除多餘的 public getter & setter

RenameSerializeField - 6

Visual Studio 的 Rename 功能很方便
但是重新命名完後,資料都不見了

RenameSerializeField - 7

RenameSerializeField - 8

解決方案 A

重新命名完程式後,不要回到 Unity
直接使用打開 Prefab 或 ScriptableObject
搜尋原始的變數名稱,取代為新名稱

RenameSerializeField - 9

解決方案 B

使用 Unity 5 之後的新功能:[FormerlySerializedAs] attribute
只要掛上這個 Attribute,並設定原始名稱後
就可以回到 Unity 進行 Compile,且 Compile 結束後即可將 Attribute 移除

RenameSerializeField - 10

這兩個方法,查看變更最後結果相同
雖然其實都還是有點麻煩而且有時候會忘記
不過至少比你重新拉 Reference 或重設所有資料快多啦!

RenameSerializeField - 11

References

https://blogs.unity3d.com/2015/02/03/renaming-serialized-fields/
https://github.com/JetBrains/resharper-unity/issues/54




歡迎您留言與分享!(Welcome for comments or sharing!)

Related Post:

Tagged on: