Unity UIToolkit TextField 事件不起作用

问题描述 投票:0回答:1

我有以下代码,由于某种原因,当我运行它时,日志没有显示在控制台中(我还附加了VS调试器,我可以确认这些方法根本没有被调用)。我可能做错了什么?我是否缺少特殊设置或 UIToolkit 事件起作用的东西?

public class Foo : MonoBehaviour
{
    void Start()
    {
        var uiDoc = gameObject.AddComponent<UIDocument>();
        uiDoc.panelSettings = Resources.Load<PanelSettings>("PanelSettings");
        uiDoc.visualTreeAsset = Resources.Load<VisualTreeAsset>("VisualTree");

        var textField = uiDoc.rootVisualElement.Q<TextField>("TextField");
        textField.SetValueWithoutNotify("");
        textField.RegisterValueChangedCallback(OnValChanged);
        textField.RegisterCallback<KeyDownEvent>(OnKeyDown);
    }

    private void OnValChanged(ChangeEvent<string> evt)
    {
        Debug.Log("Hello value changed");
    }

    private void OnKeyDown(KeyDownEvent evt)
    {
        Debug.Log("Hello key down");
    }
}

更多信息:

我知道 GameObject 在场景中并且它有一个 UIDocument 组件。我知道资源存在,并且可以找到它们并将其分配给 UIDocument。

uiDoc.rootVisualElement.Q<TextField>("TextField");
行实际上返回正确的 TextField 元素。 TextField 将
Is Delay
属性设置为
false
,因此我希望每次更改
OnValChanged
中的字符时都会调用
TextField
方法。我的项目中的 PanelSetting 对象将
Theme Style Sheet
分配给名为
UnityDefaultRuntimeTheme
的对象,并将
TextSettings
分配给在我的项目中创建的默认
TextSettings
对象。

此外,如果我将文本字段存储在类的变量中并在更新函数中记录

textField.value
。日志是空的,即使在 GameView 的 UI 中我可以看到 TextField 发生变化。

还值得一提的是,当使用附加的调试器查看时,

textField.SetValueWithoutNotify("")
行似乎会更改值,但不会更改 GameView 中的值。

c# unity-game-engine ui-toolkit
1个回答
0
投票

解决了。问题似乎在于,我在 UIDocument 组件在场景中生成后立即将其禁用,目的是隐藏 UI。我尝试更改为禁用 GameObject,但似乎即使这样也会破坏 UI(如果有人知道为什么会发生这种情况,或者如果是一个错误,请告诉我)。隐藏 UI 的最佳方法似乎是更改 UI 文档根元素的可见性。

© www.soinside.com 2019 - 2024. All rights reserved.