5

我有一个输入字段,其中包含一些关于选择和取消选择的重要处理程序。有它的设置:

在此处输入图像描述

没有其他任何改变;我不包括这些处理程序,因为没有它们问题是可重现的。


期待

当我按 Enter 时,输入字段确认输入,取消选择并调用事件。这同样适用于 Esc 键,只是应该取消输入。

现实

当我按 Enter 时,输入字段似乎保持选中状态,未调用事件处理程序,但我无法输入文本,如果再次按 Enter,输入字段似乎再次激活(它选择所有文本并且我有On焦点 -启用全选)。Esc 键也有同样的问题。


我发现On End Edit事件在 Enter 按下时被调用,但是如何取消选择输入字段?它应该调用On Deselect事件并且不应在 Enter 时再次激活。我试着打电话DeactivateInputField,它没有用。

4

1 回答 1

3

新答案,解决了问题,请参阅评论以进行澄清:

TextMesh Pro 使用 Unity 内置的EventSystem. 出于这个原因,取消选择等是通过以下方式完成的EventSystem

EventSystem.current.SetSelectedGameObject(null);

因此“OnDeselect”事件是通过EventSystem的选择管理调用的,而不是 TextMesh Pro。

当您使用事件系统选择新的东西时,您还需要确保当前没有以锁定的方式选择其他东西。有一个保护/锁定EventSystem,它可以防止在这种情况下设置没有选择的对象,但它会打印一个错误:

在已经选择对象时尝试选择。
UnityEngine.EventSystems.EventSystem:SetSelectedGameObject(GameObject)

您应该检查它是否已经在选择另一个对象:

var eventSystem = EventSystem.current;
if (!eventSystem.alreadySelecting) eventSystem.SetSelectedGameObject (null);

他们讨论事件系统的“锁定”部分的其他帖子。




旧答案,没有解决问题,但有助于理解下面的评论线索:

我的理解

我没有使用 TextMesh Pro 的经验,所以我不能肯定地说当你按下 Enter 键时事件的循环是怎样的。

但是,您解释说它至少调用“On End Edit”方法。如果我是你,我会查看他们的文档并测试它调用的其他方法。因为这应该可以帮助您更好地了解正在发生的事情。调用了哪些方法等等。

该怎么办?

TextMesh Pro 文档显示了各种可用的方法,适用于其生命周期/事件的各个部分。

文档

其中之一是

public void DeactivateInputField()

另一个是

protected override void DoStateTransition(SelectionState state, bool instant)

我怀疑其中之一可用于按您的意图停用该字段。如果您在正确的时间手动调用它们。

如何检查当前处理事件的锁定状态的示例,可以在此链接中看到:https ://answers.unity.com/questions/1315276/event-system-setselectedgameobject-error-but-code.html


文档截图

图片来自文档

于 2019-05-15T09:29:43.543 回答