在Unity3D中,我们可以通过将其标记为公共内容来在编辑器中访问字段。然后,这允许在GUI中分配字段的变量,而不是对其进行硬编码。例如,此C#代码将显示可在开发期间手动编辑的“速度”字段。如果保持不变,它将默认为10:
public class Example : MonoBehaviour {
public float speed = 10.0F;
}
我尝试使用automatic properties在F#中执行此操作:
type Example() =
inherit MonoBehaviour()
member val speed = 10.f with get,set
但这不起作用。但是,如果我使用explicit properties
,它确实有效[<DefaultValue>] val mutable speed : float32
但这样做的缺点是无法在同一个表达式中指定默认值。
是不是显式和自动属性编译成同一个东西,唯一的区别是显式属性总是初始化为零?如何在F#中声明等效的C#代码?
答案 0 :(得分:4)
我认为你混淆了两个不同的概念:显式字段和自动属性。虽然访问/分配在语法上是相似的,但是在引擎盖下,属性更像是方法而不是字段。你的C#的F#等价物是:
type Example() as this =
[<DefaultValue>] val mutable public speed: float32;
do this.speed <- 10.0f
答案 1 :(得分:4)
我认为你正在玩loosely with the terms "field" and "property"。
The Unity editor doesn't bind properties automatically,您提供的第一个示例是F#的自动属性。对于记录,您无法在Unity编辑器窗格中绑定以下C#:
// does not bind in editor either
class Example : MonoBehavior {
public float speed { get; set; }
}
您必须将代码与[DefaultValue]
一起使用,并在构造函数中将其初始化,或者使用标记为[SerializeField]
的自定义私有字段并编写您自己的属性包装器:
type Example () =
[<SerializeField>]
let mutable _speed = 10f
member this.speed
with get () = _speed
and set val = _speed <- val
答案 2 :(得分:1)
实现此目的的另一种方法是避免[<DefaultValue>]
和命令式初始化,如下所示(注意第一行没有默认构造函数):
type Example =
val mutable public speed : float32
new() = { speed = 10.0f }