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