Unity中HideInInspector和SerializeField
在Unity开发中,HideInInspector 和 SerializeField 是两个非常实用的特性,它们主要用于控制变量的序列化和在Inspector面板中的显示情况。下面我们来详细了解一下这两个特性。
序列化的基本概念
在Unity里,会自动对Public变量进行序列化。序列化指的是,当再次加载Unity项目时,这些被序列化的变量会保留之前赋的值,无需再次手动赋值,因为它们已经被保存下来了。而在Inspector面板上显示的值,需要满足已经被序列化且没有使用 HideInInspector 标记这两个条件。
HideInInspector 特性
[HideInInspector] 特性的作用是将原本会显示在Inspector面板上的序列化值隐藏起来。
SerializeField 特性
[SerializeField] 特性可以让原本不会被序列化的私有变量和保护变量实现序列化。这样,在下次加载时,这些变量会保留上次赋的值。
不同场景下的使用示例
公有序列化变量
希望在面板中看到变量
如果变量 a 是公有的序列化变量,并且你希望在Inspector面板中看到它,可以这样声明:
public int a;
不希望在面板中看到变量
若不想在面板中看到变量 a,可以使用 [HideInInspector] 特性:
[HideInInspector] public int a;
这样,变量 a 可以在程序中通过代码进行赋值,但不会在Inspector面板中显示,也就无法手动设置其值。
私有序列化变量
希望在面板中读取并保存
如果变量 a 是私有的序列化变量,并且你希望在Inspector面板中读取并保存它的值,可以使用 [SerializeField] 特性:
[SerializeField] private int a;
希望在面板中读取但不保存
若想在面板中读取变量 a 的值,但不保存它,可以结合使用 [HideInInspector] 和 [SerializeField] 特性,并通过属性来访问该变量:
[HideInInspector][SerializeField]
private int a;
public int b
{
get { return a; }
}
然后在Editor脚本中显示该值:
EditorGUILayout.LabelField("value", game.B.ToString());
不想在面板中做任何操作但在程序中赋值
如果变量 a 是私有序列化变量,你既不想在面板中看到它,也不想在面板中对其进行写入操作,但希望在程序中给它赋值,可以这样做:
[HideInInspector][SerializeField]
private int a;
public int b
{
get { return a; }
set { a = value; }
}
通过合理使用 HideInInspector 和 SerializeField 特性,我们可以更灵活地控制变量的序列化和在Inspector面板中的显示,从而提高开发效率。