在 Godot 中,使用 C#,我试图做一些我认为非常简单的事情,但我似乎无法让它按照我想要的方式工作。
我有结构体
SnapPoint
,它只存储一个Vector3
和一个string
。
public struct SnapPoint
{
public Vector3 Position;
public string Name;
}
然后我想要导出这些
SnapPoint
的列表,我可以在检查器中添加和删除它们。我在其他节点(例如 CSG 节点)上看到过类似的控件,所以我认为这是可能的。
我尝试了几种方法。有些要么不起作用,要么没有按照我想要的方式工作。
我的第一个想法是导出这些结构的列表,但这不起作用。使用 C# 集合或数组会导致构建错误(不支持导出属性的类型),而使用 godot 集合会导致 Varient 类型错误。我还尝试在结构上方添加
[System.Serializable]
,尽管这没有任何作用。我还尝试从结构更改为类,但这也没有帮助。
因此,我考虑使用资源。我创建了一个
SnapPoint
资源并导出了该资源类型。这可行......但意味着我必须为我拥有的每个快照点创建一个新资源,这有点痛苦。
我考虑用自定义检查器编写一个自定义插件,这种方法看起来可以得到我想要的东西,但对于像这样简单的东西来说似乎过于冗长。也许这并不简单,但它似乎确实应该在我的脑海中。我很好这样做,我只是想看看在我走这条路之前是否有人知道更好的方法。
那么,最终是否有一种简单的方法来获得我正在寻找的功能,或者这是 Godot 检查器的限制?或者我从根本上错过了一些东西?我来自 Unity,在他们的检查员中,这个任务是微不足道的。
正如您所发现的,您可以导出扩展
Resource
的自定义类的数组。
目前还没有办法让 Inspector 使用
struct
类型。
让我轻松使用自定义资源数组的一种方法是让脚本在编辑器中运行(即使用
[Tool]
),并为导出的属性定义一个 setter,它将任何 null
替换为一个新实例。这样,当您向检查器中的数组添加新元素时,setter 将创建自定义资源类的新实例来填充数组中的新槽位。