Unity が private フィールドを強制的にシリアライズします。
これはほとんどのケースで使用する必要がありません。
Unity がスクリプトをシリアライズする際、public フィールドのみシリアライズします。
それに加えて Unity で private フィールドをシリアライズさせたい場合、
フィールドに SerializeField 属性を追加できます。
Unity は全てのスクリプト コンポーネントをシリアライズし、新規のアセンブリをリロードして、
スクリプト コンポーネントをシリアライズしたバージョンから再作成します。
このシリアライズは .NET のシリアライズ機能により実施されず
Unity 内部の機能で行なわれます。
シリアライズのシステムは次の条件があります:
- public で static でないフィールド(シリアライズ可能な型)をシリアライズできる
- public でなく static でないフィールドに [SerializeField] 属性をつけてをシリアライズできる
- static フィールドはシリアライズできない
- プロパティはシリアライズできない
Unity がシリアライズ可能な型である場合のみフィールドはシリアライズされます:
シリアライズ可能な型:
- UnityEngine.Object から派生する全てのクラス, 例えば GameObject, Component, MonoBehaviour, Texture2D, AnimationClip 等々
- 全ての基本データ型、例えば int, string, float, bool
- いくつかのビルトインの型、例えば Vector2, Vector3, Vector4, Quaternion, Matrix4x4, Color, Rect, LayerMask
- シリアライズ可能な型の配列
- シリアライズ可能な型のリスト(Unity2.6 以降)
- 列挙体
注意: リスト(または配列)にひとつの要素を二回入れた場合、
リストがシリアライズされると、新規のリストの中に二回入るのででのではなく、その要素が二つできます。
ヒント: Unity は Dictionary をシリアライズしませんが、しかし キーのための List<>
および値のための List<> を格納し、Awake() 時にシリアライズされてない Dictionary で
結びつけることが出来ます。これでも Dictionary を修正したものを保存する解決策とはならないものの、
多くの場合には便利な方法です。
UnityScript のユーザ向け: C# のフィールドは UnityScript ではスクリプト変数であり、
[SerializeField] は @SerializeField と記載する必要があります。クラス上の [Serializable] は UnityScript では @script Serializableとなります。
// Javascript example //This field gets serialized because it is public. var name = "John"; //This field does not get serialized because it is private. private var age = 40; //This field gets serialized even though it is private //because it has the SerializeField attribute applied. @SerializeField private var hasHealthPotion:boolean = true; function Update () { }
//C# example using UnityEngine; public class SomePerson : MonoBehaviour { //This field gets serialized because it is public. public string name = "John"; //This field does not get serialized because it is private. private int age = 40; //This field gets serialized even though it is private //because it has the SerializeField attribute applied. [SerializeField] private bool hasHealthPotion = true; void Update () { } }