zoukankan      html  css  js  c++  java
  • Unity编辑器环境在Inspector面板中显示变量

    Serialize功能
    Unity3D 中提供了非常方便的功能可以帮助用户将 成员变量 在Inspector中显示,并且定义Serialize关系。

    简单的说,在没有自定义Inspector的情况下所有显示在Inspector 中的属性都同时具有Serialize功能。

    换句话说,就是你在Inspector看到什么,保存游戏的时候,这些值就会被保存成二进制文件。

    本文说说可被Serialize的变量的定义方法

    1. public 变量
    在没有加入任何Attribute的前提下,public变量是默认被视为可以被Serialize的。所以public声明的变量在Inspector面板中是可见的。
    public int MaxExp;

    2. [SerializeField] Attribute
    强制unity去序列化一个私有域

    这是一个内部的unity序列化功能,有时候我们需要Serialize一个private或者protected的属性,这个时候可以使用[SerializeField]这个Attribute:

    [SerializeField]
    protected int foobar = 0;
    注意: 这样定义出的成员变量也是会在Inspector中显示出来。

    在Unity最新的UI系统中,UI属性上方全部添加[SerializeField] ,如下所示

    [SerializeField]
    private int ID;


    3. 单独的class或struct
    Serializable是.Net自带的序列化

    有时候我们会自定义一些单独的class/struct, 由于这些类并没有从 MonoBehavior 派生所以默认并不被Unity3D识别为可以Serialize的结构。自然也就不会在Inspector中显示。我们可以通过添加 [System.Serializable]这个Attribute使Unity3D检测并注册这些类为可Serialize的类型。具体做法如下:

    [System.Serializable]
    public class FooBar {
    public int foo = 5;
    public int bar = 10;
    }
    注意:Serializable只可以对class,struct,enum,delegate进行序列化,不可以对属性序列化

    4. ScriptableObject
    ScriptableObject 类型经常用于存储一些unity3d本身不可以打包的一些object,比如字符串,一些类对象等。用这个类型的子类型,则可以用BuildPipeline打包成assetbundle包供后续使用,非常方便,具体请参考 [cb]ScriptableObject 序列化

    NonSerialize的变量的定义方法

    4.1. protected, private, internal 变量
    默认情况下,protected, private, internal变量将不会被serialize.

    4.2. [System.NonSerialized] Attribute
    有时候我们需要定义一些public变量方便操作,但是又不希望这些变量保留。这个时候可以利用[System.NonSerialized]来完成这个操作:

    [System.NonSerialized] public float foobar = 1.0f;

    4.3. readonly, const, static 修饰符
    如果变量加入了readonly, const, static等修饰符,无论他的serialize设置如何,都将不会进行serialize

    4.4. Dictionary

    关于Dictionary在Inspector面板的显示一直是个难题,这里推荐大家用一款插件来解决

    Odin - Inspector and Serializer 2 游戏序列化插件

    只需要脚本从继承MonoBehaviour改为 SerializedMonoBehaviour 即可,

    显示效果非常的完美

  • 相关阅读:
    什么是守护线程?
    如何优雅地停止一个线程?
    如何创建、启动 Java 线程?
    什么是线程?什么是进程?为什么要有线程?有什么关系与区别?
    并行是什么意思?与并发的区别是什么?
    并发编程的缺点?
    BZOJ_3058_四叶草魔杖_kruscal+状压DP
    BZOJ_3476_[Usaco2014 Mar]The Lazy Cow_扫描线+切比雪夫距离
    BZOJ_1511_[POI2006]OKR-Periods of Words_KMP
    BZOJ_3479_[Usaco2014 Mar]Watering the Fields_Prim
  • 原文地址:https://www.cnblogs.com/jiahuafu/p/11162574.html
Copyright © 2011-2022 走看看