3

Unity3D では、フィールドをパブリックとしてマークすることで、エディター内でフィールドにアクセスできるようにすることができます。これにより、ハードコーディングする代わりに GUI でフィールドの変数を割り当てることができます。たとえば、この C# コードは、開発中に手動で編集できる「速度」フィールドを表示します。変更しないままにしておくと、デフォルトで 10 になります。

public class Example : MonoBehaviour {
    public float speed = 10.0F; 
}

自動プロパティを使用してF#でこれを試しました:

type Example() =
    inherit MonoBehaviour()
    member val speed = 10.f with get,set 

しかし、これは機能しません。ただし、明示的なプロパティを使用すると機能します

[<DefaultValue>] val mutable speed : float32

ただし、これには、同じ式でデフォルト値を指定できないという欠点があります。

明示的なプロパティと自動プロパティは同じものにコンパイルされますが、唯一の違いは、明示的なプロパティが常にゼロに初期化されるということではありませんか? また、F# で C# コードと同等のものを宣言するにはどうすればよいでしょうか?

4

3 に答える 3

4

「フィールド」と「プロパティ」という用語で少し大まかに遊んでいると思います。

Unity エディターはプロパティを自動的にバインドしません。提供した最初の例は F# の自動プロパティです。記録として、Unity エディター ペインでも次の C# をバインドできませんでした。

// does not bind in editor either
class Example : MonoBehavior { 
    public float speed { get; set; }
}

コードを使用し[DefaultValue]てコンストラクターで初期化するか、タグ付けされた let バインドされたプライベート フィールドを使用し[SerializeField]て独自のプロパティ ラッパーを作成する必要があります。

type Example () = 
    [<SerializeField>]
    let mutable _speed = 10f
    member this.speed 
        with get () = _speed 
        and set val = _speed <- val
于 2013-11-07T20:05:17.663 に答える
1

これを実装する別の方法で[<DefaultValue>]、命令的な初期化を回避するには、次のようにします (最初の行にデフォルト コンストラクターがないことに注意してください)。

type Example =
    val mutable public speed : float32
    new() = { speed = 10.0f }
于 2013-11-09T17:52:16.547 に答える