zoukankan      html  css  js  c++  java
  • Unity3D中的Attribute详解(四)

    本篇我们将逐一讲解Unity中经常使用的Attribute(Unity对应的文档版本为2018.1b)。

    首先是Serializable,SerializeField以及NonSerialized,HideInInspector。

    unity中默认public的变量都是可以序列化的,如:

    为变量y加上可序列化的标识

    可以看到离这个Attribute最近的私有变量被成功序列化。

    我们去查看官方文档,是这么写的:

    SerializeField将会强制去序列化一个私有域,但你将永远用不到它。这个序列化与.net的序列化功能没关系,是Unity内部的一个过程。它可以序列化共有的非静态域(可被序列化的类型),可以序列化非公有非静态域,不能序列化静态域,不能序列化属性。可被序列化的类型可以是所有继承自UnityEngine.Object的类型;所有基础类型,如int, string, float, bool;枚举,结构体,可被序列化对象的Array或者List。

     需要注意的是,如果你放一个元素在List或者Array里放了两次,最终反序列化后,你将得到两份完全不同的拷贝,而不是原来的同一个元素。此外,字典不支持被序列化,你可以用List单独保存key和value,在Awake的时候,连接两者。

    查看SerializeField从元代码,我们发现它可以被放到任何的字段上。修改代码如下:

    跟没加一样,因为这是要去序列化SerializeTest这个类,而monobehaviour本身就可以被序列化。

    所以我们最后的总结就是[SerializeField]可以将私有变量显示在Inspector面板上,但你一般用不到它

    继续修改我们的代码,如下:

    虽然innerInst是public的,但是并没有显示在属性面板上,因为Inner这个类本身并不能被序列化。

    如果我们在类声明的上面加上[SerializeField],会发现一点卵用也没有,这个Attribute并不能把类本身序列化。

    这里就需要引入一个新的Attribute:[Serializable]

    修改上述代码就可以看到咯:

    我们查看Serializable的代码,发现它只能附着在类,结构体,枚举和委托上面。并且不能继承,不能多次使用。

    这样写会在unity里报错。

    很容易得出结论,Serializable是System命名下的一个Attribute,能把非序列化的类,结构体,枚举或者委托进行序列化,而SerializeField则是Unity自己定义的Attribute,用以标识是否在Inspector显示私有对象,这个私有对象必须可以被序列化。

    还有一个[NonSerialized],虽然同样是System命名空间的属性,但更像是SerializeField的反义词。它的作用对象只能是Field字段。修改代码如下:

    运行结果:

    我们把NonSerialized改为[HideInInspector]会发现同样的结果,两者看起来完全一样。那他们内在的区别呢?

    我们新建一个类,代码如下:

    在同一个GameObject上添加两次Test,可以看到:

    运行的时候:

    然后我们修改Inspector面板上的其中一个字段,如下:

    接下来我们修改代码如下:

    再次运行程序,可以看到:

    在面上赋予的值没有改变。我们把HideInInspector去掉,可以看到:

    值依然存在。接着修改代码如下:

    再次运行程序:

    这次看到区别了,我们的值不见了。

    把NonSerialized去掉后:

    现在我们能看到这两者的差距了。总的来说,HideInInspector只管隐藏属性在Inspector面板上的显示与否,不会对序列化产生任何影响。而NonSerialized会使得当前变量直接变成不能序列化的对象,我们序列化后存储的值也丢失了。而不能序列化的对象在Inspector上当然是无法显示的。这个区别各位需要注意一下。

  • 相关阅读:
    git删除目录,且保留本地的
    gitpush 免密码
    git常用操作
    ubuntu安装Nodejs
    ubuntu如何配置samba
    用AI将png转成svg做字符图标教程
    windows server 2012设置远程连接断开后自动注销
    windows 2012执行计划任务错误:操作员或系统管理员拒绝了请求(0x800710E0)
    删除节点
    代理 XP”组件已作为此服务器安全配置的一部分被关闭。系统管理员可以使用 sp_configure 来启用“代理 XP”。
  • 原文地址:https://www.cnblogs.com/cangxw/p/8269582.html
Copyright © 2011-2022 走看看