2016-11-20 68 views
2

我正在嘗試在我的F#腳本中創建一些UI元素,該腳本連接到Unity 3D中的相機。我知道如何在C#中執行此操作,但我不確定如何在F#中執行此操作。如何在F#腳本中創建Unity 3D UI文本元素?

下面是一個簡單C#例如:

using UnityEngine; 
using UnityEngine.UI; 

public class CameraController : MonoBehaviour { 
    public Text uiText; 

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

    void Update() 
    { 
    } 
} 

現在,這裏是我的F#代碼。我添加了一些註釋,它們顯示了我在嘗試創建文本元素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#隱式調用Unity的Text對象的構造方法。

那麼,如何在F#腳本中創建一個ui文本元素?感謝任何和所有的幫助。

庫爾特

回答

2

在C#代碼中,uiText成員越來越初始化null,這是C#的默認。在F#,不存在「默認」,你必須明確地寫初始值:

member this.uiText: Text = null 

這將編譯,但不會給你想要的結果。此語法將創建總是返回null的只讀屬性。爲了創建一個讀/寫屬性初始值,你必須使用member val

member val uiText: Text = null with get, set 

在那裏「獲取,設置」部分提供了所需的屬性是可讀的澄清寫。沒有它(默認情況下),該屬性將是隻讀的。

有關F#中屬性如何工作的完整說明,請參閱see MSDN

+0

謝謝你這個優秀的答案。 –

0

我最終使用了一個可變的let綁定,它指定它的類型爲Text,它的初始值爲null。然後,我添加了SerializeField屬性,以便將Unity編輯器中的UI Text元素與腳本相關聯。

下面是一個簡單的例子。

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() = 
     ()