【Unity】【C#】インスペクタの値を保持したまま変数をリネームする 
2019/08/17 Sat [edit]
最近は色々なオープンソースを利用しているのだが、時折アップデートしたらプロジェクトが破壊されることもある。その1つがインスペクタの参照だろうか?
残念ながら、インスペクタに設定されていたフィールド名を変えると、参照が外れることはよくあることだ。これが大量にあったら・・・まぁ、まともに動かなくなることは想像できるだろう(笑)。
これは FormerlySerializedAs というものを使えば、回避できるのだが、微妙に凡例が長かったり、必要なものが欠けてたりと、ちょっとわかりずらいと思ったので、もっと簡単な例をメモ代わりに書いておこうと思った。
・FormerlySerializedAsAttribute(公式マニュアル)
(※) Unity 2018.4.6f1 / Windows10(x64) で確認
■簡単な手順
例として、ボタンの参照しているフィールドを
↓
[SerializeField] private Button _hogeButton;
のように変更したいとする。インスペクタの表示名は変わらないが(hogeButton, _hogeButton, m_hogeButton などはコード内では別物だが、インスペクタでの表示は同じになる)、普通にリネームすると、これまで設定していたボタンへの参照が外れる。これをそのまま保持してリネームしたいという感じだ。
1.「using UnityEngine.Serialization;」をファイルの先頭に追加する。
2.[FormerlySerializedAs] の属性を加え、現在のフィールド名(変更前の名前)を入れる。
using UnityEngine.Serialization;
public class Example : MonoBehaviour
{
[FormerlySerializedAs("hogeButton")]
[SerializeField] private Button hogeButton;
}
3.フィールド名をリネーム(リファクタリング)して、一旦、シーンを保存する。また、プレファブ化してるものは個々に保存[Override]しておかないと参照が外れることがある(※要エディタでプレイ前に保存)。
using UnityEngine.Serialization;
public class Example : MonoBehaviour
{
[FormerlySerializedAs("hogeButton")]
[SerializeField] private Button _hogeButton;
}
4.インスペクタで値が保持されているのを確認できたら、FormerlySerializedAs 属性や using は削除しても良い(※複数から参照しているときは注意)。
using UnityEngine.Serialization;
public class Example : MonoBehaviour
{
[SerializeField] private Button _hogeButton;
}
まぁ、それでも大量にあったら大変だけどね。できればリリース後は、public なものや過去のリソースに影響を与える変更は、極力控えて貰いたいなぁ・・・(バグとかクリティカルなものならともかく・・・ただの命名規則の変更で無駄に時間とられるのは勘弁・・・)。|||orz
(参考)
・FormerlySerializedAsAttribute(公式マニュアル)
・PrefabやSceneのSerializeされた変数の値を保持したままリネームする
・FormerlySerializedAs(テラシュールブログ)
(関連記事)
【Unity】【C#】インスペクタで入力不可(Disable)な属性を作る
【Unity】【C#】インスペクタの配列やリストを並べ替え可能にする
【Unity】【C#】インスペクタの UnityEvent を並べ替え可能にする
【Unity】【C#】インスペクタの表示項目を動的に変更する
【Unity】【C#】インスペクタでの UnityEvent のコールバック登録の有無を調べる
【Unity】【C#】UnityEvent, Action, delegate, interface でのコールバック実装方法とインスペクタでの登録
【C#】【Unity】enum 型と string, int 型の相互変換など
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/332-a805ab21
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |