Как создать единство 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 ответа:
В коде 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() = ()