Skip to main content
 首页 » 资源教程 » Unity3D教程

Unity3D的SerializeField 序列化域

2016年09月02日 21:41:551560

SerializeField 序列化域

Inherits from Attribute

Force Unity to serialize a private field.


You will almost never need this. When Unity serializes your scripts, it will only serialize public fields. If in addition to that you also want Unity to serialize one of your private fields you can add the SerializeField attribute to the field.


Unity will serialize all your script components, reload the new assemblies, and recreate your script components from the serialized verions. This serialization does not happen with .NET's serialization functionality, but with an internal Unity one.


The serialization system used can do the following:


- CAN serialize public nonstatic fields (of serializable types) 
- 可以序列化公有的非静态域(序列化类型的)

- CAN serialize nonpublic nonstatic fields marked with the [SerializeField] attribute.
- 可以序列化非公有非静态域用[SerializeField]属性标记。

- CANNOT serialize static fields. 
- 不可以序列化静态域。

- CANNOT serialize properties. 
- 不可以序列化属性。

Your field will only serialize if it is of a type that Unity can serialize:


Serializable types are: 

- All classed inheriting from UnityEngine.Object, for example Gameobject, Commponent, 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 
- 所有继承自UnityEngine.Object的类,例如GameObject,Component,MonoBehaviour,Texture2D,AnimationClip..- 所有基本类型像int,string,float,bool.- 一些内建类型像Vector2,Vector3,Vector4,Quaternion,Matrix4x4,Color,Rect,Layermask..- 一个序列化类型的Array(数组)

- List of a serializable type (new in Unity2.6) 
- 一个序列化类型的列表(新的在Unity2.6)

- Enums 
- 枚举。

Headsup 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.


Hint: Unity won't serialize Dictionary, however you could store a Listf<> or 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.


For UnityScript users: Fields in c# is a script variable in UnityScript, and [SerializeField] becomes @SerializeField. [Serializable] on a class becomes @script Serializable in a UnityScript

给UnityScript用户:C#中的域在UnityScript中是一个脚本变量,并且[SerializeField]变成@SerializeField。[Serializable] 在一个类上变成@script Serializable在一个UnityScript。

// 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.
private var hasHealthPotion:boolean = true;

function Update () {
//C# exampleusing 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.
	private bool hasHealthPotion = true;

	void Update () {