Unity中[SerializeField]和[HideInInspector]的使用

本文分享Unity中[SerializeField]和[HideInInspector]的使用

今天给大家分享几个特性的使用.

在Unity的开发中, 我们经常会使用到序列化技术. 那么什么是序列化呢?

序列化(Serialize)

序列化最质朴的解释就是我们按照一定的规则将数据组织和存储或者传输, 然后在某些时候或者某些点按照相同的规则将其解析出来.

现在有很多的序列化手段, 如常见的Xml, Json, Protobuf等, 相信很多同学都接触过.

这些手段或者说规则, 各有各的优势, 比如有的占用空间小, 便于网络传输, 有的格式清晰, 便于理解等等.

在C#中, 我们甚至可以将一个类对象给序列化, 然后进行持久化(也就是存储起来), 最后使用的时候反序列化出原来的对象.

大家知道, Unity中的Prefab是一种资源(Asset), 在内部其实也是使用序列化进行数据组织和存储.

将来有机会可以给大家再详细分享下Prefab的序列化结构, 这不是今天的重点.

Mono脚本组件的序列化

Unity会在内部对所有Mono脚本的组件进行序列化, 并在重启时动序列化数据中重新反序列化出组件.

默认情况下, 组件的公共字段(public field)会出现在Editor的Inspector面板中, 我们在面板上对字段的修改会被序列化存储起来, 避免在重载时丢失.

但是其它字段(非public, 静态等)或者属性(attribute)不会出现在Inspector面板, 也不会被序列化.

Unity提供了[SerializeField]特性对非静态的非公有字段进行序列化的手段, 只要在这一类字段上使用这个特性, 那么这个字段就会出现在Inspector面板并被序列化, 但依然是非公有的. 并且Unity会对出现的Inspector面板上的字段做一些名称适配, 比如去掉"m_", “_”, 小写变大写, 数字加空格等等.

如下所示:

public string name1;

[SerializeField]
protected string m_name2;

[SerializeField]
private string _name3;

[HideInInspector]
[NonSerialized]
public string name4;

// 相当于[HideInInspector]和[NonSerialized]一起使用
public string name { set; get; }

序列化字段显示到Inspector面板

当然, 其它的一些值, 比如静态字段, 属性等依然是不能进行序列化的.

Unity也提供了对公共字段的隐藏和非序列化特性[HideInInspector]和[NonSerialized].

但是大部分情况下我们可以用属性来代替这两个功能对字段进行限制.

最后在给大家总结下:

  • 默认情况下, 公有的字段是可以显示在面板上并且被序列化的.
  • 非静态非公有字段, 可以使用[SerializeField]特性在保持访问权限的情况下进行面板显示和序列化.
  • 静态的字段, 静态和非静态的属性, 是不能被面板显示和序列化的, 即使使用[SerializeField]特性.
  • 可以使用[HideInInspector]和[NonSerialized]特性对公有的字段进行面板显示和序列化控制.

好了, 今天的分享就到这里, 希望对大家有所帮助.

猜你喜欢

转载自blog.csdn.net/woodengm/article/details/117663291#comments_26998239