命名曾經被程式設計師們列為,寫程式時最困難的事
當有用到的 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. 原始設計
一開始我們使用 private member with SerializeField 來儲存資料
外部需要時頂多開放 public getter 或 function 來取得
比方說如下所示的 TestModel
2. 需求變更
但這時有個需求,我們要製作編輯器以達到快速編輯和優化瀏覽
此時除了 getter 之外,public setter 也將是必要的
3. 重構問題
這時很明顯可以看出我們看將程式進行重構
將 private member 改為 public member,並移除多餘的 public getter & setter
Visual Studio 的 Rename 功能很方便
但是重新命名完後,資料都不見了
解決方案 A
重新命名完程式後,不要回到 Unity
直接使用打開 Prefab 或 ScriptableObject
搜尋原始的變數名稱,取代為新名稱
解決方案 B
使用 Unity 5 之後的新功能:[FormerlySerializedAs] attribute
只要掛上這個 Attribute,並設定原始名稱後
就可以回到 Unity 進行 Compile,且 Compile 結束後即可將 Attribute 移除
這兩個方法,查看變更最後結果相同
雖然其實都還是有點麻煩而且有時候會忘記
不過至少比你重新拉 Reference 或重設所有資料快多啦!
References
https://blogs.unity3d.com/2015/02/03/renaming-serialized-fields/
https://github.com/JetBrains/resharper-unity/issues/54