When Unity serializes your scripts, it only serializes public fields. If you also want Unity to serialize your private fields you can add the SerializeField attribute to those fields.



Unity serializes all your script components, reloads the new assemblies, and recreates your script components from the serialized versions. This serialization is done with an internal Unity serialization system; not with .NET's serialization functionality.



The serialization system can do the following:



- CAN serialize public non-static fields (of serializable types)

- CAN serialize nonpublic non-static fields marked with the SerializeField attribute.

- CANNOT serialize static fields.

- CANNOT serialize properties.





Serializable types



Unity can serialize fields of the following types:



- All classes inheriting from UnityEngine.Object, for example GameObject, Component, MonoBehaviour, Texture2D, AnimationClip.

- All basic data types, such as int, string, float, bool.

- Some built-in types, such as Vector2, Vector3, Vector4, Quaternion, Matrix4x4, Color, Rect, LayerMask.

- Arrays of a serializable type

- Lists of a serializable type

- Enums

- Structs



For more information on serialization, see Script Serialization.



Note: If you put one element in a list (or array) twice, when the list gets serialized, you'll get two copies of that element, instead of one copy being in the new list twice.



Note: If you want to serialize a custom Struct field, you must give the Struct the [System.Serializable] attribute.



Hint: Unity won't serialize Dictionary, however you could store a List<> for keys and a List<> for values, and sew them up in a non serialized dictionary on Awake(). This doesn't solve the problem of when you want to modify the dictionary and have it "saved" back, but it is a handy trick in a lot of other cases.