为什么在 Unity 检查器中可以看到 auto 属性,但有条件就可以看到

问题描述 投票:0回答:4

当我创建此类并使用此自定义类打开列表时,可以在检查器中看到具有 FullName 的列表,但不能看到具有 Age 的列表。我想知道为什么?由于 Age 是公共财产,因此应该将其视为公共获取和设置。

[Serializable]
        public class YoungPerson
        {
            public string FullName;
            public string fullname
            {
                get { return FullName;}
                set { FullName = value; }
            }
            public int Age { get; set; }
    
            public YoungPerson(string fullName, int age)
            {
                this.FullName = fullName;
                this.Age = age;
            }
        }

结果 enter image description here

c# list unity-game-engine serialization collections
4个回答
5
投票

因为您在检查器中看到的不是属性

public string fullname { ... }
而是序列化的 

字段

public string FullName;
您已经可以在命名中看到 - 

fullname

 将显示为 
Fullname
,而不是按照 
Full Name
;)
Unity 的序列化器默认情况下不会序列化属性 - 请参阅
脚本序列化

->

ObjectNames.NicifyVariableName

您可以添加支持字段实现,就像您为名称所做的那样,例如


Serialization of properties

或者 - 正如
这个答案
已经提到的那样 - 通过强制序列化属性(不幸的是,无论出于何种原因,都没有记录)

// In that case I would always rather go for private // anything else is just confusing / why would you use the property // when you can anyway read/write the field directly [SerializeField] private int age; public int Age { get => age; set => age = value; }

正如另一个答案也提到的那样,这有一些问题(例如,参见
this thread
) - 最重要的是,对于编辑器脚本来说,隐式生成的序列化字段称为

[field: SerializeField] public int Age { get; set; } (包括<PROPERTY_NAME>k__BackingField

<

Unity 编辑器不在检查器中显示属性,您可以在

0
投票
字段上看到,但看不到

public string FullName

 属性。为 Age 建立公共字段,以便在检查员中看到这一点

Unity 无法序列化属性,这在

0
投票
中提到过。

正如其他人提到的,Unity 并不正式支持序列化属性。 但这

0
投票
可能的。

这应该可以正常工作:

public string fullName

但是,它仍然有一些怪癖,如
here
所述。您必须自己判断使用它是否是个好主意。

© www.soinside.com 2019 - 2024. All rights reserved.