2016-11-20 3 views
2

私はUnity 3dでカメラに接続されているF#スクリプトにいくつかのUI要素を作成しようとしています。私はC#でこれを行う方法を知っていますが、私はそれをどのようにして行うのかはよくわかりませんF#。ここでは、今F#スクリプトにUnity 3D UIテキスト要素を作成するにはどうすればよいですか?

using UnityEngine; 
using UnityEngine.UI; 

public class CameraController : MonoBehaviour { 
    public Text uiText; 

    void Start() 
    { 
     uiText.text = "Hello world!"; 
    } 

    void Update() 
    { 
    } 
} 

F#コードです:

は、ここで簡単なC#例です。テキスト要素を作成しようとしたときにコンパイラエラーが表示されるというコメントを追加しました。This type has no accessible constructors

namespace GameLogic 

open UnityEngine 
open UnityEngine.UI 

type CameraController() = 
    inherit MonoBehaviour() 

    member this.uiText = Text // Compiler Error: This type has no accessible constructors 
    member this.Start() = 
     let uiText = Text // Compiler Error: This Type has no accessible constructors 
     () 

    member this.Update() = 
     () 

F#が暗黙のうちにユニティのTextオブジェクトのコンストラクタメソッドを呼び出すように思えます。

したがって、F#スクリプトでuiテキスト要素を作成するにはどうすればよいですか?すべての助けをありがとう。

あなたのC#コードでクルト

答えて

2

uiTextメンバーは、C#のデフォルトである、nullで初期化取得されています。

member this.uiText: Text = null 

これはコンパイルしますが、あなたが希望する結果が得られません:F#では、何の「デフォルト」が存在しない、あなたは明示的に初期値を記述する必要があります。この構文は、常にnullを返す読み取り専用プロパティを作成します。オーダー初期値でプロパティを読み取り/書き込みを作成するには、あなたがmember valを使用する必要があります。

member val uiText: Text = null with get, set 

そこに「取得、設定」の部分はあなたがプロパティが読める書き込み可能にすることを明確化するのに役立ちます。それがなければ(デフォルトで)、プロパティは読み取り専用になります。

プロパティがF#でどのように機能するかについては、see MSDNを参照してください。

+0

この優れた答えをありがとう。 –

0

変更可能なletバインディングを使用して終了しました。これは、タイプがTextであり、その初期値がnullであることを指定しています。その後、SerializeField属性を追加して、UI Text要素をUnityエディタにスクリプトに関連付けました。

以下は簡単な例です。

namespace GameLogic 

open UnityEngine 
open UnityEngine.UI 

type CameraController() = 
    inherit MonoBehaviour() 

    [<SerializeField>] 
    let mutable uiText : Text = null 

    member this.Start() = 
     uiText.text <- "hello world!" 
     () 

    member this.Update() = 
     () 
関連する問題