在Unity中,我能否在检视面板中公开C# *属性*?

14

通常情况下,脚本是这样编写的,以便在检查器中公开字段; 有没有办法改用属性呢?

// instead of this
public GameObject wrongBall;

// is there some way to do this (to trigger an event in the setter, for instance)
// and have it show up in the inspector window?
public GameObject WrongBallProperty
{
    get;
    set;
}

1
仍然没有为这个提供支持,即使经过了如此多的版本,真是让人难以置信。 - Ray
@RayKoopa,问题在于序列化。对于字段进行序列化比属性更容易,而且不会出现任何问题。 - Scott Chamberlain
2个回答

41

3
这个回答被低估了 :) - Hazel へいぜる
2
@Tacoタコス 非常感谢,很高兴能帮上忙 :) - Dan
2
我担心这个技术上是正确的,但并不是很有帮助。它适用于 { get; set; },这本质上是一个普通字段的花哨语法,但是一旦 setter 附加了一些实际逻辑(正如 OP 在评论中暗示的那样),[field: ...] 属性就无法编译。 - Norbert Nemec
@Dan,就我个人而言,我认为没有什么可以阻止你这样做,但是如果我想让我的属性在设置时执行某些操作,那么Unity能够支持这一点会很好。 - user3915050
@RWolfe 感谢您的评论。我想我最初误解了Norbert的评论,并没有考虑到set/get函数中的额外逻辑。我认为您可以使用自定义编辑器来显示属性。我尝试了一下,但是实现起来并不是很简单,而且我没有进展多少。然而,至少有一个资产承诺提供此功能。不幸的是,它不是免费的,所以我无法测试其功能Odin Inspector - Dan
显示剩余7条评论

5

有点像。

你不能直接在检视器中使用属性,但是你可以创建一个带有支持字段的属性:

public GameObject WrongBallProperty {
    get { return this.wrongBallProperty; }
    set { //do whatever }
}

[SerializeField]
private gameObject wrongBallProperty;

这将在检查器中显示wrongBallProperty,并允许您在getset中执行所需的逻辑。有关更多信息,请参见SerializeField参考资料

6
请注意,序列化后备字段将无法调用属性设置器,如果您在检查器中更改了该字段。这是因为序列化的是字段而不是属性。 - jayvatar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接