Как создать единство 3D текстовый элемент пользовательского интерфейса в скрипт F#?


Я пытаюсь создать некоторые элементы пользовательского интерфейса в моем скрипте F#, который прикреплен к камере в Unity 3d. я знаю, как это сделать в C#, но я не совсем уверен, как это сделать в F#.

Вот простой пример 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#? Спасибо за любую помощь.

Курт

2 2

2 ответа:

В коде C# элемент uiText инициализируется с помощью null, что является значением по умолчанию для C#. В F# нет "default", вы должны написать начальное значение явно:

member this.uiText: Text = null

Это будет компилироваться, но не даст вам желаемого результата. Этот синтаксис создаст свойство только для чтения, которое всегда возвращает null. Чтобы создать свойство чтения / записи с начальным значением, необходимо использовать member val:

member val uiText: Text = null with get, set

Часть "получить, установить" там служит для разъяснения того, что вы хотите, чтобы свойство было читаемым и доступным для записи. Без него (по умолчанию) свойство будет доступно только для чтения.

Полное описание того, как свойства работают в F#, смотрите в MSDN.

В итоге я использовал изменяемую привязку 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() =
        ()