MRが楽しい

MRやVRについて学習したことを書き残す

UnityでFormerlySerializedAs属性を使ってSerializeFieldの値を引き継いで変数名を変更する

本日は Unity の小ネタ枠です。
UnityでFormerlySerializedAs属性を使ってSerializeFieldの値を引き継いで変数名を変更する方法を記事にします。

FormerlySerializedAs

FormerlySerializedAs 属性を使用すると、Inspector ビューで設定した値を引き継いでフィールドの名前を変更できます。
docs.unity3d.com

サンプルスクリプト

以下のサンプルスクリプトを使って実際に動作を確認してみます。
・Card.cs

using UnityEngine;

public class Card : MonoBehaviour
{
    [SerializeField]
    private string _name;
}

スクリプトを適当なオブジェクトに設定して、Inspector ビューから変数の値を設定します。

次にスクリプトの変数名を変更します。
このとき、同時に FormerlySerializedAs 属性を設定し、第一引数に引き継ぎたい過去の変数名を指定します。
・Card.cs

using UnityEngine;
using UnityEngine.Serialization; // FormerlySerializedAs参照のため必要

public class Card : MonoBehaviour
{
    [FormerlySerializedAs("_name")] [SerializeField]
    private string _id;
}

この状態で再び UnityEditor を開くと、Inspector ビューの値が破棄されず、新しい変数名の箇所に引き継がれています。

因みに、一度 UnityEditor を開いてしまえば新しい変数名で値が登録されるので、その後に以下の通り FormerlySerializedAs 属性を外しても値は残り続けます。
・Card.cs

using UnityEngine;

public class Card : MonoBehaviour
{
    [SerializeField]
    private string _id;
}

スクリプト更新後に一度は UnityEditor を開いて Editor 上で更新が行われたことを確認する必要がある点には注意してください。