Version: 2017.3

SerializeField

class in UnityEngine

切换到手册

描述

强制 Unity 对私有字段进行序列化。

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 将对所有脚本组件进行序列化,重新加载新程序集, 并从序列化的版本重新创建脚本组件。 使用 .NET 的序列化功能时不会发生此序列化,但使用 内部 Unity 功能时会发生。

使用的序列化系统可执行以下操作:

- 可序列化(可序列化类型的)公共非静态字段
- 可序列化标记有 [SerializeField] 属性的非公共非静态字段。
- 不能序列化静态字段。
- 不能序列化属性。


仅在字段为 Unity 可序列化的类型时,该字段才会进行序列化:

可序列化的类型为:

- 继承 UnityEngine.Object 的所有类,例如 GameObject、Component、MonoBehaviour、Texture2D、AnimationClip。
- 所有基本数据类型,例如 int、string、float、bool。
- 某些内置类型,例如 Vector2、Vector3、Vector4、Quaternion、Matrix4x4、Color、Rect、LayerMask。
- 可序列化类型数组
- 可序列化类型列表)
- 枚举
- 结构

注意:如果在一个列表(或数组)中将一个元素放置两次,当此 列表被序列化时,将获得该元素的两个副本,而不是获得两次新列表中的一个副本。

提示:Unity 不会序列化 Dictionary,但您可以为键存储一个 List<> 和为值存储一个 List<>,然后在 Awake() 上将它们组合在非序列化字典中。这不能解决您需要修改字典 并将其“保存”回时出现的问题,但在许多其他情况下,这是一个方便的技巧。

对于 UnityScript 用户:c# 中的字段在 UnityScript 中是一个脚本变量,并且 [SerializeField] 变为 @SerializeField。类上的 [Serializable] 在 UnityScript 中变为 @script Serializable。

using UnityEngine;

public class SomePerson : MonoBehaviour { //This field gets serialized because it is public. public string firstName = "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 Start() { if (hasHealthPotion) Debug.Log("Person's first name: " + firstName + " Person's age: " + age); } }