我有以下代码,由于某种原因,当我运行它时,日志没有显示在控制台中(我还附加了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 中的值。
解决了。问题似乎在于,我在 UIDocument 组件在场景中生成后立即将其禁用,目的是隐藏 UI。我尝试更改为禁用 GameObject,但似乎即使这样也会破坏 UI(如果有人知道为什么会发生这种情况,或者如果是一个错误,请告诉我)。隐藏 UI 的最佳方法似乎是更改 UI 文档根元素的可见性。