Unity が private フィールドを強制的にシリアライズします。
これはほとんどのケースで使用する必要がありません。
Unity がスクリプトをシリアライズする際、public フィールドのみシリアライズします。
それに加えて Unity で private フィールドをシリアライズさせたい場合、
フィールドに SerializeField 属性を追加できます。
Unity はすべてのスクリプトコンポーネントをシリアライズし、新規のアセンブリをリロードして、
スクリプトコンポーネントをシリアライズしたバージョンから再作成します。
このシリアライズは .NET のシリアライズ機能により実施されず
Unity 内部の機能で行なわれます。
シリアライズのシステムは次の条件があります:
- CAN serialize public nonstatic fields (of serializable types)
- CAN serialize nonpublic nonstatic fields marked with the [SerializeField] attribute.
- CANNOT serialize static fields.
- CANNOT serialize properties.
Unity がシリアライズ可能な型である場合のみフィールドはシリアライズされます:
シリアライズ可能な型:
- All classes inheriting from UnityEngine.Object, for example GameObject, Component, MonoBehaviour, Texture2D, AnimationClip.
- All basic data types like int, string, float, bool.
- Some built-in types like Vector2, Vector3, Vector4, Quaternion, Matrix4x4, Color, Rect, LayerMask.
- Arrays of a serializable type
- List of a serializable type)
- Enums
- 構造体
注意: リスト(または配列)にひとつの要素を二回入れた場合、
リストがシリアライズされると、新規のリストの中に二回入るのででのではなく、その要素が二つできます。
ヒント: 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 () { }
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 () { } }